From b951d602966d8d49240ad35a97bfdd97fb1e5da0 Mon Sep 17 00:00:00 2001 From: Edward Oliveira Date: Sat, 23 Apr 2022 10:19:22 -0300 Subject: [PATCH] =?UTF-8?q?Adiciona=20tab=20Norma=20na=20p=C3=A1g=20de=20P?= =?UTF-8?q?arlamentar?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixes #3498 --- sapl/norma/forms.py | 13 +++- sapl/parlamentares/urls.py | 5 +- sapl/parlamentares/views.py | 75 ++++++++++++++++++++++++ sapl/templates/norma/normas.html | 71 ++++++++++++++++++++++ sapl/templates/parlamentares/subnav.yaml | 2 + 5 files changed, 163 insertions(+), 3 deletions(-) create mode 100644 sapl/templates/norma/normas.html diff --git a/sapl/norma/forms.py b/sapl/norma/forms.py index d2e074842..2b531e167 100644 --- a/sapl/norma/forms.py +++ b/sapl/norma/forms.py @@ -80,12 +80,16 @@ class NormaFilterSet(django_filters.FilterSet): assuntos = django_filters.ModelChoiceFilter( queryset=AssuntoNorma.objects.all()) + autorianorma__autor = django_filters.CharFilter(method='filter_autoria') + autorianorma__primeiro_autor = django_filters.CharFilter(method='filter_autoria') + o = NormaPesquisaOrderingFilter(help_text='') class Meta(FilterOverridesMetaMixin): model = NormaJuridica - fields = ['orgao', 'tipo', 'numero', 'ano', 'data', 'data_vigencia', - 'data_publicacao', 'ementa', 'assuntos'] + fields = ['orgao', 'tipo', 'numero', 'ano', 'data', + 'data_vigencia', 'data_publicacao', 'ementa', 'assuntos', + 'autorianorma__autor', 'autorianorma__primeiro_autor'] def __init__(self, *args, **kwargs): super(NormaFilterSet, self).__init__(*args, **kwargs) @@ -112,6 +116,11 @@ class NormaFilterSet(django_filters.FilterSet): return queryset.filter(q) + def filter_autoria(self, queryset, name, value): + return queryset.filter(**{ + name: value, + }) + class NormaJuridicaForm(FileFieldCheckMixin, ModelForm): diff --git a/sapl/parlamentares/urls.py b/sapl/parlamentares/urls.py index 88a46c69b..d97564692 100644 --- a/sapl/parlamentares/urls.py +++ b/sapl/parlamentares/urls.py @@ -6,7 +6,7 @@ from sapl.parlamentares.views import (CargoMesaCrud, ColigacaoCrud, FiliacaoCrud, FrenteCrud, FrenteList, LegislaturaCrud, MandatoCrud, MesaDiretoraView, NivelInstrucaoCrud, - ParlamentarCrud, ParlamentarMateriasView, + ParlamentarCrud, ParlamentarMateriasView, ParlamentarNormasView, ParticipacaoParlamentarCrud, PartidoCrud, ProposicaoParlamentarCrud, RelatoriaParlamentarCrud, @@ -45,6 +45,9 @@ urlpatterns = [ url(r'^parlamentar/(?P\d+)/materias$', ParlamentarMateriasView.as_view(), name='parlamentar_materias'), + url(r'^parlamentar/(?P\d+)/normas$', + ParlamentarNormasView.as_view(), name='parlamentar_normas'), + url(r'^parlamentar/(?P\d+)/frentes/$', get_parlamentar_frentes, name='parlamentar_frentes'), url(r'^parlamentar/vincular-parlamentar/$', diff --git a/sapl/parlamentares/views.py b/sapl/parlamentares/views.py index 9ae0c54bc..684b4f19b 100644 --- a/sapl/parlamentares/views.py +++ b/sapl/parlamentares/views.py @@ -30,6 +30,7 @@ from sapl.crud.base import (RP_CHANGE, RP_DETAIL, RP_LIST, Crud, CrudAux, CrudBaseForListAndDetailExternalAppView, MasterDetailCrud, make_pagination) from sapl.materia.models import Autoria, Proposicao, Relatoria +from sapl.norma.models import AutoriaNorma, NormaJuridica from sapl.parlamentares.apps import AppConfig from sapl.rules import SAPL_GROUP_VOTANTE from sapl.utils import (parlamentares_ativos, show_results_filter_set) @@ -890,6 +891,80 @@ class ParlamentarMateriasView(FormView): }) +class ParlamentarNormasView(FormView): + template_name = "norma/normas.html" + success_url = reverse_lazy('sapl.parlamentares:parlamentar_normas') + logger = logging.getLogger(__name__) + + def get_autoria(self, resultset): + autoria = {} + total_autoria = 0 + + for i in resultset: + row = autoria.get(i['norma__ano'], []) + columns = (i['norma__tipo__pk'], + i['norma__tipo__sigla'], + i['norma__tipo__descricao'], + int(i['total'])) + row.append(columns) + autoria[i['norma__ano']] = row + total_autoria += columns[3] + autoria = sorted(autoria.items(), reverse=True) + return autoria, total_autoria + + @xframe_options_exempt + def get(self, request, *args, **kwargs): + parlamentar_pk = kwargs['pk'] + username = request.user.username + try: + self.logger.debug( + "user=" + username + ". Tentando obter Autor (object_id={}).".format(parlamentar_pk)) + autor = Autor.objects.get( + content_type=ContentType.objects.get_for_model(Parlamentar), + object_id=parlamentar_pk) + except ObjectDoesNotExist: + mensagem = _( + 'Este Parlamentar não está associado como autor de matéria.'.format(parlamentar_pk)) + self.logger.error( + "user=" + username + ". Este Parlamentar (pk={}) não é Autor de matéria.".format(parlamentar_pk)) + messages.add_message(request, messages.ERROR, mensagem) + return HttpResponseRedirect( + reverse( + 'sapl.parlamentares:parlamentar_detail', + kwargs={'pk': parlamentar_pk})) + + autoria = AutoriaNorma.objects.filter( + autor=autor, primeiro_autor=True).values( + 'norma__ano', + 'norma__tipo__pk', + 'norma__tipo__sigla', + 'norma__tipo__descricao').annotate( + total=Count('norma__tipo__pk')).order_by( + '-norma__ano', 'norma__tipo') + + coautoria = AutoriaNorma.objects.filter( + autor=autor, primeiro_autor=False).values( + 'norma__ano', + 'norma__tipo__pk', + 'norma__tipo__sigla', + 'norma__tipo__descricao').annotate( + total=Count('norma__tipo__pk')).order_by( + '-norma__ano', 'norma__tipo') + + autor_list = self.get_autoria(autoria) + coautor_list = self.get_autoria(coautoria) + + parlamentar_pk = autor.autor_related.pk + nome_parlamentar = autor.autor_related.nome_parlamentar + + return self.render_to_response({'autor_pk': autor.pk, + 'root_pk': parlamentar_pk, + 'autoria': autor_list, + 'coautoria': coautor_list, + 'nome_parlamentar': nome_parlamentar + }) + + def get_data_filicao(parlamentar): return parlamentar.filiacao_set.order_by('-data').first().data.strftime('%d/%m/%Y') diff --git a/sapl/templates/norma/normas.html b/sapl/templates/norma/normas.html new file mode 100644 index 000000000..195e2ada5 --- /dev/null +++ b/sapl/templates/norma/normas.html @@ -0,0 +1,71 @@ +{% extends "crud/detail.html" %} +{% load i18n %} +{% load common_tags %} +{% load static %} + +{% block actions %}{% endblock %} + +{% block detail_content %} + + + + + +
+

