diff --git a/sapl/base/forms.py b/sapl/base/forms.py index 8994d796c..2d8698105 100644 --- a/sapl/base/forms.py +++ b/sapl/base/forms.py @@ -1161,7 +1161,7 @@ class RelatorioMateriasPorAutorFilterSet(django_filters.FilterSet): @property def qs(self): - parent = super(RelatorioMateriasPorAutorFilterSet, self).qs + parent = super().qs return parent.distinct().filter(autoria__primeiro_autor=True)\ .order_by('autoria__autor', '-autoria__primeiro_autor', 'tipo', '-ano', '-numero') @@ -1170,8 +1170,7 @@ class RelatorioMateriasPorAutorFilterSet(django_filters.FilterSet): fields = ['tipo', 'data_apresentacao'] def __init__(self, *args, **kwargs): - super(RelatorioMateriasPorAutorFilterSet, self).__init__( - *args, **kwargs) + super().__init__(*args, **kwargs) self.filters['tipo'].label = 'Tipo de Matéria' @@ -1530,3 +1529,47 @@ class RelatorioHistoricoTramitacaoAdmFilterSet(django_filters.FilterSet): row1, row2, row3, form_actions(label='Pesquisar')) ) + + +class RelatorioNormasPorAutorFilterSet(django_filters.FilterSet): + + autorianorma__autor = django_filters.CharFilter(widget=forms.HiddenInput()) + + @property + def qs(self): + parent = super().qs + return parent.distinct().filter(autorianorma__primeiro_autor=True)\ + .order_by('autorianorma__autor', '-autorianorma__primeiro_autor', 'tipo', '-ano', '-numero') + + class Meta(FilterOverridesMetaMixin): + model = NormaJuridica + fields = ['tipo', 'data'] + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + + self.filters['tipo'].label = 'Tipo de Norma' + + row1 = to_row( + [('tipo', 12)]) + row2 = to_row( + [('data', 12)]) + row3 = to_row( + [('autorianorma__autor', 0), + (Button('pesquisar', + 'Pesquisar Autor', + css_class='btn btn-primary btn-sm'), 2), + (Button('limpar', + 'Limpar Autor', + css_class='btn btn-primary btn-sm'), 10)]) + + self.form.helper = SaplFormHelper() + self.form.helper.form_method = 'GET' + self.form.helper.layout = Layout( + Fieldset(_('Pesquisar'), + row1, row2, + HTML(autor_label), + HTML(autor_modal), + row3, + form_actions(label='Pesquisar')) + ) \ No newline at end of file diff --git a/sapl/base/urls.py b/sapl/base/urls.py index fb41b4923..19a72c901 100644 --- a/sapl/base/urls.py +++ b/sapl/base/urls.py @@ -36,7 +36,8 @@ from .views import (AlterarSenha, AppConfigCrud, CasaLegislativaCrud, ListarAutoresDuplicadosView, ListarBancadaComissaoAutorExternoView, ListarLegislaturaInfindavelView, ListarAnexadasCiclicasView, ListarAnexadosCiclicosView, pesquisa_textual, - RelatorioHistoricoTramitacaoAdmView, RelatorioDocumentosAcessoriosView) + RelatorioHistoricoTramitacaoAdmView, RelatorioDocumentosAcessoriosView, + RelatorioNormasPorAutorView) app_name = AppConfig.name @@ -138,6 +139,8 @@ urlpatterns = [ url(r'^sistema/relatorios/documentos_acessorios$', RelatorioDocumentosAcessoriosView.as_view(), name='relatorio_documentos_acessorios'), + url(r'^sistema/relatorios/normas-por-autor$', + RelatorioNormasPorAutorView.as_view(), name='normas_por_autor'), url(r'^email/validate/(?P[0-9A-Za-z_\-]+)/' '(?P[0-9A-Za-z]{1,13}-[0-9A-Za-z]{1,20})$', diff --git a/sapl/base/views.py b/sapl/base/views.py index f41dbde89..8fec1a305 100644 --- a/sapl/base/views.py +++ b/sapl/base/views.py @@ -38,7 +38,7 @@ from sapl.crud.base import CrudAux, make_pagination from sapl.materia.models import (Autoria, MateriaLegislativa, Proposicao, Anexada, TipoMateriaLegislativa, StatusTramitacao, UnidadeTramitacao, DocumentoAcessorio, TipoDocumento) -from sapl.norma.models import (NormaJuridica, NormaEstatisticas) +from sapl.norma.models import (NormaJuridica, TipoNormaJuridica, NormaEstatisticas) from sapl.parlamentares.models import Parlamentar, Legislatura, Mandato, Filiacao, SessaoLegislativa from sapl.protocoloadm.models import (Protocolo, TipoDocumentoAdministrativo, StatusTramitacaoAdministrativo, @@ -62,7 +62,8 @@ from .forms import (AlterarSenhaForm, CasaLegislativaForm, RelatorioNormasVigenciaFilterSet, EstatisticasAcessoNormasForm, UsuarioFilterSet, RelatorioHistoricoTramitacaoAdmFilterSet, - RelatorioDocumentosAcessoriosFilterSet) + RelatorioDocumentosAcessoriosFilterSet, + RelatorioNormasPorAutorFilterSet) from .models import AppConfig, CasaLegislativa @@ -849,15 +850,12 @@ class RelatorioMateriasPorAutorView(FilterView): template_name = 'base/RelatorioMateriasPorAutor_filter.html' def get_filterset_kwargs(self, filterset_class): - super(RelatorioMateriasPorAutorView, - self).get_filterset_kwargs(filterset_class) - + super().get_filterset_kwargs(filterset_class) kwargs = {'data': self.request.GET or None} return kwargs def get_context_data(self, **kwargs): - context = super(RelatorioMateriasPorAutorView, - self).get_context_data(**kwargs) + context = super().get_context_data(**kwargs) context['title'] = _('Matérias por Autor') if not self.filterset.form.is_valid(): @@ -2081,4 +2079,52 @@ class RelatorioHistoricoTramitacaoAdmView(FilterView): else: context['tramitacaoadministrativo__unidade_tramitacao_destino'] = '' + return context + + +class RelatorioNormasPorAutorView(FilterView): + model = NormaJuridica + filterset_class = RelatorioNormasPorAutorFilterSet + template_name = 'base/RelatorioNormasPorAutor_filter.html' + + def get_filterset_kwargs(self, filterset_class): + super().get_filterset_kwargs(filterset_class) + kwargs = {'data': self.request.GET or None} + return kwargs + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + + context['title'] = _('Normas por Autor') + if not self.filterset.form.is_valid(): + return context + + qtdes = {} + for tipo in TipoNormaJuridica.objects.all(): + qs = kwargs['object_list'] + qtde = len(qs.filter(tipo_id=tipo.id)) + if qtde > 0: + qtdes[tipo] = qtde + context['qtdes'] = qtdes + + qr = self.request.GET.copy() + context['filter_url'] = ('&' + qr.urlencode()) if len(qr) > 0 else '' + + context['show_results'] = show_results_filter_set(qr) + if self.request.GET['tipo']: + tipo = int(self.request.GET['tipo']) + context['tipo'] = ( + str(TipoNormaJuridica.objects.get(id=tipo))) + else: + context['tipo'] = '' + + if self.request.GET['autorianorma__autor']: + autor = int(self.request.GET['autorianorma__autor']) + context['autor'] = (str(Autor.objects.get(id=autor))) + else: + context['autor'] = '' + context['periodo'] = ( + self.request.GET['data_0'] + + ' - ' + self.request.GET['data_1']) + return context \ No newline at end of file diff --git a/sapl/templates/base/RelatorioMateriasPorAutor_filter.html b/sapl/templates/base/RelatorioMateriasPorAutor_filter.html index 0a7aa91c5..e3591191b 100644 --- a/sapl/templates/base/RelatorioMateriasPorAutor_filter.html +++ b/sapl/templates/base/RelatorioMateriasPorAutor_filter.html @@ -16,56 +16,60 @@  Autor: {{ autor }}
 Tipo de matéria: {{ tipo }}
 Data de apresentação: {{periodo}}


- - - - - - - - - - {% for key, value in qtdes.items %} - - - + {% if object_list %} +
QUADRO GERAL
Tipo MatériaQuantidade
{{key.sigla}} - {{key}}{{value}}
+ + + + + - {% endfor %} - + + + {% for key, value in qtdes.items %} + + + + + {% endfor %} + - {% for materia in object_list %} - {% ifchanged materia.autoria_set.first.autor %} + {% for materia in object_list %} + {% ifchanged materia.autoria_set.first.autor %} - - - - - - - - - - {% endifchanged %} - - - - - - - + + + + + + + + + + {% endifchanged %} + + + + + + + - {% endfor %} -
QUADRO GERAL
Tipo MatériaQuantidade
{{key.sigla}} - {{key}}{{value}}
Autor: {{ materia.autoria_set.first.autor }}
MatériaEmentaCoautor(es)
- {{materia.tipo.sigla}} {{materia.numero}}/{{materia.ano}} - {% autoescape off %}{{materia.ementa}}
{{materia.observacao}}{% endautoescape %}
- {% if materia.autoria_set.first != materia.autoria_set.last %} - {% for autor in materia.autoria_set.all %} - {% if not autor.primeiro_autor %} - {{ autor.autor }}
- {% endif %} - {% endfor %} - {% endif %} -
Autor: {{ materia.autoria_set.first.autor }}
MatériaEmentaCoautor(es)
+ {{materia.tipo.sigla}} {{materia.numero}}/{{materia.ano}} + {% autoescape off %}{{materia.ementa}}
{{materia.observacao}}{% endautoescape %}
+ {% if materia.autoria_set.first != materia.autoria_set.last %} + {% for autor in materia.autoria_set.all %} + {% if not autor.primeiro_autor %} + {{ autor.autor }}
+ {% endif %} + {% endfor %} + {% endif %} +
+ {% endfor %} + + {% else %} +

Não foram encontradas matérias com os parâmetros pesquisados.

+ {% endif %} {% endif %} diff --git a/sapl/templates/base/RelatorioNormasPorAutor_filter.html b/sapl/templates/base/RelatorioNormasPorAutor_filter.html new file mode 100644 index 000000000..aaf5247a9 --- /dev/null +++ b/sapl/templates/base/RelatorioNormasPorAutor_filter.html @@ -0,0 +1,76 @@ +{% extends "crud/list.html" %} +{% load i18n %} +{% load crispy_forms_tags %} + +{% block base_content %} + {% if not show_results %} + {% crispy filter.form %} + {% endif %} + + {% if show_results %} + +



+ PARÂMETROS DE PESQUISA:
+  Autor: {{ autor }}
+  Tipo de Norma: {{ tipo }}
+  Data: {{periodo}}


+ {% if object_list %} + + + + + + + + + + {% for key, value in qtdes.items %} + + + + + {% endfor %} + + + {% for norma in object_list %} + {% ifchanged norma.autorianorma_set.first.autor %} + + + + + + + + + + + {% endifchanged %} + + + + + + + + + {% endfor %} +
QUADRO GERAL
Tipo de NormaQuantidade
{{key.sigla}} - {{key}}{{value}}
Autor: {{ norma.autorianorma_set.first.autor }}
NormaEmentaCoautor(es)
+ {{norma.tipo.sigla}} {{norma.numero}}/{{norma.ano}} + {% autoescape off %}{{norma.ementa}}
{{norma.observacao}}{% endautoescape %}
+ {% if norma.autorianorma_set.first != norma.autorianorma_set.last %} + {% for autor in norma.autorianorma_set.all %} + {% if not autor.primeiro_autor %} + {{ autor.autor }}
+ {% endif %} + {% endfor %} + {% endif %} +
+ {% else %} +

Não foram encontradas normas com os parâmetros pesquisados.

+ {% endif %} + + {% endif %} + +{% endblock base_content %} diff --git a/sapl/templates/base/relatorios_list.html b/sapl/templates/base/relatorios_list.html index d031c22a1..ed1066403 100644 --- a/sapl/templates/base/relatorios_list.html +++ b/sapl/templates/base/relatorios_list.html @@ -70,6 +70,10 @@ Documentos Acessórios de Matérias Legislativas Documentos Acessórios por tipo, período e tipo da Matéria Legislativa associada. + + Normas Por Autor + Listagem e totalização de normas por autor, com filtros para tipo e período. + diff --git a/sapl/utils.py b/sapl/utils.py index b2655364d..6d53ef8c0 100644 --- a/sapl/utils.py +++ b/sapl/utils.py @@ -128,7 +128,7 @@ def montar_row_autor(name): return autor_row - +#TODO: Esta função é utilizada? def montar_helper_autor(self): autor_row = montar_row_autor('nome') self.helper = SaplFormHelper()