From 5fff880249d48d968c5a1bd13a27f7c624ecfd40 Mon Sep 17 00:00:00 2001 From: Leandro Roberto Date: Sun, 6 Jan 2019 04:43:53 -0200 Subject: [PATCH] =?UTF-8?q?Refatora=20formul=C3=A1rio=20de=20pesquisa=20de?= =?UTF-8?q?=20mat=C3=A9rias?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sapl/materia/forms.py | 153 ++++++++++++----- .../migrations/0036_auto_20190106_0330.py | 41 +++++ sapl/materia/models.py | 16 +- sapl/materia/views.py | 80 +++++---- sapl/parlamentares/models.py | 3 +- .../materia/materialegislativa_filter.html | 156 +++++++++--------- 6 files changed, 292 insertions(+), 157 deletions(-) create mode 100644 sapl/materia/migrations/0036_auto_20190106_0330.py diff --git a/sapl/materia/forms.py b/sapl/materia/forms.py index 01814f723..06d5bada8 100644 --- a/sapl/materia/forms.py +++ b/sapl/materia/forms.py @@ -12,7 +12,7 @@ from django.core.exceptions import ObjectDoesNotExist, ValidationError from django.core.files.base import File from django.core.urlresolvers import reverse from django.db import models, transaction -from django.db.models import Max +from django.db.models import Max, Q, F from django.forms import ModelChoiceField, ModelForm, widgets from django.forms.forms import Form from django.forms.models import ModelMultipleChoiceField @@ -37,7 +37,7 @@ from sapl.materia.models import (AssuntoMateria, Autoria, MateriaAssunto, UnidadeTramitacao) from sapl.norma.models import (LegislacaoCitada, NormaJuridica, TipoNormaJuridica) -from sapl.parlamentares.models import Legislatura +from sapl.parlamentares.models import Legislatura, Partido from sapl.protocoloadm.models import Protocolo, DocumentoAdministrativo from sapl.settings import MAX_DOC_UPLOAD_SIZE from sapl.utils import (YES_NO_CHOICES, SEPARADOR_HASH_PROPOSICAO, @@ -52,12 +52,19 @@ from .models import (AcompanhamentoMateria, Anexada, Autoria, DespachoInicial, TipoMateriaLegislativa, Tramitacao, UnidadeTramitacao) -def em_tramitacao(): +def CHOICE_TRAMITACAO(): return [('', 'Tanto Faz'), (1, 'Sim'), (0, 'Não')] +def CHOICE_TIPO_LISTAGEM(): + return [ + (1, _('Detalhada')), + (2, _('Simplificada')), + ] + + class AdicionarVariasAutoriasFilterSet(django_filters.FilterSet): class Meta: @@ -767,32 +774,43 @@ class MateriaLegislativaFilterSet(django_filters.FilterSet): autoria__primeiro_autor = django_filters.BooleanFilter( required=False, - label='Primeiro Autor', - widget=forms.HiddenInput()) + label=_('Primeiro Autor')) - ementa = django_filters.CharFilter(lookup_expr='icontains') + autoria__autor__parlamentar_set__filiacao__partido = django_filters.ModelChoiceFilter( + queryset=Partido.objects.all(), + label=_('Matérias por Partido')) + + ementa = django_filters.CharFilter( + label=_('Pesquisar expressões na ementa'), + method='filter_ementa' + ) indexacao = django_filters.CharFilter(lookup_expr='icontains', label=_('Indexação')) em_tramitacao = django_filters.ChoiceFilter(required=False, label='Em tramitação', - choices=em_tramitacao) + choices=CHOICE_TRAMITACAO) materiaassunto__assunto = django_filters.ModelChoiceFilter( queryset=AssuntoMateria.objects.all(), - label=_('Assunto da Matéria')) + label=_('Assunto')) numeracao__numero_materia = django_filters.NumberFilter( required=False, - label=_('Número do Processo')) + label=_('Número do processo')) + + o = MateriaPesquisaOrderingFilter(help_text='') - o = MateriaPesquisaOrderingFilter() + tipo_listagem = forms.ChoiceField( + required=True, + choices=CHOICE_TIPO_LISTAGEM, + label=_('Tipo da Listagem do Resultado da Pesquisa')) class Meta: filter_overrides = {models.DateField: { 'filter_class': django_filters.DateFromToRangeFilter, 'extra': lambda f: { - 'label': '%s (%s)' % (f.verbose_name, _('Inicial Final')), + 'label': '%s (%s)' % (f.verbose_name, _('Inicial / Final')), 'widget': RangeWidgetOverride} }} model = MateriaLegislativa @@ -805,7 +823,7 @@ class MateriaLegislativaFilterSet(django_filters.FilterSet): 'data_publicacao', 'autoria__autor__tipo', 'autoria__primeiro_autor', - # FIXME 'autoria__autor__partido', + 'autoria__autor__parlamentar_set__filiacao__partido', 'relatoria__parlamentar_id', 'local_origem_externa', 'tramitacao__unidade_tramitacao_destino', @@ -814,16 +832,36 @@ class MateriaLegislativaFilterSet(django_filters.FilterSet): 'em_tramitacao', ] + def filter_ementa(self, queryset, name, value): + texto = value.split() + q = Q() + for t in texto: + q &= Q(ementa__icontains=t) + + return queryset.filter(q) + def __init__(self, *args, **kwargs): super(MateriaLegislativaFilterSet, self).__init__(*args, **kwargs) - self.filters['tipo'].label = 'Tipo de Matéria' - self.filters['autoria__autor__tipo'].label = 'Tipo de Autor' - # self.filters['autoria__autor__partido'].label = 'Partido do Autor' - self.filters['relatoria__parlamentar_id'].label = 'Relatoria' + # self.filters['tipo'].label = 'Tipo de Matéria' + self.filters[ + 'autoria__autor__parlamentar_set__filiacao__partido' + ].label = 'Partido do Autor' + + self.filters['autoria__autor__tipo'].label = _('Tipo de Autor') + self.filters['relatoria__parlamentar_id'].label = _('Relatoria') + self.filters['tramitacao__unidade_tramitacao_destino'].label = _( + 'Unidade de tramitação atual') + self.filters['tramitacao__status'].label = _( + 'Status da tramitação atual') + self.filters['tramitacao__status'].label = _( + 'Status da tramitação atual') + + self.filters['o'].label = _('Ordenação') + self.form.fields['tipo_listagem'] = self.tipo_listagem row1 = to_row( - [('tipo', 12)]) + [('tipo', 5), ('ementa', 7)]) row2 = to_row( [('numero', 3), ('numeracao__numero_materia', 3), @@ -832,47 +870,78 @@ class MateriaLegislativaFilterSet(django_filters.FilterSet): row3 = to_row( [('data_apresentacao', 6), ('data_publicacao', 6)]) - row4 = to_row( - [('autoria__autor', 0), - ('autoria__primeiro_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)]) - row5 = to_row( - [('autoria__autor__tipo', 12), - # ('autoria__autor__partido', 6) - ]) + row4 = to_row([ + ('autoria__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'), 2), + ('autoria__primeiro_autor', 2), + ('autoria__autor__tipo', 3), + ('autoria__autor__parlamentar_set__filiacao__partido', 3) + ]) row6 = to_row( [('relatoria__parlamentar_id', 6), ('local_origem_externa', 6)]) row7 = to_row( - [('tramitacao__unidade_tramitacao_destino', 6), - ('tramitacao__status', 6)]) - row8 = to_row( - [('em_tramitacao', 6), - ('o', 6)]) + [('tramitacao__unidade_tramitacao_destino', 5), + ('tramitacao__status', 5), + ('em_tramitacao', 2) + ]) row9 = to_row( [('materiaassunto__assunto', 6), ('indexacao', 6)]) - row10 = to_row( - [('ementa', 12)]) + + row8 = to_row( + [ + ('o', 8), + ('tipo_listagem', 4) + ]) self.form.helper = FormHelper() self.form.helper.form_method = 'GET' self.form.helper.layout = Layout( - Fieldset(_('Pesquisa de Matéria'), - row1, row2, row3, + Fieldset(_('Pesquisa Básica'), + row1, row2), + + Fieldset(_('Como listar os resultados da pesquisa'), + row8 + ), + Fieldset(_('Pesquisa Avançada'), + row3, HTML(autor_label), HTML(autor_modal), - row4, row5, row6, row7, row8, row9, row10, - form_actions(label='Pesquisar')) + row4, row6, row7, row9, + form_actions(label=_('Pesquisar'))) + + + ) @property def qs(self): - return qs_override_django_filter(self) + qs = qs_override_django_filter(self) + + if hasattr(self.form, 'cleaned_data') and self.form.cleaned_data[ + 'autoria__autor__parlamentar_set__filiacao__partido']: + + q_data_inicio_e_fim = Q(data_apresentacao__gte=F( + 'autoria__autor__parlamentar_set__filiacao__data'), + data_apresentacao__lte=F( + 'autoria__autor__parlamentar_set__filiacao__data_desfiliacao')) + + q_data_inicio = Q( + data_apresentacao__gte=F( + 'autoria__autor__parlamentar_set__filiacao__data'), + autoria__autor__parlamentar_set__filiacao__data_desfiliacao__isnull=True + ) + + qs = qs.filter( + q_data_inicio_e_fim | q_data_inicio + ) + + return qs def pega_ultima_tramitacao(): diff --git a/sapl/materia/migrations/0036_auto_20190106_0330.py b/sapl/materia/migrations/0036_auto_20190106_0330.py new file mode 100644 index 000000000..d8adb9678 --- /dev/null +++ b/sapl/materia/migrations/0036_auto_20190106_0330.py @@ -0,0 +1,41 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.10.8 on 2019-01-06 05:30 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('materia', '0035_auto_20190104_1021'), + ] + + operations = [ + migrations.AlterField( + model_name='materialegislativa', + name='data_apresentacao', + field=models.DateField(verbose_name='Data de Apresentação'), + ), + migrations.AlterField( + model_name='materialegislativa', + name='data_publicacao', + field=models.DateField(blank=True, null=True, verbose_name='Data de Publicação'), + ), + migrations.AlterField( + model_name='materialegislativa', + name='local_origem_externa', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='materia.Origem', verbose_name='Local de Origem'), + ), + migrations.AlterField( + model_name='materialegislativa', + name='numero_protocolo', + field=models.PositiveIntegerField(blank=True, null=True, verbose_name='Número do Protocolo'), + ), + migrations.AlterField( + model_name='materialegislativa', + name='tipo', + field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='materia.TipoMateriaLegislativa', verbose_name='Tipo de Matéria Legislativa'), + ), + ] diff --git a/sapl/materia/models.py b/sapl/materia/models.py index e48446aee..221078811 100644 --- a/sapl/materia/models.py +++ b/sapl/materia/models.py @@ -142,15 +142,17 @@ def anexo_upload_path(instance, filename): @reversion.register() class MateriaLegislativa(models.Model): - tipo = models.ForeignKey(TipoMateriaLegislativa, - on_delete=models.PROTECT, - verbose_name=_('Tipo')) + tipo = models.ForeignKey( + TipoMateriaLegislativa, + on_delete=models.PROTECT, + verbose_name=TipoMateriaLegislativa._meta.verbose_name) numero = models.PositiveIntegerField(verbose_name=_('Número')) ano = models.PositiveSmallIntegerField(verbose_name=_('Ano'), choices=RANGE_ANOS) numero_protocolo = models.PositiveIntegerField( - blank=True, null=True, verbose_name=_('Núm. Protocolo')) - data_apresentacao = models.DateField(verbose_name=_('Data Apresentação')) + blank=True, null=True, verbose_name=_('Número do Protocolo')) + data_apresentacao = models.DateField( + verbose_name=_('Data de Apresentação')) tipo_apresentacao = models.CharField( max_length=1, blank=True, verbose_name=_('Tipo de Apresentação'), @@ -160,7 +162,7 @@ class MateriaLegislativa(models.Model): on_delete=models.PROTECT, verbose_name=_('Regime Tramitação')) data_publicacao = models.DateField( - blank=True, null=True, verbose_name=_('Data Publicação')) + blank=True, null=True, verbose_name=_('Data de Publicação')) tipo_origem_externa = models.ForeignKey( TipoMateriaLegislativa, blank=True, @@ -176,7 +178,7 @@ class MateriaLegislativa(models.Model): blank=True, null=True, verbose_name=_('Data')) local_origem_externa = models.ForeignKey( Origem, blank=True, null=True, - on_delete=models.PROTECT, verbose_name=_('Local Origem')) + on_delete=models.PROTECT, verbose_name=_('Local de Origem')) apelido = models.CharField( max_length=50, blank=True, verbose_name=_('Apelido')) dias_prazo = models.PositiveIntegerField( diff --git a/sapl/materia/views.py b/sapl/materia/views.py index 8af8a19e2..07911f09b 100644 --- a/sapl/materia/views.py +++ b/sapl/materia/views.py @@ -1747,42 +1747,52 @@ class MateriaLegislativaPesquisaView(FilterView): kwargs = {'data': self.request.GET or None} - status_tramitacao = self.request.GET.get('tramitacao__status') - unidade_destino = self.request.GET.get( - 'tramitacao__unidade_tramitacao_destino') + tipo_listagem = self.request.GET.get('tipo_listagem', '1') + tipo_listagem = '1' if not tipo_listagem else tipo_listagem qs = self.get_queryset().distinct() + if tipo_listagem == '1': + + status_tramitacao = self.request.GET.get('tramitacao__status') + unidade_destino = self.request.GET.get( + 'tramitacao__unidade_tramitacao_destino') + + if status_tramitacao and unidade_destino: + lista = filtra_tramitacao_destino_and_status(status_tramitacao, + unidade_destino) + qs = qs.filter(id__in=lista).distinct() + + elif status_tramitacao: + lista = filtra_tramitacao_status(status_tramitacao) + qs = qs.filter(id__in=lista).distinct() + + elif unidade_destino: + lista = filtra_tramitacao_destino(unidade_destino) + qs = qs.filter(id__in=lista).distinct() + + qs = qs.prefetch_related("autoria_set", + "autoria_set__autor", + "numeracao_set", + "anexadas", + "tipo", + "texto_articulado", + "tramitacao_set", + "tramitacao_set__status", + "tramitacao_set__unidade_tramitacao_local", + "tramitacao_set__unidade_tramitacao_destino", + "normajuridica_set", + "registrovotacao_set", + "documentoacessorio_set") + else: - if status_tramitacao and unidade_destino: - lista = filtra_tramitacao_destino_and_status(status_tramitacao, - unidade_destino) - qs = qs.filter(id__in=lista).distinct() - - elif status_tramitacao: - lista = filtra_tramitacao_status(status_tramitacao) - qs = qs.filter(id__in=lista).distinct() - - elif unidade_destino: - lista = filtra_tramitacao_destino(unidade_destino) - qs = qs.filter(id__in=lista).distinct() + qs = qs.prefetch_related("autoria_set", + "numeracao_set", + "autoria_set__autor", + "tipo",) if 'o' in self.request.GET and not self.request.GET['o']: qs = qs.order_by('-ano', 'tipo__sigla', '-numero') - qs = qs.prefetch_related("autoria_set", - "autoria_set__autor", - "numeracao_set", - "anexadas", - "tipo", - "texto_articulado", - "tramitacao_set", - "tramitacao_set__status", - "tramitacao_set__unidade_tramitacao_local", - "tramitacao_set__unidade_tramitacao_destino", - "normajuridica_set", - "registrovotacao_set", - "documentoacessorio_set") - kwargs.update({ 'queryset': qs, }) @@ -1794,7 +1804,10 @@ class MateriaLegislativaPesquisaView(FilterView): context['title'] = _('Pesquisar Matéria Legislativa') - self.filterset.form.fields['o'].label = _('Ordenação') + tipo_listagem = self.request.GET.get('tipo_listagem', '1') + tipo_listagem = '1' if not tipo_listagem else tipo_listagem + + context['tipo_listagem'] = tipo_listagem qr = self.request.GET.copy() if 'page' in qr: @@ -1810,7 +1823,8 @@ class MateriaLegislativaPesquisaView(FilterView): context['show_results'] = show_results_filter_set(qr) - context['USE_SOLR'] = settings.USE_SOLR if hasattr(settings, 'USE_SOLR') else False + context['USE_SOLR'] = settings.USE_SOLR if hasattr( + settings, 'USE_SOLR') else False return context @@ -2067,12 +2081,12 @@ class PrimeiraTramitacaoEmLoteView(PermissionRequiredMixin, FilterView): for materia_id in marcadas: try: data_tramitacao = tz.localize(datetime.strptime( - request.POST['data_tramitacao'], "%d/%m/%Y")) + request.POST['data_tramitacao'], "%d/%m/%Y")) except ValueError: msg = _('Formato da data da tramitação incorreto.') messages.add_message(request, messages.ERROR, msg) return self.get(request, self.kwargs) - + t = Tramitacao( materia_id=materia_id, data_tramitacao=data_tramitacao, diff --git a/sapl/parlamentares/models.py b/sapl/parlamentares/models.py index 60df66462..8c07914c4 100644 --- a/sapl/parlamentares/models.py +++ b/sapl/parlamentares/models.py @@ -1,10 +1,10 @@ -import reversion from django.db import models from django.utils import timezone from django.utils.translation import ugettext_lazy as _ from image_cropping.fields import ImageCropField, ImageRatioField from model_utils import Choices +import reversion from sapl.base.models import Autor from sapl.decorators import vigencia_atual @@ -281,6 +281,7 @@ class Parlamentar(models.Model): ('nome_completo', '__icontains'), ('nome_parlamentar', '__icontains'), ('filiacao__partido__sigla', '__icontains'), + ('filiacao__partido', '__exact'), )) class Meta: diff --git a/sapl/templates/materia/materialegislativa_filter.html b/sapl/templates/materia/materialegislativa_filter.html index 5ff3eaee0..74e179d42 100644 --- a/sapl/templates/materia/materialegislativa_filter.html +++ b/sapl/templates/materia/materialegislativa_filter.html @@ -34,7 +34,11 @@ {% if paginator.count %} {% if paginator.count > 1 %} -

