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 c232ce265..c40a905ea 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