Browse Source

Fix #2599 (#2601)

Atualiza layout

Corrige ordem

Centraliza htmls de impressos form

Corrige formatação

Corrige formatações e variáveis

Corrige condições

Adiciona MateriaPesquisaSimplesForm

Adiciona MateriaPesquisaSimplesView

Adiciona html de materias pdf

Adiciona pesquisa de índice de matéria

Corrige variáveis

Corrige queryset

Corrige queryset

Altera ordenação das matérias

Corrige verificação de existencia de chave no dicionário
pull/2636/head
Vinícius Cantuária 6 years ago
committed by Edward Ribeiro
parent
commit
4ec055159d
  1. 69
      sapl/materia/forms.py
  2. 6
      sapl/materia/urls.py
  3. 43
      sapl/materia/views.py
  4. 24
      sapl/norma/forms.py
  5. 31
      sapl/norma/views.py
  6. 4
      sapl/protocoloadm/views.py
  7. 7
      sapl/templates/materia/impressos/ficha.html
  8. 6
      sapl/templates/materia/impressos/ficha_seleciona.html
  9. 66
      sapl/templates/materia/impressos/impressos.html
  10. 0
      sapl/templates/materia/impressos/impressos_form.html
  11. 67
      sapl/templates/materia/impressos/materias_pdf.html
  12. 7
      sapl/templates/materia/impressos/norma.html
  13. 111
      sapl/templates/materia/impressos/normas_pdf.html

69
sapl/materia/forms.py

@ -2396,3 +2396,72 @@ class ExcluirTramitacaoEmLote(forms.Form):
form_actions(label='Excluir') form_actions(label='Excluir')
) )
) )
class MateriaPesquisaSimplesForm(forms.Form):
tipo_materia = forms.ModelChoiceField(
label=TipoMateriaLegislativa._meta.verbose_name,
queryset=TipoMateriaLegislativa.objects.all(),
required=False,
empty_label='Selecione')
data_inicial = forms.DateField(
label='Data Inicial',
required=False,
widget=forms.DateInput(format='%d/%m/%Y')
)
data_final = forms.DateField(
label='Data Final',
required=False,
widget=forms.DateInput(format='%d/%m/%Y')
)
titulo = forms.CharField(
label='Título do Relatório',
required=False,
max_length=150)
logger = logging.getLogger(__name__)
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
row1 = to_row(
[('tipo_materia', 6),
('data_inicial', 3),
('data_final', 3)])
row2 = to_row(
[('titulo', 12)])
self.helper = SaplFormHelper()
self.helper.layout = Layout(
Fieldset(
'Índice de Materias',
row1, row2,
form_actions(label='Pesquisar')
)
)
def clean(self):
super().clean()
if not self.is_valid():
return self.cleaned_data
cleaned_data = self.cleaned_data
data_inicial = cleaned_data['data_inicial']
data_final = cleaned_data['data_final']
if data_inicial or data_final:
if not (data_inicial and data_final):
self.logger.error("Caso pesquise por data, os campos de Data Inicial e "
"Data Final devem ser preenchidos obrigatoriamente")
raise ValidationError(_('Caso pesquise por data, os campos de Data Inicial e '
'Data Final devem ser preenchidos obrigatoriamente'))
elif data_inicial > data_final:
self.logger.error("Data Final ({}) menor que a Data Inicial ({}).".format(data_final, data_inicial))
raise ValidationError(_('A Data Final não pode ser menor que a Data Inicial'))
return cleaned_data

6
sapl/materia/urls.py

