diff --git a/materia/forms.py b/materia/forms.py index c50dfad79..a746951b2 100644 --- a/materia/forms.py +++ b/materia/forms.py @@ -1,19 +1,25 @@ from crispy_forms.helper import FormHelper from crispy_forms.layout import HTML, Button, Column, Fieldset, Layout, Submit from django import forms -from django.core.exceptions import ObjectDoesNotExist, ValidationError +from django.core.exceptions import ValidationError +from django_filters import FilterSet from django.forms import ModelForm from django.utils.translation import ugettext_lazy as _ +import django_filters import crispy_layout_mixin import sapl + from crispy_layout_mixin import form_actions from norma.models import LegislacaoCitada, TipoNormaJuridica from sapl.settings import MAX_DOC_UPLOAD_SIZE +from parlamentares.models import Parlamentar, Partido + from .models import (AcompanhamentoMateria, Anexada, Autor, Autoria, DespachoInicial, DocumentoAcessorio, MateriaLegislativa, - Numeracao, Proposicao, Relatoria, StatusTramitacao, + Numeracao, Origem, Proposicao, Relatoria, + StatusTramitacao, TipoAutor, TipoDocumento, TipoMateriaLegislativa, Tramitacao, UnidadeTramitacao) ORDENACAO_MATERIAIS = [(1, 'Crescente'), @@ -549,26 +555,11 @@ class AutoriaForm(ModelForm): choices=[(True, _('Sim')), (False, _('Não'))], ) - materia_id = forms.CharField(widget=forms.HiddenInput(), required=False) - class Meta: model = Autoria fields = ['autor', 'primeiro_autor', - 'partido', - 'materia_id'] - - def clean(self): - if self.data['materia_id'] and self.data['autor']: - try: - materia = MateriaLegislativa.objects.get( - id=self.data['materia_id']) - Autoria.objects.get(autor=self.data['autor'], - materia=materia) - raise forms.ValidationError( - _('Essa autoria já foi adicionada!')) - except ObjectDoesNotExist: - pass + 'partido'] def __init__(self, excluir=False, *args, **kwargs): @@ -699,3 +690,109 @@ class MateriaLegislativaPesquisaForm(ModelForm): ) super(MateriaLegislativaPesquisaForm, self).__init__( *args, **kwargs) + + +class MateriaLegislativaPesquisaFields(FilterSet): + + # autor = django_filters.ChoiceFilter( + # label='Autor', + # required=False, + # queryset=Autor.objects.all().order_by('tipo'), + # empty_label='Selecione', + # ) + + # # relatores são os parlamentares ativos? + # relatoria__parlamentar__id = django_filters.ChoiceFilter( + # label='Relator', + # required=False, + # queryset=Parlamentar.objects.all().order_by('nome_parlamentar'), + # empty_label='Selecione', + # ) + + # tipo = django_filters.ChoiceFilter( + # label=_('Tipo de Matéria'), + # required=False, + # queryset=TipoMateriaLegislativa.objects.all(), + # empty_label='Selecione', + # ) + + # data_apresentacao = django_filters.DateFilter( + # label=u'Data de Apresentação', + # input_formats=['%d/%m/%Y'], + # required=False, + # widget=forms.DateInput( + # format='%d/%m/%Y', + # attrs={'class': 'dateinput'})) + + # data_publicacao = django_filters.DateFilter( + # label=u'Data da Publicação', + # input_formats=['%d/%m/%Y'], + # required=False, + # widget=forms.DateInput( + # format='%d/%m/%Y', + # attrs={'class': 'dateinput'})) + + numero = django_filters.CharFilter(required=False, + label=u'Número da Matéria') + numero_protocolo = django_filters.CharFilter(required=False, + label=u'Núm. Protocolo') + ano = django_filters.CharFilter(required=False, + label=u'Ano da Matéria') + ementa__icontains = django_filters.CharFilter(required=False, + label=u'Assunto') + + # tramitacao__unidade_tramitacao_destino = django_filters.ChoiceFilter( + # label=_('Localização Atual'), + # required=False, + # queryset=UnidadeTramitacao.objects.all(), + # empty_label='Selecione', + # ) + + # tramitacao__status = django_filters.ChoiceFilter( + # label='Situação', + # required=False, + # queryset=StatusTramitacao.objects.all(), + # empty_label='Selecione', + # ) + + # em_tramitacao = django_filters.ChoiceFilter(required=False, + # label='Tramitando', + # choices=em_tramitacao(), + # widget=forms.Select( + # attrs={'class': 'selector'})) + + # autoria__autor__tipo = django_filters.ChoiceFilter( + # label=_('Tipo Autor'), + # required=False, + # queryset=TipoAutor.objects.all(), + # empty_label='Selecione', + # ) + + # autoria__partido = django_filters.ChoiceFilter( + # label=_('Partido (Autor)'), + # required=False, + # queryset=Partido.objects.all(), + # empty_label='Selecione') + + # local_origem_externa = django_filters.ChoiceFilter( + # label=_('Localização de Origem'), + # required=False, + # queryset=Origem.objects.all(), + # empty_label='Selecione') + + class Meta: + models = MateriaLegislativa + fields = ['tipo', + 'ano', + 'numero_protocolo', + 'data_apresentacao', + 'data_publicacao', + 'em_tramitacao', + 'ementa__icontains', + 'autoria__autor__id', + 'relatoria__parlamentar__id', + 'tramitacao__unidade_tramitacao_destino', + 'tramitacao__status', + 'autoria__autor__tipo', + 'autoria__partido', + 'local_origem_externa'] diff --git a/materia/views.py b/materia/views.py index 11e28f5c4..308320b0d 100644 --- a/materia/views.py +++ b/materia/views.py @@ -1,4 +1,5 @@ -import os +from django_filters.views import FilterView + from datetime import datetime from random import choice from string import ascii_letters, digits @@ -25,7 +26,7 @@ from .forms import (AcompanhamentoMateriaForm, AutoriaForm, DespachoInicialForm, DocumentoAcessorioForm, FormularioCadastroForm, FormularioSimplificadoForm, LegislacaoCitadaForm, MateriaAnexadaForm, - MateriaLegislativaPesquisaForm, NumeracaoForm, + MateriaLegislativaPesquisaFields, NumeracaoForm, ProposicaoForm, RelatoriaForm, TramitacaoForm) from .models import (AcompanhamentoMateria, Anexada, Autor, Autoria, DespachoInicial, DocumentoAcessorio, MateriaLegislativa, @@ -1191,118 +1192,30 @@ class ProposicaoListView(ListView): return context -class MateriaLegislativaPesquisaView(FormView): - template_name = 'materia/pesquisa_materia.html' - - def get_success_url(self): - return reverse('materia:pesquisar_materia') - - def get(self, request, *args, **kwargs): - form = MateriaLegislativaPesquisaForm() - return self.render_to_response({'form': form}) - - def post(self, request, *args, **kwargs): - kwargs = {} - form = MateriaLegislativaPesquisaForm(request.POST) - - if form.data['tipo']: - kwargs['tipo'] = form.data['tipo'] - - if form.data['numero']: - kwargs['numero'] = form.data['numero'] - - if form.data['ano']: - kwargs['ano'] = form.data['ano'] - - if form.data['numero_protocolo']: - kwargs['numero_protocolo'] = form.data['numero_protocolo'] - - if (form.data['apresentacao_inicial'] and - form.data['apresentacao_final']): - kwargs['apresentacao_inicial'] = form.data['apresentacao_inicial'] - kwargs['apresentacao_final'] = form.data['apresentacao_final'] - - if (form.data['publicacao_inicial'] and - form.data['publicacao_final']): - kwargs['publicacao_inicial'] = form.data['publicacao_inicial'] - kwargs['publicacao_final'] = form.data['publicacao_final'] - - if form.data['local_origem_externa']: - kwargs['local_origem_externa'] = form.data['local_origem_externa'] - - if form.data['autor']: - kwargs['autor'] = form.data['autor'] - - if form.data['localizacao']: - kwargs['localizacao'] = form.data['localizacao'] - - if form.data['em_tramitacao']: - kwargs['em_tramitacao'] = form.data['em_tramitacao'] - - if form.data['situacao']: - kwargs['situacao'] = form.data['situacao'] - - request.session['kwargs'] = kwargs +class MateriaLegislativaPesquisaView(FilterView): + model = MateriaLegislativa + filterset_class = MateriaLegislativaPesquisaFields + paginate_by = 10 - return redirect('materia:pesquisar_materia_list') + def get_context_data(self, **kwargs): + context = super(MateriaLegislativaPesquisaView, + self).get_context_data(**kwargs) + paginator = context['paginator'] + page_obj = context['page_obj'] -class PesquisaMateriaListView(ListView): - template_name = 'materia/pesquisa_materia_list.html' - context_object_name = 'materias' - model = MateriaLegislativa - paginate_by = 10 + context['page_range'] = make_pagination( + page_obj.number, paginator.num_pages) + return context - def get_queryset(self): - kwargs = self.request.session['kwargs'] - - materias = MateriaLegislativa.objects.all().order_by( - '-numero', '-ano') - - if 'apresentacao_inicial' in kwargs: - inicial = datetime.strptime( - kwargs['apresentacao_inicial'], - '%d/%m/%Y').strftime('%Y-%m-%d') - final = datetime.strptime( - kwargs['apresentacao_final'], - '%d/%m/%Y').strftime('%Y-%m-%d') - materias = materias.filter( - data_apresentacao__range=(inicial, final)) - - if 'publicacao_inicial' in kwargs: - inicial = datetime.strptime( - kwargs['publicacao_inicial'], - '%d/%m/%Y').strftime('%Y-%m-%d') - final = datetime.strptime( - kwargs['publicacao_final'], - '%d/%m/%Y').strftime('%Y-%m-%d') - materias = materias.filter( - data_publicacao__range=(inicial, final)) - - if 'tipo' in kwargs: - materias = materias.filter(tipo_id=kwargs['tipo']) - - if 'numero' in kwargs: - materias = materias.filter(numero=kwargs['numero']) - - if 'ano' in kwargs: - materias = materias.filter(ano=kwargs['ano']) - - if 'numero_protocolo' in kwargs: - materias = materias.filter(numero=kwargs['numero_protocolo']) - - if 'em_tramitacao' in kwargs: - materias = materias.filter(em_tramitacao=kwargs['em_tramitacao']) - - if 'local_origem_externa' in kwargs: - materias = materias.filter( - local_origem_externa=kwargs['local_origem_externa']) - - # autor - # localizao atual - # situacao - - return materias + def get(self, request, *args, **kwargs): + # import ipdb; ipdb.set_trace() + filterset_class = self.get_filterset_class() + self.filterset = self.get_filterset(filterset_class) + self.object_list = self.filterset.qs + context = self.get_context_data(filter=self.filterset, + object_list=self.object_list) + return self.render_to_response(context) class ProposicaoView(CreateView): diff --git a/requirements/requirements.txt b/requirements/requirements.txt index 5b3d8bc2d..d5626bbff 100644 --- a/requirements/requirements.txt +++ b/requirements/requirements.txt @@ -7,6 +7,7 @@ django-compressor==2.0 django-crispy-forms==1.6.0 python-decouple==3.0 django-extra-views==0.7.1 +django-filter==0.13.0 django-model-utils==2.4 django-sass-processor==0.3.4 django==1.9 diff --git a/templates/materia/materialegislativa_filter.html b/templates/materia/materialegislativa_filter.html new file mode 100644 index 000000000..277911414 --- /dev/null +++ b/templates/materia/materialegislativa_filter.html @@ -0,0 +1,29 @@ +{% extends "materia/materialegislativa_detail.html" %} +{% load i18n %} +{% load crispy_forms_tags %} +{% block actions %}{% endblock %} +{% block sections_nav %} {% endblock %} +{% block detail_content %} + +
+ {{ filter.form.as_p }} + +
+ + + + + + {% for m in page_obj %} + + + {% endfor %} +

Resultados

+ {{m.tipo.sigla}} {{m.numero}}/{{m.ano}} - {{m.tipo}}
+ {{ m.ementa|safe }}
+ Localização Atual: {{m.tramitacao_set.last.unidade_tramitacao_destino|default_if_none:"Não Informada"}}
+

+
+{% include "paginacao.html" %} + +{% endblock detail_content %} \ No newline at end of file