From 4ec055159df3580de5c55fc8e8a5deaafb70b9a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vin=C3=ADcius=20Cantu=C3=A1ria?= Date: Tue, 19 Mar 2019 11:39:44 -0300 Subject: [PATCH] Fix #2599 (#2601) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 --- sapl/materia/forms.py | 69 +++++++++++ sapl/materia/urls.py | 6 +- sapl/materia/views.py | 43 +++++-- sapl/norma/forms.py | 24 ++-- sapl/norma/views.py | 31 +++-- sapl/protocoloadm/views.py | 4 +- sapl/templates/materia/impressos/ficha.html | 7 -- .../materia/impressos/ficha_seleciona.html | 6 - .../materia/impressos/impressos.html | 66 ++++------- .../{etiqueta.html => impressos_form.html} | 0 .../materia/impressos/materias_pdf.html | 67 +++++++++++ sapl/templates/materia/impressos/norma.html | 7 -- .../materia/impressos/normas_pdf.html | 111 ++++++++++-------- 13 files changed, 288 insertions(+), 153 deletions(-) delete mode 100644 sapl/templates/materia/impressos/ficha.html delete mode 100644 sapl/templates/materia/impressos/ficha_seleciona.html rename sapl/templates/materia/impressos/{etiqueta.html => impressos_form.html} (100%) create mode 100644 sapl/templates/materia/impressos/materias_pdf.html delete mode 100644 sapl/templates/materia/impressos/norma.html diff --git a/sapl/materia/forms.py b/sapl/materia/forms.py index 33f4d3b26..e5caec886 100644 --- a/sapl/materia/forms.py +++ b/sapl/materia/forms.py @@ -2396,3 +2396,72 @@ class ExcluirTramitacaoEmLote(forms.Form): 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 diff --git a/sapl/materia/urls.py b/sapl/materia/urls.py index aea49d89d..962dc2cff 100644 --- a/sapl/materia/urls.py +++ b/sapl/materia/urls.py @@ -25,7 +25,8 @@ from sapl.materia.views import (AcompanhamentoConfirmarView, TipoProposicaoCrud, TramitacaoCrud, TramitacaoEmLoteView, UnidadeTramitacaoCrud, proposicao_texto, recuperar_materia, - ExcluirTramitacaoEmLoteView, RetornarProposicao) + ExcluirTramitacaoEmLoteView, RetornarProposicao, + MateriaPesquisaSimplesView) from sapl.norma.views import NormaPesquisaSimplesView from sapl.protocoloadm.views import (FichaPesquisaAdmView, FichaSelecionaAdmView) @@ -49,6 +50,9 @@ urlpatterns_impressos = [ url(r'^materia/impressos/norma-pesquisa/$', NormaPesquisaSimplesView.as_view(), name='impressos_norma_pesquisa'), + url(r'^materia/impressos/materia-pesquisa/$', + MateriaPesquisaSimplesView.as_view(), + name='impressos_materia_pesquisa'), url(r'^materia/impressos/ficha-pesquisa-adm/$', FichaPesquisaAdmView.as_view(), name= 'impressos_ficha_pesquisa_adm'), diff --git a/sapl/materia/views.py b/sapl/materia/views.py index b08368db8..d5be4770d 100644 --- a/sapl/materia/views.py +++ b/sapl/materia/views.py @@ -41,7 +41,7 @@ from sapl.materia.forms import (AnexadaForm, AutoriaForm, ConfirmarProposicaoForm, DevolverProposicaoForm, LegislacaoCitadaForm, OrgaoForm, ProposicaoForm, TipoProposicaoForm, - TramitacaoForm, TramitacaoUpdateForm) + TramitacaoForm, TramitacaoUpdateForm, MateriaPesquisaSimplesForm) from sapl.norma.models import LegislacaoCitada from sapl.parlamentares.models import Legislatura from sapl.protocoloadm.models import Protocolo @@ -2291,13 +2291,10 @@ class ImpressosView(PermissionRequiredMixin, TemplateView): def gerar_pdf_impressos(request, context, template_name): template = loader.get_template(template_name) 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['Content-Disposition'] = ( - 'inline; filename="relatorio_impressos.pdf"') + response['Content-Disposition'] = 'inline; filename="relatorio_impressos.pdf"' response['Content-Transfer-Encoding'] = 'binary' return response @@ -2305,7 +2302,7 @@ def gerar_pdf_impressos(request, context, template_name): class EtiquetaPesquisaView(PermissionRequiredMixin, FormView): form_class = EtiquetaPesquisaForm - template_name = 'materia/impressos/etiqueta.html' + template_name = 'materia/impressos/impressos_form.html' permission_required = ('materia.can_access_impressos', ) def form_valid(self, form): @@ -2346,7 +2343,7 @@ class EtiquetaPesquisaView(PermissionRequiredMixin, FormView): class FichaPesquisaView(PermissionRequiredMixin, FormView): form_class = FichaPesquisaForm - template_name = 'materia/impressos/ficha.html' + template_name = 'materia/impressos/impressos_form.html' permission_required = ('materia.can_access_impressos', ) def form_valid(self, form): @@ -2364,7 +2361,7 @@ class FichaPesquisaView(PermissionRequiredMixin, FormView): class FichaSelecionaView(PermissionRequiredMixin, FormView): logger = logging.getLogger(__name__) form_class = FichaSelecionaForm - template_name = 'materia/impressos/ficha_seleciona.html' + template_name = 'materia/impressos/impressos_form.html' permission_required = ('materia.can_access_impressos', ) def get_context_data(self, **kwargs): @@ -2461,3 +2458,31 @@ class ExcluirTramitacaoEmLoteView(PermissionRequiredMixin, FormView): tramitacao.delete() 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) diff --git a/sapl/norma/forms.py b/sapl/norma/forms.py index 5f5e0aa37..12eee547f 100644 --- a/sapl/norma/forms.py +++ b/sapl/norma/forms.py @@ -392,7 +392,7 @@ class NormaPesquisaSimplesForm(forms.Form): logger = logging.getLogger(__name__) def __init__(self, *args, **kwargs): - super(NormaPesquisaSimplesForm, self).__init__(*args, **kwargs) + super().__init__(*args, **kwargs) row1 = to_row( [('tipo_norma', 6), @@ -405,36 +405,30 @@ class NormaPesquisaSimplesForm(forms.Form): self.helper = SaplFormHelper() self.helper.layout = Layout( Fieldset( - ('Índice de Normas'), + 'Índice de Normas', row1, row2, form_actions(label='Pesquisar') ) ) def clean(self): - super(NormaPesquisaSimplesForm, self).clean() + 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 and data_final and - 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')) - else: - condicao1 = data_inicial and not data_final - condicao2 = not data_inicial and data_final - if condicao1 or condicao2: + 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 ' + + 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 diff --git a/sapl/norma/views.py b/sapl/norma/views.py index 1d0f9b28e..336c16933 100644 --- a/sapl/norma/views.py +++ b/sapl/norma/views.py @@ -345,12 +345,10 @@ class ImpressosView(PermissionRequiredMixin, TemplateView): def gerar_pdf_impressos(request, context, template_name): template = loader.get_template(template_name) 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['Content-Disposition'] = ( - 'inline; filename="relatorio_impressos.pdf"') + response['Content-Disposition'] = 'inline; filename="relatorio_impressos.pdf"' response['Content-Transfer-Encoding'] = 'binary' return response @@ -358,29 +356,28 @@ def gerar_pdf_impressos(request, context, template_name): class NormaPesquisaSimplesView(PermissionRequiredMixin, FormView): form_class = NormaPesquisaSimplesForm - template_name = 'materia/impressos/norma.html' + template_name = 'materia/impressos/impressos_form.html' permission_required = ('materia.can_access_impressos', ) def form_valid(self, form): - normas = NormaJuridica.objects.all().order_by( - 'numero') template_norma = 'materia/impressos/normas_pdf.html' titulo = form.cleaned_data['titulo'] - if form.cleaned_data['tipo_norma']: - normas = normas.filter(tipo=form.cleaned_data['tipo_norma']) + kwargs = {} + if form.cleaned_data.get('tipo_norma'): + kwargs.update({'tipo': form.cleaned_data['tipo_norma']}) - if form.cleaned_data['data_inicial']: - normas = normas.filter( - data__gte=form.cleaned_data['data_inicial'], - data__lte=form.cleaned_data['data_final']) + if form.cleaned_data.get('data_inicial'): + kwargs.update({'data__gte': form.cleaned_data['data_inicial'], + 'data__lte': form.cleaned_data['data_final']}) - qtd_resultados = len(normas) - if qtd_resultados > 2000: - normas = normas[:2000] + normas = NormaJuridica.objects.filter(**kwargs).order_by('-numero', 'ano') - context = {'quantidade': qtd_resultados, + quantidade_normas = normas.count() + normas = normas[:2000] if quantidade_normas > 2000 else normas + + context = {'quantidade': quantidade_normas, 'titulo': titulo, 'normas': normas} diff --git a/sapl/protocoloadm/views.py b/sapl/protocoloadm/views.py index 3357a8c9e..bb5d12ed1 100755 --- a/sapl/protocoloadm/views.py +++ b/sapl/protocoloadm/views.py @@ -1152,7 +1152,7 @@ class ImpressosView(PermissionRequiredMixin, TemplateView): class FichaPesquisaAdmView(PermissionRequiredMixin, FormView): form_class = FichaPesquisaAdmForm - template_name = 'materia/impressos/ficha.html' + template_name = 'materia/impressos/impressos_form.html' permission_required = ('materia.can_access_impressos', ) def form_valid(self, form): @@ -1170,7 +1170,7 @@ class FichaPesquisaAdmView(PermissionRequiredMixin, FormView): class FichaSelecionaAdmView(PermissionRequiredMixin, FormView): logger = logging.getLogger(__name__) form_class = FichaSelecionaAdmForm - template_name = 'materia/impressos/ficha_seleciona.html' + template_name = 'materia/impressos/impressos_form.html' permission_required = ('materia.can_access_impressos', ) def get_context_data(self, **kwargs): diff --git a/sapl/templates/materia/impressos/ficha.html b/sapl/templates/materia/impressos/ficha.html deleted file mode 100644 index 03d1c8580..000000000 --- a/sapl/templates/materia/impressos/ficha.html +++ /dev/null @@ -1,7 +0,0 @@ -{% extends "crud/form.html" %} -{% load i18n crispy_forms_tags %} - -{% block base_content %} -

