Browse Source

Refatora pesquisa de materia

pull/258/head
Eduardo Edson Batista Cordeiro Alves 9 years ago
parent
commit
c602c76db5
  1. 153
      materia/forms.py
  2. 204
      materia/views.py

153
materia/forms.py

@ -1,9 +1,9 @@
from crispy_forms.helper import FormHelper 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 import forms
from django.forms import ModelForm from django.forms import ModelForm
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
import sapl
import crispy_layout_mixin import crispy_layout_mixin
from crispy_layout_mixin import form_actions from crispy_layout_mixin import form_actions
from norma.models import LegislacaoCitada, TipoNormaJuridica from norma.models import LegislacaoCitada, TipoNormaJuridica
@ -15,14 +15,16 @@ from .models import (AcompanhamentoMateria, Anexada, Autor, Autoria,
StatusTramitacao, TipoAutor, TipoMateriaLegislativa, StatusTramitacao, TipoAutor, TipoMateriaLegislativa,
Tramitacao, UnidadeTramitacao) Tramitacao, UnidadeTramitacao)
EM_TRAMITACAO = [('', _('Tanto Faz')),
(True, 'Sim'),
(False, 'Não')]
ORDENACAO_MATERIAIS = [(1, 'Crescente'), ORDENACAO_MATERIAIS = [(1, 'Crescente'),
(2, 'Decrescente')] (2, 'Decrescente')]
def em_tramitacao():
return [('', 'Tanto Faz'),
(True, 'Sim'),
(False, 'Não')]
class ProposicaoForm(ModelForm): class ProposicaoForm(ModelForm):
tipo_materia = forms.ModelChoiceField( tipo_materia = forms.ModelChoiceField(
@ -545,99 +547,73 @@ class AutoriaForm(ModelForm):
*args, **kwargs) *args, **kwargs)
class MateriaLegislativaPesquisaForm(forms.Form): class MateriaLegislativaPesquisaForm(ModelForm):
autor = forms.ModelChoiceField( autor = forms.CharField(widget=forms.HiddenInput(), required=False)
label='Autor',
required=False,
queryset=Autor.objects.all().order_by('tipo'),
empty_label='Selecione',
)
# relatores são os parlamentares ativos? localizacao = forms.ModelChoiceField(
relator = forms.ModelChoiceField( label='Localização Atual',
label='Relator',
required=False, required=False,
queryset=Parlamentar.objects.all().order_by('nome_parlamentar'), queryset=UnidadeTramitacao.objects.all(),
empty_label='Selecione', empty_label='Selecione',
) )
tipo = forms.ModelChoiceField( situacao = forms.ModelChoiceField(
label=_('Tipo de Matéria'), label='Situação',
required=False, required=False,
queryset=TipoMateriaLegislativa.objects.all(), queryset=StatusTramitacao.objects.all(),
empty_label='Selecione', empty_label='Selecione',
) )
data_apresentacao = forms.DateField(label=u'Data de Apresentação', em_tramitacao = forms.ChoiceField(required=False,
label='Tramitando',
choices=em_tramitacao(),
widget=forms.Select(
attrs={'class': 'selector'}))
publicacao_inicial = forms.DateField(label=u'Data Publicação Inicial',
input_formats=['%d/%m/%Y'], input_formats=['%d/%m/%Y'],
required=False, required=False,
widget=forms.DateInput( widget=forms.DateInput(
format='%d/%m/%Y', format='%d/%m/%Y',
attrs={'class': 'dateinput'})) attrs={'class': 'dateinput'}))
data_publicacao = forms.DateField(label=u'Data da Publicação', publicacao_final = forms.DateField(label=u'Data Publicação Final',
input_formats=['%d/%m/%Y'], input_formats=['%d/%m/%Y'],
required=False, required=False,
widget=forms.DateInput( widget=forms.DateInput(
format='%d/%m/%Y', format='%d/%m/%Y',
attrs={'class': 'dateinput'})) attrs={'class': 'dateinput'}))
numero = forms.CharField(required=False, label=u'Número da Matéria') apresentacao_inicial = forms.DateField(label=u'Data Apresentação Inicial',
numero_protocolo = forms.CharField(required=False, label=u'Núm. Protocolo') input_formats=['%d/%m/%Y'],
ano = forms.CharField(required=False, label=u'Ano da Matéria')
assunto = forms.CharField(required=False, label=u'Assunto')
ordem = forms.ChoiceField(required=False,
label='Ordenação',
choices=ORDENACAO_MATERIAIS,
widget=forms.Select(
attrs={'class': 'selector'}))
localizacao = forms.ModelChoiceField(
label=_('Localização Atual'),
required=False,
queryset=UnidadeTramitacao.objects.all(),
empty_label='Selecione',
)
situacao = forms.ModelChoiceField(
label='Situação',
required=False,
queryset=StatusTramitacao.objects.all(),
empty_label='Selecione',
)
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',
)
partido_autor = forms.ModelChoiceField(
label=_('Partido (Autor)'),
required=False, required=False,
queryset=Partido.objects.all(), widget=forms.DateInput(
empty_label='Selecione') format='%d/%m/%Y',
attrs={'class': 'dateinput'}))
local_origem_externa = forms.ModelChoiceField( apresentacao_final = forms.DateField(label=u'Data Apresentação Final',
label=_('Localização de Origem'), input_formats=['%d/%m/%Y'],
required=False, required=False,
queryset=Origem.objects.all(), widget=forms.DateInput(
empty_label='Selecione') format='%d/%m/%Y',
attrs={'class': 'dateinput'}))
# TODO: Verificar se esses campos estão corretos class Meta:
# assunto? # -> usado 'ementa' em 'assunto' model = MateriaLegislativa
# localizacao atual? # fields = ['tipo',
# situacao? # 'numero',
# tramitando? # 'ano',
'numero_protocolo',
'apresentacao_inicial',
'apresentacao_final',
'publicacao_inicial',
'publicacao_final',
'autor',
'local_origem_externa',
'localizacao',
'em_tramitacao',
'situacao']
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
@ -648,29 +624,34 @@ class MateriaLegislativaPesquisaForm(forms.Form):
('ano', 4), ('ano', 4),
('numero_protocolo', 4)]) ('numero_protocolo', 4)])
row3 = crispy_layout_mixin.to_row( row3 = crispy_layout_mixin.to_row(
[('data_apresentacao', 6), [('apresentacao_inicial', 6),
('data_publicacao', 6)]) ('apresentacao_final', 6)])
row4 = crispy_layout_mixin.to_row( row4 = crispy_layout_mixin.to_row(
[('autor', 6), [('publicacao_inicial', 6),
('partido_autor', 6)]) ('publicacao_final', 6)])
row5 = crispy_layout_mixin.to_row( row5 = crispy_layout_mixin.to_row(
[('tipo_autor', 6), [('autor', 0),
('relator', 6)]) (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( row6 = crispy_layout_mixin.to_row(
[('local_origem_externa', 6), [('local_origem_externa', 6),
('localizacao', 6)]) ('localizacao', 6)])
row7 = crispy_layout_mixin.to_row( row7 = crispy_layout_mixin.to_row(
[('tramitacao', 4), [('em_tramitacao', 6),
('situacao', 4), ('situacao', 6)])
('ordem', 4)])
row8 = crispy_layout_mixin.to_row(
[('assunto', 12)])
self.helper = FormHelper() self.helper = FormHelper()
self.helper.layout = Layout( self.helper.layout = Layout(
Fieldset(_('Pesquisa Básica'), Fieldset(_('Pesquisa Básica'),
row1, row2, row3, row4, row5, row6, row7, row8), row1, row2, row3, row4,
form_actions(save_label='Pesquisar') HTML(sapl.utils.autor_label),
HTML(sapl.utils.autor_modal),
row5, row6, row7,
form_actions(save_label='Pesquisar'))
) )
super(MateriaLegislativaPesquisaForm, self).__init__( super(MateriaLegislativaPesquisaForm, self).__init__(
*args, **kwargs) *args, **kwargs)

204
materia/views.py

@ -1220,108 +1220,44 @@ class MateriaLegislativaPesquisaView(FormView):
def post(self, request, *args, **kwargs): def post(self, request, *args, **kwargs):
kwargs = {} kwargs = {}
form = MateriaLegislativaPesquisaForm() form = MateriaLegislativaPesquisaForm(request.POST)
# TODO: Autor, Relator, Localização, Origem
if request.POST['tipo']:
kwargs['tipo'] = request.POST['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 request.POST['ano']: if form.data['tipo']:
try: kwargs['tipo'] = form.data['tipo']
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 request.POST['numero_protocolo']: if form.data['numero']:
try: kwargs['numero'] = form.data['numero']
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']: if form.data['ano']:
try: kwargs['ano'] = form.data['ano']
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 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 request.POST['tramitacao']: if form.data['numero_protocolo']:
kwargs['em_tramitacao'] = request.POST['tramitacao'] kwargs['numero_protocolo'] = form.data['numero_protocolo']
# Pega "palavras-chaves" que podem ter na ementa, icontains NÃO é if (form.data['apresentacao_inicial'] and
# case-sensitive form.data['apresentacao_final']):
if request.POST['assunto']: kwargs['apresentacao_inicial'] = form.data['apresentacao_inicial']
kwargs['ementa__icontains'] = request.POST['assunto'] kwargs['apresentacao_final'] = form.data['apresentacao_final']
if request.POST['autor']: if (form.data['publicacao_inicial'] and
kwargs['autoria__autor__id'] = request.POST['autor'] form.data['publicacao_final']):
kwargs['publicacao_inicial'] = form.data['publicacao_inicial']
kwargs['publicacao_final'] = form.data['publicacao_final']
if request.POST['relator']: if form.data['local_origem_externa']:
kwargs['relatoria__parlamentar__id'] = request.POST['relator'] kwargs['local_origem_externa'] = form.data['local_origem_externa']
if request.POST['localizacao']: if form.data['autor']:
local = request.POST['localizacao'] kwargs['autor'] = form.data['autor']
kwargs['tramitacao__unidade_tramitacao_destino'] = local
if request.POST['situacao']: if form.data['localizacao']:
kwargs['tramitacao__status'] = request.POST['situacao'] kwargs['localizacao'] = form.data['localizacao']
if request.POST['tipo_autor']: if form.data['em_tramitacao']:
kwargs['autoria__autor__tipo'] = request.POST['tipo_autor'] kwargs['em_tramitacao'] = form.data['em_tramitacao']
if request.POST['partido_autor']: if form.data['situacao']:
kwargs['autoria__partido'] = request.POST['partido_autor'] kwargs['situacao'] = form.data['situacao']
if request.POST['ordem']:
kwargs['ordem'] = request.POST['ordem']
if request.POST['local_origem_externa']:
kwargs['local_origem_externa'] = request.POST[
'local_origem_externa']
request.session['kwargs'] = kwargs request.session['kwargs'] = kwargs
return redirect('pesquisar_materia_list') return redirect('pesquisar_materia_list')
@ -1336,57 +1272,53 @@ class PesquisaMateriaListView(ListView):
def get_queryset(self): def get_queryset(self):
kwargs = self.request.session['kwargs'] kwargs = self.request.session['kwargs']
ordem = int(kwargs.pop('ordem')) materias = MateriaLegislativa.objects.all().order_by(
if ordem == 1: '-numero', '-ano')
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'): if 'apresentacao_inicial' in kwargs:
local = int(kwargs['tramitacao__unidade_tramitacao_destino']) inicial = datetime.strptime(
for m in lista_materias: kwargs['apresentacao_inicial'],
l = m.tramitacao_set.last().unidade_tramitacao_destino_id '%d/%m/%Y').strftime('%Y-%m-%d')
if l == local: final = datetime.strptime(
materias.append(m) kwargs['apresentacao_final'],
return materias '%d/%m/%Y').strftime('%Y-%m-%d')
materias = materias.filter(
data_apresentacao__range=(inicial, final))
if kwargs.get('tramitacao__status'): if 'publicacao_inicial' in kwargs:
status = int(kwargs['tramitacao__status']) inicial = datetime.strptime(
for m in lista_materias: kwargs['publicacao_inicial'],
s = m.tramitacao_set.last().status_id '%d/%m/%Y').strftime('%Y-%m-%d')
if s == status: final = datetime.strptime(
materias.append(m) kwargs['publicacao_final'],
return materias '%d/%m/%Y').strftime('%Y-%m-%d')
materias = materias.filter(
data_publicacao__range=(inicial, final))
else: if 'tipo' in kwargs:
return lista_materias materias = materias.filter(tipo_id=kwargs['tipo'])
def get_context_data(self, **kwargs): if 'numero' in kwargs:
context = super(PesquisaMateriaListView, self).get_context_data( materias = materias.filter(numero=kwargs['numero'])
**kwargs)
paginator = context['paginator'] if 'ano' in kwargs:
page_obj = context['page_obj'] materias = materias.filter(ano=kwargs['ano'])
context['page_range'] = make_pagination( if 'numero_protocolo' in kwargs:
page_obj.number, paginator.num_pages) materias = materias.filter(numero=kwargs['numero_protocolo'])
return context
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): class ProposicaoView(CreateView):

Loading…
Cancel
Save