diff --git a/sapl/relatorios/forms.py b/sapl/relatorios/forms.py index a7f42e8e5..5523d7514 100644 --- a/sapl/relatorios/forms.py +++ b/sapl/relatorios/forms.py @@ -5,6 +5,7 @@ from crispy_forms.layout import (HTML, Button, Fieldset, from django import forms from django.forms import ModelChoiceField from django.utils.translation import ugettext_lazy as _ +from django.db.models import Q from sapl.audiencia.models import AudienciaPublica from sapl.base.models import Autor @@ -14,7 +15,7 @@ from sapl.materia.models import DocumentoAcessorio, MateriaLegislativa, MateriaE StatusTramitacao, TipoMateriaLegislativa from sapl.norma.models import NormaJuridica from sapl.protocoloadm.models import DocumentoAdministrativo -from sapl.sessao.models import SessaoPlenaria, VotoParlamentar +from sapl.sessao.models import SessaoPlenaria, VotoParlamentar, RegistroVotacao from sapl.utils import FilterOverridesMetaMixin, choice_anos_com_normas, qs_override_django_filter, \ choice_anos_com_materias, choice_tipos_normas, autor_label, autor_modal @@ -71,51 +72,56 @@ class RelatorioDocumentosAcessoriosFilterSet(django_filters.FilterSet): class RelatorioVotacoesNominaisFilterSet(django_filters.FilterSet): - @property - def qs(self): - parent = super(RelatorioVotacoesNominaisFilterSet, self).qs - return parent.distinct().order_by('-votacao_id', 'parlamentar') + tipo_id = django_filters.ModelChoiceFilter( + queryset=TipoMateriaLegislativa.objects.all(), + method='ordem_or_expediente', + label='Tipo de Matéria', + empty_label="---------" + ) + numero = django_filters.NumberFilter( + widget=forms.NumberInput(attrs={'class': 'form-control', 'step': 'any'}), + method='ordem_or_expediente', + label='Número' + ) + ano = django_filters.ChoiceFilter( + choices=list(choice_anos_com_materias()), + widget=forms.Select(attrs={'class': 'form-control'}), + method='ordem_or_expediente', + label='Ano da Matéria' + ) + + def ordem_or_expediente(self, queryset, name, value): + if value: + try: + val = value.id + except AttributeError: + val = value + return queryset.filter( + eval(f'Q(ordem__materia__{name}={val}) | Q(expediente__materia__{name}={val})') + ) + return queryset class Meta(FilterOverridesMetaMixin): - model = VotoParlamentar + model = RegistroVotacao fields = ['data_hora'] def __init__(self, *args, **kwargs): - super( - RelatorioVotacoesNominaisFilterSet, self - ).__init__(*args, **kwargs) + super().__init__(*args, **kwargs) self.filters['data_hora'].label = 'Período (Data Inicial - Data Final)' - tipo_materia = '''
' - - numero = '''
-
''' - - ano = '''
-
' - - row0= HTML('
' + tipo_materia + numero + ano + '
') + row0= to_row([('tipo_id', 6), ('numero', 3), ('ano', 3)]) row1 = to_row([('data_hora', 12)]) buttons = FormActions( *[ - HTML(''' + HTML("""
- ''') + """) ], Submit('pesquisar', _('Pesquisar'), css_class='float-right', onclick='return true;'), diff --git a/sapl/relatorios/urls.py b/sapl/relatorios/urls.py index 5244ea3d6..235becfab 100644 --- a/sapl/relatorios/urls.py +++ b/sapl/relatorios/urls.py @@ -101,3 +101,4 @@ urlpatterns = [ url(r'^sistema/relatorios/normas-por-autor$', RelatorioNormasPorAutorView.as_view(), name='normas_por_autor'), ] + diff --git a/sapl/relatorios/views.py b/sapl/relatorios/views.py index 4c5eaab42..1708b420b 100755 --- a/sapl/relatorios/views.py +++ b/sapl/relatorios/views.py @@ -1886,10 +1886,10 @@ class RelatorioDocumentosAcessoriosView(RelatorioMixin, FilterView): class RelatorioVotacoesNominaisView(RelatorioMixin, VotacoesMultiFormatOutputMixin, FilterView): - model = VotoParlamentar filterset_class = RelatorioVotacoesNominaisFilterSet template_name = 'relatorios/RelatorioVotacoesNominais_filter.html' relatorio = relatorio_votacao_nominal + paginate_by = 20 fields_base_report = [ 'votacao_id', 'votacao', 'parlamentar__nome_parlamentar', 'voto' @@ -1901,10 +1901,18 @@ class RelatorioVotacoesNominaisView(RelatorioMixin, VotacoesMultiFormatOutputMix 'json': fields_base_report, } + def get_queryset(self): + if 'format' in self.request.GET: + self.model = VotoParlamentar + order_fields = ['-votacao_id', 'parlamentar'] + else: + self.model = RegistroVotacao + order_fields = ['-id'] + qs = self.model.objects.filter(Q(ordem__tipo_votacao=2)|Q(expediente__tipo_votacao=2)).order_by(*order_fields) + return qs + def get_context_data(self, **kwargs): - context = super( - RelatorioVotacoesNominaisView, self - ).get_context_data(**kwargs) + context = super().get_context_data(**kwargs) context['title'] = _('Votações Nominais') @@ -1912,44 +1920,41 @@ class RelatorioVotacoesNominaisView(RelatorioMixin, VotacoesMultiFormatOutputMix return context query_dict = self.request.GET.copy() - context['filter_url'] = ('&' + query_dict.urlencode()) if len(query_dict) > 0 else '' + if 'page' in query_dict: + del query_dict['page'] + context['filter_url'] = f"&{query_dict.urlencode()}" if query_dict else '' context['show_results'] = show_results_filter_set(query_dict) - data_inicial = self.request.GET['data_hora_0'] - data_final = self.request.GET['data_hora_1'] + data_inicial = self.request.GET.get('data_hora_0', '') + data_final = self.request.GET.get('data_hora_1', '') if not data_inicial: data_inicial = "Data Inicial não definida" if not data_final: data_final = "Data Final não definida" - context['periodo'] = ( - data_inicial + ' - ' + data_final - ) + context['periodo'] = f"{data_inicial} - {data_final}" + + tipo_id = self.request.GET.get('tipo_id') + numero = self.request.GET.get('numero') + ano = self.request.GET.get('ano') + + if tipo_id: + context['tipo_materia'] = TipoMateriaLegislativa.objects.get(id=tipo_id) + if numero: + context['numero'] = int(numero) + if ano: + context['ano'] = ano - if self.request.GET['tipo_materia'] or self.request.GET['numero'] or self.request.GET['ano']: - object_list = context['object_list'] - if self.request.GET['tipo_materia']: - tipo_id = self.request.GET['tipo_materia'] - context['tipo_materia'] = TipoMateriaLegislativa.objects.get(id=tipo_id) - object_list = object_list.filter( - Q(ordem__materia__tipo_id=tipo_id) | - Q(expediente__materia__tipo_id=tipo_id)) - if self.request.GET['numero']: - numero = self.request.GET['numero'] - context['numero'] = numero - object_list = object_list.filter( - Q(ordem__materia__numero=numero) | - Q(expediente__materia__numero=numero)) - if self.request.GET['ano']: - ano = self.request.GET['ano'] - context['ano'] = ano - object_list = object_list.filter( - Q(ordem__materia__ano=ano) | - Q(expediente__materia__ano=ano)) - context['object_list'] = object_list - - - if not 'format' in query_dict: - context['qtde_votacoes'] = context['object_list'].distinct('votacao_id').count() + if 'relatorio' not in self.request.GET: + paginator = context['paginator'] + page_obj = context['page_obj'] + + context['page_range'] = make_pagination( + page_obj.number, paginator.num_pages) + + context['qtde_votacoes'] = paginator.count + else: + self.paginate_by = None + context['qtde_votacoes'] = len(context['object_list']) return context diff --git a/sapl/sessao/models.py b/sapl/sessao/models.py index d20ba930c..613068afe 100644 --- a/sapl/sessao/models.py +++ b/sapl/sessao/models.py @@ -699,7 +699,7 @@ class VotoParlamentar(models.Model): # RegistroVotacaoParlamentar class Meta: verbose_name = _('Registro de Votação de Parlamentar') verbose_name_plural = _('Registros de Votações de Parlamentares') - ordering = ('parlamentar',) + ordering = ('id',) def __str__(self): return _('Votação: %(votacao)s - Parlamentar: %(parlamentar)s') % { diff --git a/sapl/templates/materia/materialegislativa_filter.html b/sapl/templates/materia/materialegislativa_filter.html index cddba92e4..6412ef7f0 100644 --- a/sapl/templates/materia/materialegislativa_filter.html +++ b/sapl/templates/materia/materialegislativa_filter.html @@ -116,14 +116,14 @@ {% for rv in m.registrovotacao_set.all %} {% if rv.ordem %} {{ rv.ordem.sessao_plenaria.data_inicio }} - {% if rv.ordem.get_tipo_votacao_display == 'Nominal' %} + {% if rv.ordem.tipo_votacao == 2 %} - Votação Nominal >>>