+ Normas ({{nome_parlamentar}}) +

+
+ +
+

Conteúdo

+
    +
  1. Primeiro Autor
  2. +
  3. Co-Autor
  4. +
+
+ +

Primeiro Autor

+
+ +{% for autoria in autoria.0 %} + + {% for normas in autoria.1 %} + + + + + + {% endfor %} +{%endfor %} +

Ano: {{ autoria.0 }}

{{ normas.1 }}  + + {{ normas.2}} + +  {{ normas.3}}
+ +

Total: {{ autoria.1 }}


+ +

Co-Autor

+
+ +{% for coautoria in coautoria.0 %} + + {% for normas in coautoria.1 %} + + + + + + {% endfor %} +{%endfor %} +

Ano: {{ coautoria.0 }}

{{ normas.1 }}  + + {{ normas.2}} + +  {{ normas.3}}
+ +

Total: {{ coautoria.1 }}


+ + +{% endblock detail_content %} diff --git a/sapl/templates/parlamentares/subnav.yaml b/sapl/templates/parlamentares/subnav.yaml index 023e616b4..e6d9b4bfd 100644 --- a/sapl/templates/parlamentares/subnav.yaml +++ b/sapl/templates/parlamentares/subnav.yaml @@ -5,6 +5,8 @@ url: mandato_list - title: {% trans 'Matérias' %} url: parlamentar_materias +- title: {% trans 'Normas' %} + url: parlamentar_normas - title: {% trans 'Filiações Partidárias' %} url: filiacao_list - title: {% trans 'Dependentes' %}