{% blocktrans with paginator.count as total_materias %}Pesquisa concluída com sucesso! Foram encontradas {{total_materias}} matérias.{% endblocktrans %}

+ {% if not tipo_listagem or tipo_listagem == '1' %} +

{% blocktrans with paginator.count as total_materias %}Pesquisa detalhada concluída com sucesso! Foram encontradas {{total_materias}} matérias.{% endblocktrans %}

+ {% else %} +

{% blocktrans with paginator.count as total_materias %}Pesquisa simplificada concluída com sucesso! Foram encontradas {{total_materias}} matérias.{% endblocktrans %}

+ {% endif %} {% elif paginator.count == 1 %}

{% trans 'Pesquisa concluída com sucesso! Foi encontrada 1 matéria.'%}

{% endif %} @@ -63,92 +67,96 @@ {% endif %} {% if m.autoria_set.all %} - Autor: - {% for a in m.autoria_set.all %} + Autor: + {% for a in m.autoria_set.all %} {% if not forloop.first %}
{{a.autor}} {% else %}  {{a.autor}} {% endif %} - {% endfor %} -
- {% endif %} - {% if m.tramitacao_set.last.unidade_tramitacao_destino %} - Localização Atual:  {{m.tramitacao_set.last.unidade_tramitacao_destino}}
- {% endif %} - {% if m.tramitacao_set.last.status %} - Status:  {{m.tramitacao_set.last.status}}
- Data Fim Prazo (Tramitação): {{m.tramitacao_set.last.data_fim_prazo|default_if_none:""}}
- {% endif %} - {% if m.registrovotacao_set.exists %} - Data Votação: - {% for rv in m.registrovotacao_set.all %} - {% if rv.ordem %} - - {{ rv.ordem.sessao_plenaria.data_inicio }} - - {% elif rv.expediente %} - - {{ rv.expediente.sessao_plenaria.data_inicio }} - - {% endif %} -
- {% endfor %} - {% endif %} - {% if m.tramitacao_set.last.data_tramitacao %} - Data da última Tramitação:  {{m.tramitacao_set.last.data_tramitacao}}
- Ultima Ação:   {{m.tramitacao_set.last.texto}}
- {% endif %} - {% if m.anexo_de.exists %} - {% for a in m.materia_anexada_set.all %} - Matéria Anexadora:   - - {{ a.materia_principal }}  - - Data Anexação: {{a.data_anexacao}} -
{% endfor %} - {% endif %} - {% if m.anexadas.all.exists %} - {% for anexada in m.materia_principal_set.all %} - Matéria Anexada:   - - {{ anexada.materia_anexada }}  - - Data Anexação: {{anexada.data_anexacao}}
- {% endfor %} {% endif %} - {% if m.documentoacessorio_set.all.exists %} - Documentos Acessórios: - - {{ m.documentoacessorio_set.all.count }} + + {% if not tipo_listagem or tipo_listagem == '1' %} + + {% if m.tramitacao_set.last.unidade_tramitacao_destino %} + Localização Atual:  {{m.tramitacao_set.last.unidade_tramitacao_destino}}
+ {% endif %} + {% if m.tramitacao_set.last.status %} + Status:  {{m.tramitacao_set.last.status}}
+ Data Fim Prazo (Tramitação): {{m.tramitacao_set.last.data_fim_prazo|default_if_none:""}}
+ {% endif %} + {% if m.registrovotacao_set.exists %} + Data Votação: + {% for rv in m.registrovotacao_set.all %} + {% if rv.ordem %} +
+ {{ rv.ordem.sessao_plenaria.data_inicio }} + + {% elif rv.expediente %} + + {{ rv.expediente.sessao_plenaria.data_inicio }} + + {% endif %} +
+ {% endfor %} + {% endif %} + {% if m.tramitacao_set.last.data_tramitacao %} + Data da última Tramitação:  {{m.tramitacao_set.last.data_tramitacao}}
+ Ultima Ação:   {{m.tramitacao_set.last.texto}}
+ {% endif %} + {% if m.anexo_de.exists %} + {% for a in m.materia_anexada_set.all %} + Matéria Anexadora:   + + {{ a.materia_principal }}  + Data Anexação: {{a.data_anexacao}}
- {% endif %} - {% if m.texto_original %}Texto Original
{% endif %} - {% if m.texto_articulado.exists %}Texto Articulado
{% endif %} - {% if m.normajuridica_set.exists %} - {% for nr in m.normajuridica_set.all %} - Norma Jurídica Vinculada: - - {{ nr }} + {% endfor %} + {% endif %} + {% if m.anexadas.all.exists %} + {% for anexada in m.materia_principal_set.all %} + Matéria Anexada:   + + {{ anexada.materia_anexada }}  + + Data Anexação: {{anexada.data_anexacao}} +
+ {% endfor %} + {% endif %} + {% if m.documentoacessorio_set.all.exists %} + Documentos Acessórios: + + {{ m.documentoacessorio_set.all.count }}
+ {% endif %} + {% if m.texto_original %}Texto Original
{% endif %} + {% if m.texto_articulado.exists %}Texto Articulado
{% endif %} + {% if m.normajuridica_set.exists %} + {% for nr in m.normajuridica_set.all %} + Norma Jurídica Vinculada: + + {{ nr }} + +
+ {% endfor %} + {% endif %} + {% if m.audienciapublica_set.exists %} + Audiência(s) Pública(s): + {% for ap in m.audienciapublica_set.all %} + + {{ ap.nome }} + + {% if not forloop.last %}, {% endif %} {% endfor %} - {% endif %} - {% if m.audienciapublica_set.exists %} - Audiência(s) Pública(s): - {% for ap in m.audienciapublica_set.all %} - - {{ ap.nome }} - - {% if not forloop.last %}, {% endif %} - {% endfor %} - {% endif %} -

- {% if m.em_tramitacao and mail_service_configured %} - Acompanhar Matéria + {% endif %} +

+ {% if m.em_tramitacao and mail_service_configured %} + Acompanhar Matéria + {% endif %} {% endif %}