@ -25,7 +25,8 @@ from sapl.materia.views import (AcompanhamentoConfirmarView,
TipoProposicaoCrud, TramitacaoCrud, TipoProposicaoCrud, TramitacaoCrud,
TramitacaoEmLoteView, UnidadeTramitacaoCrud, TramitacaoEmLoteView, UnidadeTramitacaoCrud,
proposicao_texto, recuperar_materia, proposicao_texto, recuperar_materia,
ExcluirTramitacaoEmLoteView, RetornarProposicao) ExcluirTramitacaoEmLoteView, RetornarProposicao,
MateriaPesquisaSimplesView)
from sapl.norma.views import NormaPesquisaSimplesView from sapl.norma.views import NormaPesquisaSimplesView
from sapl.protocoloadm.views import (FichaPesquisaAdmView, FichaSelecionaAdmView) from sapl.protocoloadm.views import (FichaPesquisaAdmView, FichaSelecionaAdmView)
@ -49,6 +50,9 @@ urlpatterns_impressos = [
url(r'^materia/impressos/norma-pesquisa/$', url(r'^materia/impressos/norma-pesquisa/$',
NormaPesquisaSimplesView.as_view(), NormaPesquisaSimplesView.as_view(),
name='impressos_norma_pesquisa'), name='impressos_norma_pesquisa'),
url(r'^materia/impressos/materia-pesquisa/$',
MateriaPesquisaSimplesView.as_view(),
name='impressos_materia_pesquisa'),
url(r'^materia/impressos/ficha-pesquisa-adm/$', url(r'^materia/impressos/ficha-pesquisa-adm/$',
FichaPesquisaAdmView.as_view(), FichaPesquisaAdmView.as_view(),
name= 'impressos_ficha_pesquisa_adm'), name= 'impressos_ficha_pesquisa_adm'),

43
sapl/materia/views.py

@ -41,7 +41,7 @@ from sapl.materia.forms import (AnexadaForm, AutoriaForm,
ConfirmarProposicaoForm, ConfirmarProposicaoForm,
DevolverProposicaoForm, LegislacaoCitadaForm, DevolverProposicaoForm, LegislacaoCitadaForm,
OrgaoForm, ProposicaoForm, TipoProposicaoForm, OrgaoForm, ProposicaoForm, TipoProposicaoForm,
TramitacaoForm, TramitacaoUpdateForm) TramitacaoForm, TramitacaoUpdateForm, MateriaPesquisaSimplesForm)
from sapl.norma.models import LegislacaoCitada from sapl.norma.models import LegislacaoCitada
from sapl.parlamentares.models import Legislatura from sapl.parlamentares.models import Legislatura
from sapl.protocoloadm.models import Protocolo from sapl.protocoloadm.models import Protocolo
@ -2291,13 +2291,10 @@ class ImpressosView(PermissionRequiredMixin, TemplateView):
def gerar_pdf_impressos(request, context, template_name): def gerar_pdf_impressos(request, context, template_name):
template = loader.get_template(template_name) template = loader.get_template(template_name)
html = template.render(context, request) html = template.render(context, request)
pdf = weasyprint.HTML(string=html, base_url=request.build_absolute_uri()).write_pdf()
pdf = weasyprint.HTML(string=html, base_url=request.build_absolute_uri()
).write_pdf()
response = HttpResponse(pdf, content_type='application/pdf') response = HttpResponse(pdf, content_type='application/pdf')
response['Content-Disposition'] = ( response['Content-Disposition'] = 'inline; filename="relatorio_impressos.pdf"'
'inline; filename="relatorio_impressos.pdf"')
response['Content-Transfer-Encoding'] = 'binary' response['Content-Transfer-Encoding'] = 'binary'
return response return response
@ -2305,7 +2302,7 @@ def gerar_pdf_impressos(request, context, template_name):
class EtiquetaPesquisaView(PermissionRequiredMixin, FormView): class EtiquetaPesquisaView(PermissionRequiredMixin, FormView):
form_class = EtiquetaPesquisaForm form_class = EtiquetaPesquisaForm
template_name = 'materia/impressos/etiqueta.html' template_name = 'materia/impressos/impressos_form.html'
permission_required = ('materia.can_access_impressos', ) permission_required = ('materia.can_access_impressos', )
def form_valid(self, form): def form_valid(self, form):
@ -2346,7 +2343,7 @@ class EtiquetaPesquisaView(PermissionRequiredMixin, FormView):
class FichaPesquisaView(PermissionRequiredMixin, FormView): class FichaPesquisaView(PermissionRequiredMixin, FormView):
form_class = FichaPesquisaForm form_class = FichaPesquisaForm
template_name = 'materia/impressos/ficha.html' template_name = 'materia/impressos/impressos_form.html'
permission_required = ('materia.can_access_impressos', ) permission_required = ('materia.can_access_impressos', )
def form_valid(self, form): def form_valid(self, form):
@ -2364,7 +2361,7 @@ class FichaPesquisaView(PermissionRequiredMixin, FormView):
class FichaSelecionaView(PermissionRequiredMixin, FormView): class FichaSelecionaView(PermissionRequiredMixin, FormView):
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
form_class = FichaSelecionaForm form_class = FichaSelecionaForm
template_name = 'materia/impressos/ficha_seleciona.html' template_name = 'materia/impressos/impressos_form.html'
permission_required = ('materia.can_access_impressos', ) permission_required = ('materia.can_access_impressos', )
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):
@ -2461,3 +2458,31 @@ class ExcluirTramitacaoEmLoteView(PermissionRequiredMixin, FormView):
tramitacao.delete() tramitacao.delete()
return redirect(self.get_success_url()) return redirect(self.get_success_url())
class MateriaPesquisaSimplesView(PermissionRequiredMixin, FormView):
form_class = MateriaPesquisaSimplesForm
template_name = 'materia/impressos/impressos_form.html'
permission_required = ('materia.can_access_impressos', )
def form_valid(self, form):
template_materia = 'materia/impressos/materias_pdf.html'
kwargs = {}
if form.cleaned_data.get('tipo_materia'):
kwargs.update({'tipo': form.cleaned_data['tipo_materia']})
if form.cleaned_data.get('data_inicial'):
kwargs.update({'data__gte': form.cleaned_data['data_inicial'],
'data__lte': form.cleaned_data['data_final']})
materias = MateriaLegislativa.objects.filter(**kwargs).order_by('-numero', 'ano')
quantidade_materias = materias.count()
materias = materias[:2000] if quantidade_materias > 2000 else materias
context = {'quantidade': quantidade_materias,
'titulo': form.cleaned_data['titulo'],
'materias': materias}
return gerar_pdf_impressos(self.request, context, template_materia)