Impressos

- {% crispy form %} -{% endblock base_content %} diff --git a/sapl/templates/materia/impressos/ficha_seleciona.html b/sapl/templates/materia/impressos/ficha_seleciona.html deleted file mode 100644 index 818b7c3a3..000000000 --- a/sapl/templates/materia/impressos/ficha_seleciona.html +++ /dev/null @@ -1,6 +0,0 @@ -{% extends "crud/form.html" %} -{% load i18n crispy_forms_tags %} - -{% block base_content %} - {% crispy form %} -{% endblock base_content %} diff --git a/sapl/templates/materia/impressos/impressos.html b/sapl/templates/materia/impressos/impressos.html index 5f6001027..2191a8c80 100644 --- a/sapl/templates/materia/impressos/impressos.html +++ b/sapl/templates/materia/impressos/impressos.html @@ -1,45 +1,29 @@ {% extends "crud/detail.html" %} {% load i18n %} - - -{% block actions %} -{% endblock %} - - {% block detail_content %} - -

Impressos

- -
-

Etiqueta

- - -
-

Capa Processo

- -
-

Índice de Normas Jurídicas

- -
-

Capa Documento Administrativo

- - -{#

Guia de Remessa

#} -{# #} -{##} -{#

Espelho

#} -{# #} - +
+

Impressos

+ + + + + + + + + + + + + + + + + + + + + + +
{% endblock %} diff --git a/sapl/templates/materia/impressos/etiqueta.html b/sapl/templates/materia/impressos/impressos_form.html similarity index 100% rename from sapl/templates/materia/impressos/etiqueta.html rename to sapl/templates/materia/impressos/impressos_form.html diff --git a/sapl/templates/materia/impressos/materias_pdf.html b/sapl/templates/materia/impressos/materias_pdf.html new file mode 100644 index 000000000..71e59277e --- /dev/null +++ b/sapl/templates/materia/impressos/materias_pdf.html @@ -0,0 +1,67 @@ + + + + Impressos + + + + {% if titulo %} +
+ {{ titulo }} +
+ {% endif %} + + {% if quantidade > 2000 %} +
+

Sua pesquisa retornou mais do que 2000 impressos.
+ Por questões de performance, foram retornados apenas os primeiros 2000 resultados.

+
+ {% endif %} + + + + + + + + + + {% for materia in materias %} + + + + + {% endfor %} + +
Tipo, Número e DataEmenta
+ {{ materia.tipo }} nº {{ materia.numero }}, de {{ materia.ano }} + + {{ materia.ementa }} +
+ + + \ No newline at end of file diff --git a/sapl/templates/materia/impressos/norma.html b/sapl/templates/materia/impressos/norma.html deleted file mode 100644 index 03d1c8580..000000000 --- a/sapl/templates/materia/impressos/norma.html +++ /dev/null @@ -1,7 +0,0 @@ -{% extends "crud/form.html" %} -{% load i18n crispy_forms_tags %} - -{% block base_content %} -

Impressos

- {% crispy form %} -{% endblock base_content %} diff --git a/sapl/templates/materia/impressos/normas_pdf.html b/sapl/templates/materia/impressos/normas_pdf.html index 4c0509168..ebd201d98 100644 --- a/sapl/templates/materia/impressos/normas_pdf.html +++ b/sapl/templates/materia/impressos/normas_pdf.html @@ -1,52 +1,67 @@ + + Impressos + + + + {% if titulo %} +
+ {{ titulo }} +
+ {% endif %} - - Impressos - - + {% if quantidade > 2000 %} +
+

Sua pesquisa retornou mais do que 2000 impressos.
+ Por questões de performance, foram retornados apenas os primeiros 2000 resultados.

+
+ {% endif %} - - - - -{% if quantidade > 2000 %} -

Sua pesquisa retornou mais do que 2000 impressos.

Por questões de performance, foram retornados apenas os 2000 primeiros.

-


-{% endif %} - -
- {{titulo}} -
-
- - -{% for m in normas %} - - - - - - -
{{m.tipo}} nº {{m.numero}}, de {{m.data|date:"d/m/Y" }} - - {{m.ementa}} -
-
- -{% endfor %} - - - - + + + + + + + + + {% for norma in normas %} + + + + + {% endfor %} + +
Tipo, Número e DataEmenta
+ {{ norma.tipo }} nº {{ norma.numero }}, de {{ norma.data|date:"d/m/Y" }} + + {{ norma.ementa }} +
+ + + \ No newline at end of file