Browse Source

Refatora formulário de pesquisa de matérias

pull/2448/head
Leandro Roberto 6 years ago
parent
commit
5fff880249
  1. 141
      sapl/materia/forms.py
  2. 41
      sapl/materia/migrations/0036_auto_20190106_0330.py
  3. 14
      sapl/materia/models.py
  4. 28
      sapl/materia/views.py
  5. 3
      sapl/parlamentares/models.py
  6. 10
      sapl/templates/materia/materialegislativa_filter.html

141
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.files.base import File
from django.core.urlresolvers import reverse from django.core.urlresolvers import reverse
from django.db import models, transaction 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 import ModelChoiceField, ModelForm, widgets
from django.forms.forms import Form from django.forms.forms import Form
from django.forms.models import ModelMultipleChoiceField from django.forms.models import ModelMultipleChoiceField
@ -37,7 +37,7 @@ from sapl.materia.models import (AssuntoMateria, Autoria, MateriaAssunto,
UnidadeTramitacao) UnidadeTramitacao)
from sapl.norma.models import (LegislacaoCitada, NormaJuridica, from sapl.norma.models import (LegislacaoCitada, NormaJuridica,
TipoNormaJuridica) TipoNormaJuridica)
from sapl.parlamentares.models import Legislatura from sapl.parlamentares.models import Legislatura, Partido
from sapl.protocoloadm.models import Protocolo, DocumentoAdministrativo from sapl.protocoloadm.models import Protocolo, DocumentoAdministrativo
from sapl.settings import MAX_DOC_UPLOAD_SIZE from sapl.settings import MAX_DOC_UPLOAD_SIZE
from sapl.utils import (YES_NO_CHOICES, SEPARADOR_HASH_PROPOSICAO, from sapl.utils import (YES_NO_CHOICES, SEPARADOR_HASH_PROPOSICAO,
@ -52,12 +52,19 @@ from .models import (AcompanhamentoMateria, Anexada, Autoria, DespachoInicial,
TipoMateriaLegislativa, Tramitacao, UnidadeTramitacao) TipoMateriaLegislativa, Tramitacao, UnidadeTramitacao)
def em_tramitacao(): def CHOICE_TRAMITACAO():
return [('', 'Tanto Faz'), return [('', 'Tanto Faz'),
(1, 'Sim'), (1, 'Sim'),
(0, 'Não')] (0, 'Não')]
def CHOICE_TIPO_LISTAGEM():
return [
(1, _('Detalhada')),
(2, _('Simplificada')),
]
class AdicionarVariasAutoriasFilterSet(django_filters.FilterSet): class AdicionarVariasAutoriasFilterSet(django_filters.FilterSet):
class Meta: class Meta:
@ -767,32 +774,43 @@ class MateriaLegislativaFilterSet(django_filters.FilterSet):
autoria__primeiro_autor = django_filters.BooleanFilter( autoria__primeiro_autor = django_filters.BooleanFilter(
required=False, required=False,
label='Primeiro Autor', label=_('Primeiro Autor'))
widget=forms.HiddenInput())
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', indexacao = django_filters.CharFilter(lookup_expr='icontains',
label=_('Indexação')) label=_('Indexação'))
em_tramitacao = django_filters.ChoiceFilter(required=False, em_tramitacao = django_filters.ChoiceFilter(required=False,
label='Em tramitação', label='Em tramitação',
choices=em_tramitacao) choices=CHOICE_TRAMITACAO)
materiaassunto__assunto = django_filters.ModelChoiceFilter( materiaassunto__assunto = django_filters.ModelChoiceFilter(
queryset=AssuntoMateria.objects.all(), queryset=AssuntoMateria.objects.all(),
label=_('Assunto da Matéria')) label=_('Assunto'))
numeracao__numero_materia = django_filters.NumberFilter( numeracao__numero_materia = django_filters.NumberFilter(
required=False, required=False,
label=_('Número do Processo')) label=_('Número do processo'))
o = MateriaPesquisaOrderingFilter() o = MateriaPesquisaOrderingFilter(help_text='')
tipo_listagem = forms.ChoiceField(
required=True,
choices=CHOICE_TIPO_LISTAGEM,
label=_('Tipo da Listagem do Resultado da Pesquisa'))
class Meta: class Meta:
filter_overrides = {models.DateField: { filter_overrides = {models.DateField: {
'filter_class': django_filters.DateFromToRangeFilter, 'filter_class': django_filters.DateFromToRangeFilter,
'extra': lambda f: { 'extra': lambda f: {
'label': '%s (%s)' % (f.verbose_name, _('Inicial Final')), 'label': '%s (%s)' % (f.verbose_name, _('Inicial / Final')),
'widget': RangeWidgetOverride} 'widget': RangeWidgetOverride}
}} }}
model = MateriaLegislativa model = MateriaLegislativa
@ -805,7 +823,7 @@ class MateriaLegislativaFilterSet(django_filters.FilterSet):
'data_publicacao', 'data_publicacao',
'autoria__autor__tipo', 'autoria__autor__tipo',
'autoria__primeiro_autor', 'autoria__primeiro_autor',
# FIXME 'autoria__autor__partido', 'autoria__autor__parlamentar_set__filiacao__partido',
'relatoria__parlamentar_id', 'relatoria__parlamentar_id',
'local_origem_externa', 'local_origem_externa',
'tramitacao__unidade_tramitacao_destino', 'tramitacao__unidade_tramitacao_destino',
@ -814,16 +832,36 @@ class MateriaLegislativaFilterSet(django_filters.FilterSet):
'em_tramitacao', '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): def __init__(self, *args, **kwargs):
super(MateriaLegislativaFilterSet, self).__init__(*args, **kwargs) super(MateriaLegislativaFilterSet, self).__init__(*args, **kwargs)
self.filters['tipo'].label = 'Tipo de Matéria' # self.filters['tipo'].label = 'Tipo de Matéria'
self.filters['autoria__autor__tipo'].label = 'Tipo de Autor' self.filters[
# self.filters['autoria__autor__partido'].label = 'Partido do Autor' 'autoria__autor__parlamentar_set__filiacao__partido'
self.filters['relatoria__parlamentar_id'].label = 'Relatoria' ].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( row1 = to_row(
[('tipo', 12)]) [('tipo', 5), ('ementa', 7)])
row2 = to_row( row2 = to_row(
[('numero', 3), [('numero', 3),
('numeracao__numero_materia', 3), ('numeracao__numero_materia', 3),
@ -832,47 +870,78 @@ class MateriaLegislativaFilterSet(django_filters.FilterSet):
row3 = to_row( row3 = to_row(
[('data_apresentacao', 6), [('data_apresentacao', 6),
('data_publicacao', 6)]) ('data_publicacao', 6)])
row4 = to_row( row4 = to_row([
[('autoria__autor', 0), ('autoria__autor', 0),
('autoria__primeiro_autor', 0),
(Button('pesquisar', (Button('pesquisar',
'Pesquisar Autor', 'Pesquisar Autor',
css_class='btn btn-primary btn-sm'), 2), css_class='btn btn-primary btn-sm'), 2),
(Button('limpar', (Button('limpar',
'limpar Autor', 'limpar Autor',
css_class='btn btn-primary btn-sm'), 10)]) css_class='btn btn-primary btn-sm'), 2),
row5 = to_row( ('autoria__primeiro_autor', 2),
[('autoria__autor__tipo', 12), ('autoria__autor__tipo', 3),
# ('autoria__autor__partido', 6) ('autoria__autor__parlamentar_set__filiacao__partido', 3)
]) ])
row6 = to_row( row6 = to_row(
[('relatoria__parlamentar_id', 6), [('relatoria__parlamentar_id', 6),
('local_origem_externa', 6)]) ('local_origem_externa', 6)])
row7 = to_row( row7 = to_row(
[('tramitacao__unidade_tramitacao_destino', 6), [('tramitacao__unidade_tramitacao_destino', 5),
('tramitacao__status', 6)]) ('tramitacao__status', 5),
row8 = to_row( ('em_tramitacao', 2)
[('em_tramitacao', 6), ])
('o', 6)])
row9 = to_row( row9 = to_row(
[('materiaassunto__assunto', 6), ('indexacao', 6)]) [('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 = FormHelper()
self.form.helper.form_method = 'GET' self.form.helper.form_method = 'GET'
self.form.helper.layout = Layout( self.form.helper.layout = Layout(
Fieldset(_('Pesquisa de Matéria'), Fieldset(_('Pesquisa Básica'),
row1, row2, row3, row1, row2),
Fieldset(_('Como listar os resultados da pesquisa'),
row8
),
Fieldset(_('Pesquisa Avançada'),
row3,
HTML(autor_label), HTML(autor_label),
HTML(autor_modal), HTML(autor_modal),
row4, row5, row6, row7, row8, row9, row10, row4, row6, row7, row9,
form_actions(label='Pesquisar')) form_actions(label=_('Pesquisar')))
) )
@property @property
def qs(self): 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(): def pega_ultima_tramitacao():

41
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'),
),
]

14
sapl/materia/models.py

@ -142,15 +142,17 @@ def anexo_upload_path(instance, filename):
@reversion.register() @reversion.register()
class MateriaLegislativa(models.Model): class MateriaLegislativa(models.Model):
tipo = models.ForeignKey(TipoMateriaLegislativa, tipo = models.ForeignKey(
TipoMateriaLegislativa,
on_delete=models.PROTECT, on_delete=models.PROTECT,
verbose_name=_('Tipo')) verbose_name=TipoMateriaLegislativa._meta.verbose_name)
numero = models.PositiveIntegerField(verbose_name=_('Número')) numero = models.PositiveIntegerField(verbose_name=_('Número'))
ano = models.PositiveSmallIntegerField(verbose_name=_('Ano'), ano = models.PositiveSmallIntegerField(verbose_name=_('Ano'),
choices=RANGE_ANOS) choices=RANGE_ANOS)
numero_protocolo = models.PositiveIntegerField( numero_protocolo = models.PositiveIntegerField(
blank=True, null=True, verbose_name=_('Núm. Protocolo')) blank=True, null=True, verbose_name=_('Número do Protocolo'))
data_apresentacao = models.DateField(verbose_name=_('Data Apresentação')) data_apresentacao = models.DateField(
verbose_name=_('Data de Apresentação'))
tipo_apresentacao = models.CharField( tipo_apresentacao = models.CharField(
max_length=1, blank=True, max_length=1, blank=True,
verbose_name=_('Tipo de Apresentação'), verbose_name=_('Tipo de Apresentação'),
@ -160,7 +162,7 @@ class MateriaLegislativa(models.Model):
on_delete=models.PROTECT, on_delete=models.PROTECT,
verbose_name=_('Regime Tramitação')) verbose_name=_('Regime Tramitação'))
data_publicacao = models.DateField( 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( tipo_origem_externa = models.ForeignKey(
TipoMateriaLegislativa, TipoMateriaLegislativa,
blank=True, blank=True,
@ -176,7 +178,7 @@ class MateriaLegislativa(models.Model):
blank=True, null=True, verbose_name=_('Data')) blank=True, null=True, verbose_name=_('Data'))
local_origem_externa = models.ForeignKey( local_origem_externa = models.ForeignKey(
Origem, blank=True, null=True, 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( apelido = models.CharField(
max_length=50, blank=True, verbose_name=_('Apelido')) max_length=50, blank=True, verbose_name=_('Apelido'))
dias_prazo = models.PositiveIntegerField( dias_prazo = models.PositiveIntegerField(

28
sapl/materia/views.py

@ -1747,12 +1747,16 @@ class MateriaLegislativaPesquisaView(FilterView):
kwargs = {'data': self.request.GET or None} kwargs = {'data': self.request.GET or None}
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') status_tramitacao = self.request.GET.get('tramitacao__status')
unidade_destino = self.request.GET.get( unidade_destino = self.request.GET.get(
'tramitacao__unidade_tramitacao_destino') 'tramitacao__unidade_tramitacao_destino')
qs = self.get_queryset().distinct()
if status_tramitacao and unidade_destino: if status_tramitacao and unidade_destino:
lista = filtra_tramitacao_destino_and_status(status_tramitacao, lista = filtra_tramitacao_destino_and_status(status_tramitacao,
unidade_destino) unidade_destino)
@ -1766,9 +1770,6 @@ class MateriaLegislativaPesquisaView(FilterView):
lista = filtra_tramitacao_destino(unidade_destino) lista = filtra_tramitacao_destino(unidade_destino)
qs = qs.filter(id__in=lista).distinct() qs = qs.filter(id__in=lista).distinct()
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", qs = qs.prefetch_related("autoria_set",
"autoria_set__autor", "autoria_set__autor",
"numeracao_set", "numeracao_set",
@ -1782,6 +1783,15 @@ class MateriaLegislativaPesquisaView(FilterView):
"normajuridica_set", "normajuridica_set",
"registrovotacao_set", "registrovotacao_set",
"documentoacessorio_set") "documentoacessorio_set")
else:
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')
kwargs.update({ kwargs.update({
'queryset': qs, 'queryset': qs,
@ -1794,7 +1804,10 @@ class MateriaLegislativaPesquisaView(FilterView):
context['title'] = _('Pesquisar Matéria Legislativa') 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() qr = self.request.GET.copy()
if 'page' in qr: if 'page' in qr:
@ -1810,7 +1823,8 @@ class MateriaLegislativaPesquisaView(FilterView):
context['show_results'] = show_results_filter_set(qr) 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 return context

3
sapl/parlamentares/models.py

@ -1,10 +1,10 @@
import reversion
from django.db import models from django.db import models
from django.utils import timezone from django.utils import timezone
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from image_cropping.fields import ImageCropField, ImageRatioField from image_cropping.fields import ImageCropField, ImageRatioField
from model_utils import Choices from model_utils import Choices
import reversion
from sapl.base.models import Autor from sapl.base.models import Autor
from sapl.decorators import vigencia_atual from sapl.decorators import vigencia_atual
@ -281,6 +281,7 @@ class Parlamentar(models.Model):
('nome_completo', '__icontains'), ('nome_completo', '__icontains'),
('nome_parlamentar', '__icontains'), ('nome_parlamentar', '__icontains'),
('filiacao__partido__sigla', '__icontains'), ('filiacao__partido__sigla', '__icontains'),
('filiacao__partido', '__exact'),
)) ))
class Meta: class Meta:

10
sapl/templates/materia/materialegislativa_filter.html

@ -34,7 +34,11 @@
</thead> </thead>
{% if paginator.count %} {% if paginator.count %}
{% if paginator.count > 1 %} {% if paginator.count > 1 %}
<h3>{% blocktrans with paginator.count as total_materias %}Pesquisa concluída com sucesso! Foram encontradas {{total_materias}} matérias.{% endblocktrans %}</h3> {% if not tipo_listagem or tipo_listagem == '1' %}
<h3>{% blocktrans with paginator.count as total_materias %}Pesquisa detalhada concluída com sucesso! Foram encontradas {{total_materias}} matérias.{% endblocktrans %}</h3>
{% else %}
<h3>{% blocktrans with paginator.count as total_materias %}Pesquisa simplificada concluída com sucesso! Foram encontradas {{total_materias}} matérias.{% endblocktrans %}</h3>
{% endif %}
{% elif paginator.count == 1 %} {% elif paginator.count == 1 %}
<h3>{% trans 'Pesquisa concluída com sucesso! Foi encontrada 1 matéria.'%}</h3> <h3>{% trans 'Pesquisa concluída com sucesso! Foi encontrada 1 matéria.'%}</h3>
{% endif %} {% endif %}
@ -73,6 +77,9 @@
{% endfor %} {% endfor %}
</br> </br>
{% endif %} {% endif %}
{% if not tipo_listagem or tipo_listagem == '1' %}
{% if m.tramitacao_set.last.unidade_tramitacao_destino %} {% if m.tramitacao_set.last.unidade_tramitacao_destino %}
<strong>Localização Atual:</strong> &nbsp;{{m.tramitacao_set.last.unidade_tramitacao_destino}}</br> <strong>Localização Atual:</strong> &nbsp;{{m.tramitacao_set.last.unidade_tramitacao_destino}}</br>
{% endif %} {% endif %}
@ -150,6 +157,7 @@
{% if m.em_tramitacao and mail_service_configured %} {% if m.em_tramitacao and mail_service_configured %}
<a href="{% url 'sapl.materia:acompanhar_materia' m.id %}">Acompanhar Matéria</a> <a href="{% url 'sapl.materia:acompanhar_materia' m.id %}">Acompanhar Matéria</a>
{% endif %} {% endif %}
{% endif %}
</td> </td>
</tr> </tr>
{% endfor %} {% endfor %}

Loading…
Cancel
Save