24
sapl/norma/forms.py

@ -392,7 +392,7 @@ class NormaPesquisaSimplesForm(forms.Form):
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
super(NormaPesquisaSimplesForm, self).__init__(*args, **kwargs) super().__init__(*args, **kwargs)
row1 = to_row( row1 = to_row(
[('tipo_norma', 6), [('tipo_norma', 6),
@ -405,36 +405,30 @@ class NormaPesquisaSimplesForm(forms.Form):
self.helper = SaplFormHelper() self.helper = SaplFormHelper()
self.helper.layout = Layout( self.helper.layout = Layout(
Fieldset( Fieldset(
('Índice de Normas'), 'Índice de Normas',
row1, row2, row1, row2,
form_actions(label='Pesquisar') form_actions(label='Pesquisar')
) )
) )
def clean(self): def clean(self):
super(NormaPesquisaSimplesForm, self).clean() super().clean()
if not self.is_valid(): if not self.is_valid():
return self.cleaned_data return self.cleaned_data
cleaned_data = self.cleaned_data cleaned_data = self.cleaned_data
data_inicial = cleaned_data['data_inicial'] data_inicial = cleaned_data['data_inicial']
data_final = cleaned_data['data_final'] data_final = cleaned_data['data_final']
if (data_inicial and data_final and if data_inicial or data_final:
data_inicial > data_final): if not(data_inicial and data_final):
self.logger.error("Data Final ({}) menor que a Data Inicial ({}).".format(
data_final, data_inicial))
raise ValidationError(_(
'A Data Final não pode ser menor que a Data Inicial'))
else:
condicao1 = data_inicial and not data_final
condicao2 = not data_inicial and data_final
if condicao1 or condicao2:
self.logger.error("Caso pesquise por data, os campos de Data Inicial e " self.logger.error("Caso pesquise por data, os campos de Data Inicial e "
"Data Final devem ser preenchidos obrigatoriamente") "Data Final devem ser preenchidos obrigatoriamente")
raise ValidationError(_('Caso pesquise por data, os campos de Data Inicial e ' + raise ValidationError(_('Caso pesquise por data, os campos de Data Inicial e '
'Data Final devem ser preenchidos obrigatoriamente')) 'Data Final devem ser preenchidos obrigatoriamente'))
elif data_inicial > data_final:
self.logger.error("Data Final ({}) menor que a Data Inicial ({}).".format(data_final, data_inicial))
raise ValidationError(_('A Data Final não pode ser menor que a Data Inicial'))
return cleaned_data return cleaned_data

31
sapl/norma/views.py

@ -345,12 +345,10 @@ class ImpressosView(PermissionRequiredMixin, TemplateView):
def gerar_pdf_impressos(request, context, template_name): def gerar_pdf_impressos(request, context, template_name):
template = loader.get_template(template_name) template = loader.get_template(template_name)
html = template.render(context, request) html = template.render(context, request)
pdf = weasyprint.HTML(string=html, base_url=request.build_absolute_uri() pdf = weasyprint.HTML(string=html, base_url=request.build_absolute_uri()).write_pdf()
).write_pdf()
response = HttpResponse(pdf, content_type='application/pdf') response = HttpResponse(pdf, content_type='application/pdf')
response['Content-Disposition'] = ( response['Content-Disposition'] = 'inline; filename="relatorio_impressos.pdf"'
'inline; filename="relatorio_impressos.pdf"')
response['Content-Transfer-Encoding'] = 'binary' response['Content-Transfer-Encoding'] = 'binary'
return response return response
@ -358,29 +356,28 @@ def gerar_pdf_impressos(request, context, template_name):
class NormaPesquisaSimplesView(PermissionRequiredMixin, FormView): class NormaPesquisaSimplesView(PermissionRequiredMixin, FormView):
form_class = NormaPesquisaSimplesForm form_class = NormaPesquisaSimplesForm
template_name = 'materia/impressos/norma.html' template_name = 'materia/impressos/impressos_form.html'
permission_required = ('materia.can_access_impressos', ) permission_required = ('materia.can_access_impressos', )
def form_valid(self, form): def form_valid(self, form):
normas = NormaJuridica.objects.all().order_by(
'numero')
template_norma = 'materia/impressos/normas_pdf.html' template_norma = 'materia/impressos/normas_pdf.html'
titulo = form.cleaned_data['titulo'] titulo = form.cleaned_data['titulo']
if form.cleaned_data['tipo_norma']: kwargs = {}
normas = normas.filter(tipo=form.cleaned_data['tipo_norma']) if form.cleaned_data.get('tipo_norma'):
kwargs.update({'tipo': form.cleaned_data['tipo_norma']})
if form.cleaned_data['data_inicial']: if form.cleaned_data.get('data_inicial'):
normas = normas.filter( kwargs.update({'data__gte': form.cleaned_data['data_inicial'],
data__gte=form.cleaned_data['data_inicial'], 'data__lte': form.cleaned_data['data_final']})
data__lte=form.cleaned_data['data_final'])
qtd_resultados = len(normas) normas = NormaJuridica.objects.filter(**kwargs).order_by('-numero', 'ano')
if qtd_resultados > 2000:
normas = normas[:2000]
context = {'quantidade': qtd_resultados, quantidade_normas = normas.count()
normas = normas[:2000] if quantidade_normas > 2000 else normas
context = {'quantidade': quantidade_normas,
'titulo': titulo, 'titulo': titulo,
'normas': normas} 'normas': normas}

4
sapl/protocoloadm/views.py

@ -1152,7 +1152,7 @@ class ImpressosView(PermissionRequiredMixin, TemplateView):
class FichaPesquisaAdmView(PermissionRequiredMixin, FormView): class FichaPesquisaAdmView(PermissionRequiredMixin, FormView):
form_class = FichaPesquisaAdmForm form_class = FichaPesquisaAdmForm
template_name = 'materia/impressos/ficha.html' template_name = 'materia/impressos/impressos_form.html'
permission_required = ('materia.can_access_impressos', ) permission_required = ('materia.can_access_impressos', )
def form_valid(self, form): def form_valid(self, form):
@ -1170,7 +1170,7 @@ class FichaPesquisaAdmView(PermissionRequiredMixin, FormView):
class FichaSelecionaAdmView(PermissionRequiredMixin, FormView): class FichaSelecionaAdmView(PermissionRequiredMixin, FormView):
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
form_class = FichaSelecionaAdmForm form_class = FichaSelecionaAdmForm
template_name = 'materia/impressos/ficha_seleciona.html' template_name = 'materia/impressos/impressos_form.html'
permission_required = ('materia.can_access_impressos', ) permission_required = ('materia.can_access_impressos', )
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):

7
sapl/templates/materia/impressos/ficha.html

@ -1,7 +0,0 @@
{% extends "crud/form.html" %}
{% load i18n crispy_forms_tags %}
{% block base_content %}
<h1 class="page-header">Impressos</h1>
{% crispy form %}
{% endblock base_content %}

6
sapl/templates/materia/impressos/ficha_seleciona.html

@ -1,6 +0,0 @@
{% extends "crud/form.html" %}
{% load i18n crispy_forms_tags %}
{% block base_content %}
{% crispy form %}
{% endblock base_content %}

66
sapl/templates/materia/impressos/impressos.html

@ -1,45 +1,29 @@
{% extends "crud/detail.html" %} {% extends "crud/detail.html" %}
{% load i18n %} {% load i18n %}
{% block actions %}
{% endblock %}
{% block detail_content %} {% block detail_content %}
<div class="container-table">
<h1 class="page-header">Impressos</h1> <h1 class="page-header">Impressos</h1>
<table class="table table-striped table-hover table-link-ordering">
</br> <tr>
<h2 class="legend">Etiqueta</h2> <th>Capa Documento Administrativo</th>
<ul> <td><a href="{% url 'sapl.materia:impressos_ficha_pesquisa_adm' %}">Pesquisar</a></td>
<li><a href="{% url 'sapl.materia:impressos_etiqueta' %}">Pesquisar</a></li> </tr>
</ul> <tr>
<th>Capa Processo</th>
</br> <td><a href="{% url 'sapl.materia:impressos_ficha_pesquisa' %}">Pesquisar</a></td>
<h2 class="legend">Capa Processo</h2> </tr>
<ul> <tr>
<li><a href="{% url 'sapl.materia:impressos_ficha_pesquisa' %}">Pesquisar</a></li> <th>Etiqueta</th>
</ul> <td><a href="{% url 'sapl.materia:impressos_etiqueta' %}">Pesquisar</a></td>
</br> </tr>
<h2 class="legend">Índice de Normas Jurídicas</h2> <tr>
<ul> <th>Índice de Matérias Legislativas</th>
<li><a href="{% url 'sapl.materia:impressos_norma_pesquisa' %}">Pesquisar</a></li> <td><a href="{% url 'sapl.materia:impressos_materia_pesquisa' %}">Pesquisar</a></td>
</ul> </tr>
</br> <tr>
<h2 class="legend">Capa Documento Administrativo</h2> <th>Índice de Normas Jurídicas</th>
<ul> <td><a href="{% url 'sapl.materia:impressos_norma_pesquisa' %}">Pesquisar</a></td>
<li><a href="{% url 'sapl.materia:impressos_ficha_pesquisa_adm' %}">Pesquisar</a></li> </tr>
</ul> </table>
</div>
{#<h2 class="legend">Guia de Remessa</h2>#}
{# <ul>#}
{# <li><a href="{% url 'sapl.materia:impressos_guiaremessa' %}">Pesquisar</a></li>#}
{# </ul>#}
{##}
{#<h2 class="legend">Espelho</h2>#}
{# <ul>#}
{# <li><a href="{% url 'sapl.materia:impressos_espelho' %}">Pesquisar</a></li>#}
{# </ul>#}
{% endblock %} {% endblock %}

0
sapl/templates/materia/impressos/etiqueta.html → sapl/templates/materia/impressos/impressos_form.html

67
sapl/templates/materia/impressos/materias_pdf.html

@ -0,0 +1,67 @@
<!DOCTYPE html>
<html>
<head>
<title>Impressos</title>
<meta charset="utf-8">
</head>
<body id="corpo">
{% if titulo %}
<div id="titulo">
<strong class="text_pdf">{{ titulo }}</strong>
</div>
{% endif %}
{% if quantidade > 2000 %}
<div>
<p class="alert_message"><b>Sua pesquisa retornou mais do que 2000 impressos.<br>
Por questões de performance, foram retornados apenas os primeiros 2000 resultados.</b></p>
</div>
{% endif %}
<table>
<thead>
<tr>
<th>Tipo, Número e Data</th>
<th>Ementa</th>
</tr>
</thead>
<tbody>
{% for materia in materias %}
<tr>
<td id="tipo_numero_data">
<span class="text_pdf">{{ materia.tipo }} nº {{ materia.numero }}, de {{ materia.ano }}</span>
</td>
<td id="ementa">
<span class="text_pdf">{{ materia.ementa }}</span>
</td>
</tr>
{% endfor %}
</tbody>
</table>
</body>
<style type="text/css">
.text_pdf {
font-family: arial;
font-size: 70%;
}
#titulo {
font-size: xx-large;
text-align: center;
vertical-align:top;
}
#corpo {
margin-left:10px;
margin-right:-50px;
margin-top: -50px;
text-align: justify;
}
#tipo_numero_data {
width:200px;
vertical-align:top;
}
#ementa {
width:440px;
vertical-align:top;
}
</style>
</html>

7
sapl/templates/materia/impressos/norma.html

@ -1,7 +0,0 @@
{% extends "crud/form.html" %}
{% load i18n crispy_forms_tags %}
{% block base_content %}
<h1 class="page-header">Impressos</h1>
{% crispy form %}
{% endblock base_content %}

111
sapl/templates/materia/impressos/normas_pdf.html

@ -1,52 +1,67 @@
<!DOCTYPE html> <!DOCTYPE html>
<html> <html>
<head>
<title>Impressos</title>
<meta charset="utf-8">
</head>
<body id="corpo">
{% if titulo %}
<div id="titulo">
<strong class="text_pdf">{{ titulo }}</strong>
</div>
{% endif %}
<head> {% if quantidade > 2000 %}
<title>Impressos</title> <div>
<meta charset="utf-8"> <p class="alert_message"><b>Sua pesquisa retornou mais do que 2000 impressos.<br>
</head> Por questões de performance, foram retornados apenas os primeiros 2000 resultados.</b></p>
</div>
{% endif %}
<style type="text/css"> <table>
.text_pdf{ <thead>
font-family: arial; <tr>
font-size: 70%; <th>Tipo, Número e Data</th>
} <th>Ementa</th>
#titulo </tr>
{ </thead>
font-size: xx-large; <tbody>
text-align: center; {% for norma in normas %}
} <tr>
<td id="tipo_numero_data">
</style> <span class="text_pdf">{{ norma.tipo }} nº {{ norma.numero }}, de {{ norma.data|date:"d/m/Y" }}</span>
</td>
<body style="margin-left:10px;margin-right:-50px; margin-top: -50px; text-align: justify"> <td id="ementa">
<span class="text_pdf">{{ norma.ementa }}</span>
{% if quantidade > 2000 %} </td>
<b><p class="alert_message">Sua pesquisa retornou mais do que 2000 impressos.</p><p class="alert_message">Por questões de performance, foram retornados apenas os 2000 primeiros.</p></b> </tr>
</br></br></br> {% endfor %}
{% endif %} </tbody>
</table>
<div id="titulo"> </body>
<td vertical-align:top;"><strong class="text_pdf">{{titulo}}</strong></td> <style type="text/css">
</div> .text_pdf {
</br> font-family: arial;
font-size: 70%;
}
{% for m in normas %} #titulo {
<table> font-size: xx-large;
<tr> text-align: center;
<td style="width:200px; vertical-align:top;"><span class="text_pdf"> {{m.tipo}} nº </span><span class="text_pdf"> {{m.numero}}, de {{m.data|date:"d/m/Y" }} </span> vertical-align:top;
</td> }
<td> #corpo {
</td> margin-left:10px;
<td style="width:440px; vertical-align:top;"><span class="text_pdf">{{m.ementa}}</span> margin-right:-50px;
</td> margin-top: -50px;
</tr> text-align: justify;
</table> }
</br> #tipo_numero_data {
width:200px;
{% endfor %} vertical-align:top;
}
#ementa {
width:440px;
</body> vertical-align:top;
}
</style>
</html>
Loading…
Cancel
Save