From c602c76db51daff9996579295f1489ca18ff182b Mon Sep 17 00:00:00 2001 From: Eduardo Edson Batista Cordeiro Alves Date: Mon, 14 Mar 2016 11:11:30 -0300 Subject: [PATCH] Refatora pesquisa de materia --- materia/forms.py | 167 ++++++++++++++++-------------------- materia/views.py | 216 ++++++++++++++++------------------------------- 2 files changed, 148 insertions(+), 235 deletions(-) diff --git a/materia/forms.py b/materia/forms.py index bb49c677c..a8e7cbe2d 100644 --- a/materia/forms.py +++ b/materia/forms.py @@ -1,9 +1,9 @@ from crispy_forms.helper import FormHelper -from crispy_forms.layout import Column, Fieldset, Layout, Submit +from crispy_forms.layout import Column, Fieldset, Layout, Submit, Button, HTML from django import forms from django.forms import ModelForm from django.utils.translation import ugettext_lazy as _ - +import sapl import crispy_layout_mixin from crispy_layout_mixin import form_actions from norma.models import LegislacaoCitada, TipoNormaJuridica @@ -15,14 +15,16 @@ from .models import (AcompanhamentoMateria, Anexada, Autor, Autoria, StatusTramitacao, TipoAutor, TipoMateriaLegislativa, Tramitacao, UnidadeTramitacao) -EM_TRAMITACAO = [('', _('Tanto Faz')), - (True, 'Sim'), - (False, 'Não')] - ORDENACAO_MATERIAIS = [(1, 'Crescente'), (2, 'Decrescente')] +def em_tramitacao(): + return [('', 'Tanto Faz'), + (True, 'Sim'), + (False, 'Não')] + + class ProposicaoForm(ModelForm): tipo_materia = forms.ModelChoiceField( @@ -545,57 +547,12 @@ class AutoriaForm(ModelForm): *args, **kwargs) -class MateriaLegislativaPesquisaForm(forms.Form): - - autor = forms.ModelChoiceField( - label='Autor', - required=False, - queryset=Autor.objects.all().order_by('tipo'), - empty_label='Selecione', - ) - - # relatores são os parlamentares ativos? - relator = forms.ModelChoiceField( - label='Relator', - required=False, - queryset=Parlamentar.objects.all().order_by('nome_parlamentar'), - empty_label='Selecione', - ) - - tipo = forms.ModelChoiceField( - label=_('Tipo de Matéria'), - required=False, - queryset=TipoMateriaLegislativa.objects.all(), - empty_label='Selecione', - ) - - data_apresentacao = forms.DateField(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 = forms.DateField(label=u'Data da Publicação', - input_formats=['%d/%m/%Y'], - required=False, - widget=forms.DateInput( - format='%d/%m/%Y', - attrs={'class': 'dateinput'})) - - numero = forms.CharField(required=False, label=u'Número da Matéria') - numero_protocolo = forms.CharField(required=False, label=u'Núm. Protocolo') - ano = forms.CharField(required=False, label=u'Ano da Matéria') - assunto = forms.CharField(required=False, label=u'Assunto') +class MateriaLegislativaPesquisaForm(ModelForm): - ordem = forms.ChoiceField(required=False, - label='Ordenação', - choices=ORDENACAO_MATERIAIS, - widget=forms.Select( - attrs={'class': 'selector'})) + autor = forms.CharField(widget=forms.HiddenInput(), required=False) localizacao = forms.ModelChoiceField( - label=_('Localização Atual'), + label='Localização Atual', required=False, queryset=UnidadeTramitacao.objects.all(), empty_label='Selecione', @@ -608,36 +565,55 @@ class MateriaLegislativaPesquisaForm(forms.Form): empty_label='Selecione', ) - tramitacao = forms.ChoiceField(required=False, - label='Tramitando', - choices=EM_TRAMITACAO, - widget=forms.Select( - attrs={'class': 'selector'})) + em_tramitacao = forms.ChoiceField(required=False, + label='Tramitando', + choices=em_tramitacao(), + widget=forms.Select( + attrs={'class': 'selector'})) - tipo_autor = forms.ModelChoiceField( - label=_('Tipo Autor'), - required=False, - queryset=TipoAutor.objects.all(), - empty_label='Selecione', - ) + publicacao_inicial = forms.DateField(label=u'Data Publicação Inicial', + input_formats=['%d/%m/%Y'], + required=False, + widget=forms.DateInput( + format='%d/%m/%Y', + attrs={'class': 'dateinput'})) - partido_autor = forms.ModelChoiceField( - label=_('Partido (Autor)'), - required=False, - queryset=Partido.objects.all(), - empty_label='Selecione') + publicacao_final = forms.DateField(label=u'Data Publicação Final', + input_formats=['%d/%m/%Y'], + required=False, + widget=forms.DateInput( + format='%d/%m/%Y', + attrs={'class': 'dateinput'})) - local_origem_externa = forms.ModelChoiceField( - label=_('Localização de Origem'), - required=False, - queryset=Origem.objects.all(), - empty_label='Selecione') + apresentacao_inicial = forms.DateField(label=u'Data Apresentação Inicial', + input_formats=['%d/%m/%Y'], + required=False, + widget=forms.DateInput( + format='%d/%m/%Y', + attrs={'class': 'dateinput'})) + + apresentacao_final = forms.DateField(label=u'Data Apresentação Final', + input_formats=['%d/%m/%Y'], + required=False, + widget=forms.DateInput( + format='%d/%m/%Y', + attrs={'class': 'dateinput'})) - # TODO: Verificar se esses campos estão corretos - # assunto? # -> usado 'ementa' em 'assunto' - # localizacao atual? # - # situacao? # - # tramitando? # + class Meta: + model = MateriaLegislativa + fields = ['tipo', + 'numero', + 'ano', + 'numero_protocolo', + 'apresentacao_inicial', + 'apresentacao_final', + 'publicacao_inicial', + 'publicacao_final', + 'autor', + 'local_origem_externa', + 'localizacao', + 'em_tramitacao', + 'situacao'] def __init__(self, *args, **kwargs): @@ -648,29 +624,34 @@ class MateriaLegislativaPesquisaForm(forms.Form): ('ano', 4), ('numero_protocolo', 4)]) row3 = crispy_layout_mixin.to_row( - [('data_apresentacao', 6), - ('data_publicacao', 6)]) + [('apresentacao_inicial', 6), + ('apresentacao_final', 6)]) row4 = crispy_layout_mixin.to_row( - [('autor', 6), - ('partido_autor', 6)]) + [('publicacao_inicial', 6), + ('publicacao_final', 6)]) row5 = crispy_layout_mixin.to_row( - [('tipo_autor', 6), - ('relator', 6)]) + [('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)]) row6 = crispy_layout_mixin.to_row( [('local_origem_externa', 6), ('localizacao', 6)]) row7 = crispy_layout_mixin.to_row( - [('tramitacao', 4), - ('situacao', 4), - ('ordem', 4)]) - row8 = crispy_layout_mixin.to_row( - [('assunto', 12)]) + [('em_tramitacao', 6), + ('situacao', 6)]) self.helper = FormHelper() self.helper.layout = Layout( Fieldset(_('Pesquisa Básica'), - row1, row2, row3, row4, row5, row6, row7, row8), - form_actions(save_label='Pesquisar') + row1, row2, row3, row4, + HTML(sapl.utils.autor_label), + HTML(sapl.utils.autor_modal), + row5, row6, row7, + form_actions(save_label='Pesquisar')) ) super(MateriaLegislativaPesquisaForm, self).__init__( *args, **kwargs) diff --git a/materia/views.py b/materia/views.py index 2247796ea..0200e0d34 100644 --- a/materia/views.py +++ b/materia/views.py @@ -1220,108 +1220,44 @@ class MateriaLegislativaPesquisaView(FormView): def post(self, request, *args, **kwargs): kwargs = {} - form = MateriaLegislativaPesquisaForm() - # TODO: Autor, Relator, Localização, Origem + form = MateriaLegislativaPesquisaForm(request.POST) - if request.POST['tipo']: - kwargs['tipo'] = request.POST['tipo'] + if form.data['tipo']: + kwargs['tipo'] = form.data['tipo'] - if request.POST['numero']: - try: - int(request.POST['numero']) - except ValueError: - mensagem = _("Insira um número inteiro em matéria!") - messages.add_message(request, messages.INFO, mensagem) - return self.render_to_response( - {'form': form}) - else: - kwargs['numero'] = request.POST['numero'] + if form.data['numero']: + kwargs['numero'] = form.data['numero'] - if request.POST['ano']: - try: - int(request.POST['ano']) - except ValueError: - mensagem = _("Insira uma data válida em Ano da Matéria!") - messages.add_message(request, messages.INFO, mensagem) - return self.render_to_response( - {'form': form}) - else: - kwargs['ano'] = request.POST['ano'] + if form.data['ano']: + kwargs['ano'] = form.data['ano'] - if request.POST['numero_protocolo']: - try: - int(request.POST['numero_protocolo']) - except ValueError: - mensagem = _("Insira um Número de Protocolo válido!") - messages.add_message(request, messages.INFO, mensagem) - return self.render_to_response( - {'form': form}) - else: - kwargs['numero_protocolo'] = request.POST['numero_protocolo'] - - if request.POST['data_apresentacao']: - try: - datetime.strptime( - request.POST['data_apresentacao'], - '%d/%m/%Y').strftime('%Y-%m-%d') - except ValueError: - mensagem = _("Insira uma Data de Apresentação válida!") - messages.add_message(request, messages.INFO, mensagem) - return self.render_to_response( - {'form': form}) - else: - kwargs['data_apresentacao'] = datetime.strptime( - request.POST['data_apresentacao'], - '%d/%m/%Y').strftime('%Y-%m-%d') + if form.data['numero_protocolo']: + kwargs['numero_protocolo'] = form.data['numero_protocolo'] - if request.POST['data_publicacao']: - try: - datetime.strptime( - request.POST['data_publicacao'], - '%d/%m/%Y').strftime('%Y-%m-%d') - except ValueError: - mensagem = _("Insira uma Data de Publicação válida!") - messages.add_message(request, messages.INFO, mensagem) - return self.render_to_response( - {'form': form}) - else: - kwargs['data_publicacao'] = datetime.strptime( - request.POST['data_publicacao'], - '%d/%m/%Y').strftime('%Y-%m-%d') + 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 request.POST['tramitacao']: - kwargs['em_tramitacao'] = request.POST['tramitacao'] + if (form.data['publicacao_inicial'] and + form.data['publicacao_final']): + kwargs['publicacao_inicial'] = form.data['publicacao_inicial'] + kwargs['publicacao_final'] = form.data['publicacao_final'] - # Pega "palavras-chaves" que podem ter na ementa, icontains NÃO é - # case-sensitive - if request.POST['assunto']: - kwargs['ementa__icontains'] = request.POST['assunto'] + if form.data['local_origem_externa']: + kwargs['local_origem_externa'] = form.data['local_origem_externa'] - if request.POST['autor']: - kwargs['autoria__autor__id'] = request.POST['autor'] + if form.data['autor']: + kwargs['autor'] = form.data['autor'] - if request.POST['relator']: - kwargs['relatoria__parlamentar__id'] = request.POST['relator'] + if form.data['localizacao']: + kwargs['localizacao'] = form.data['localizacao'] - if request.POST['localizacao']: - local = request.POST['localizacao'] - kwargs['tramitacao__unidade_tramitacao_destino'] = local + if form.data['em_tramitacao']: + kwargs['em_tramitacao'] = form.data['em_tramitacao'] - if request.POST['situacao']: - kwargs['tramitacao__status'] = request.POST['situacao'] - - if request.POST['tipo_autor']: - kwargs['autoria__autor__tipo'] = request.POST['tipo_autor'] - - if request.POST['partido_autor']: - kwargs['autoria__partido'] = request.POST['partido_autor'] - - if request.POST['ordem']: - kwargs['ordem'] = request.POST['ordem'] - - if request.POST['local_origem_externa']: - kwargs['local_origem_externa'] = request.POST[ - 'local_origem_externa'] + if form.data['situacao']: + kwargs['situacao'] = form.data['situacao'] request.session['kwargs'] = kwargs return redirect('pesquisar_materia_list') @@ -1336,57 +1272,53 @@ class PesquisaMateriaListView(ListView): def get_queryset(self): kwargs = self.request.session['kwargs'] - ordem = int(kwargs.pop('ordem')) - if ordem == 1: - lista_materias = MateriaLegislativa.objects.filter( - **kwargs).order_by('ano', 'numero').distinct() - else: - lista_materias = MateriaLegislativa.objects.filter( - **kwargs).order_by('-ano', '-numero').distinct() - - materias = [] - - # Garante que a pesquisa retornará a última tramitação - if (kwargs.get('tramitacao__unidade_tramitacao_destino') and - kwargs.get('tramitacao__status')): - local = int(kwargs['tramitacao__unidade_tramitacao_destino']) - status = int(kwargs['tramitacao__status']) - for m in lista_materias: - l = m.tramitacao_set.last().unidade_tramitacao_destino_id - s = m.tramitacao_set.last().status_id - if l == local and s == status: - materias.append(m) - return materias - - if kwargs.get('tramitacao__unidade_tramitacao_destino'): - local = int(kwargs['tramitacao__unidade_tramitacao_destino']) - for m in lista_materias: - l = m.tramitacao_set.last().unidade_tramitacao_destino_id - if l == local: - materias.append(m) - return materias - - if kwargs.get('tramitacao__status'): - status = int(kwargs['tramitacao__status']) - for m in lista_materias: - s = m.tramitacao_set.last().status_id - if s == status: - materias.append(m) - return materias - - else: - return lista_materias - - def get_context_data(self, **kwargs): - context = super(PesquisaMateriaListView, self).get_context_data( - **kwargs) - - paginator = context['paginator'] - page_obj = context['page_obj'] - - context['page_range'] = make_pagination( - page_obj.number, paginator.num_pages) - return context + 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 class ProposicaoView(CreateView):