Browse Source

Refatora pesquisa de materia

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

167
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,57 +547,12 @@ class AutoriaForm(ModelForm):
*args, **kwargs) *args, **kwargs)
class MateriaLegislativaPesquisaForm(forms.Form): class MateriaLegislativaPesquisaForm(ModelForm):
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')
ordem = forms.ChoiceField(required=False, autor = forms.CharField(widget=forms.HiddenInput(), required=False)
label='Ordenação',
choices=ORDENACAO_MATERIAIS,
widget=forms.Select(
attrs={'class': 'selector'}))
localizacao = forms.ModelChoiceField( localizacao = forms.ModelChoiceField(
label=_('Localização Atual'), label='Localização Atual',
required=False, required=False,
queryset=UnidadeTramitacao.objects.all(), queryset=UnidadeTramitacao.objects.all(),
empty_label='Selecione', empty_label='Selecione',
@ -608,36 +565,55 @@ class MateriaLegislativaPesquisaForm(forms.Form):
empty_label='Selecione', empty_label='Selecione',
) )
tramitacao = forms.ChoiceField(required=False, em_tramitacao = forms.ChoiceField(required=False,
label='Tramitando', label='Tramitando',
choices=EM_TRAMITACAO, choices=em_tramitacao(),
widget=forms.Select( widget=forms.Select(
attrs={'class': 'selector'})) attrs={'class': 'selector'}))
tipo_autor = forms.ModelChoiceField( publicacao_inicial = forms.DateField(label=u'Data Publicação Inicial',
label=_('Tipo Autor'), input_formats=['%d/%m/%Y'],
required=False, required=False,
queryset=TipoAutor.objects.all(), widget=forms.DateInput(
empty_label='Selecione', format='%d/%m/%Y',
) attrs={'class': 'dateinput'}))
partido_autor = forms.ModelChoiceField( publicacao_final = forms.DateField(label=u'Data Publicação Final',
label=_('Partido (Autor)'), input_formats=['%d/%m/%Y'],
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_inicial = forms.DateField(label=u'Data Apresentação Inicial',
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'}))
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 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)

216
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']: if form.data['tipo']:
kwargs['tipo'] = request.POST['tipo'] kwargs['tipo'] = form.data['tipo']
if request.POST['numero']: if form.data['numero']:
try: kwargs['numero'] = form.data['numero']
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['ano']:
try: kwargs['ano'] = form.data['ano']
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_protocolo']:
try: kwargs['numero_protocolo'] = form.data['numero_protocolo']
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 request.POST['data_publicacao']: if (form.data['apresentacao_inicial'] and
try: form.data['apresentacao_final']):
datetime.strptime( kwargs['apresentacao_inicial'] = form.data['apresentacao_inicial']
request.POST['data_publicacao'], kwargs['apresentacao_final'] = form.data['apresentacao_final']
'%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['publicacao_inicial'] and
kwargs['em_tramitacao'] = request.POST['tramitacao'] 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 é if form.data['local_origem_externa']:
# case-sensitive kwargs['local_origem_externa'] = form.data['local_origem_externa']
if request.POST['assunto']:
kwargs['ementa__icontains'] = request.POST['assunto']
if request.POST['autor']: if form.data['autor']:
kwargs['autoria__autor__id'] = request.POST['autor'] kwargs['autor'] = form.data['autor']
if request.POST['relator']: if form.data['localizacao']:
kwargs['relatoria__parlamentar__id'] = request.POST['relator'] kwargs['localizacao'] = form.data['localizacao']
if request.POST['localizacao']: if form.data['em_tramitacao']:
local = request.POST['localizacao'] kwargs['em_tramitacao'] = form.data['em_tramitacao']
kwargs['tramitacao__unidade_tramitacao_destino'] = local
if request.POST['situacao']: if form.data['situacao']:
kwargs['tramitacao__status'] = request.POST['situacao'] kwargs['situacao'] = form.data['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']
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() if 'apresentacao_inicial' in kwargs:
else: inicial = datetime.strptime(
lista_materias = MateriaLegislativa.objects.filter( kwargs['apresentacao_inicial'],
**kwargs).order_by('-ano', '-numero').distinct() '%d/%m/%Y').strftime('%Y-%m-%d')
final = datetime.strptime(
materias = [] kwargs['apresentacao_final'],
'%d/%m/%Y').strftime('%Y-%m-%d')
# Garante que a pesquisa retornará a última tramitação materias = materias.filter(
if (kwargs.get('tramitacao__unidade_tramitacao_destino') and data_apresentacao__range=(inicial, final))
kwargs.get('tramitacao__status')):
local = int(kwargs['tramitacao__unidade_tramitacao_destino']) if 'publicacao_inicial' in kwargs:
status = int(kwargs['tramitacao__status']) inicial = datetime.strptime(
for m in lista_materias: kwargs['publicacao_inicial'],
l = m.tramitacao_set.last().unidade_tramitacao_destino_id '%d/%m/%Y').strftime('%Y-%m-%d')
s = m.tramitacao_set.last().status_id final = datetime.strptime(
if l == local and s == status: kwargs['publicacao_final'],
materias.append(m) '%d/%m/%Y').strftime('%Y-%m-%d')
return materias materias = materias.filter(
data_publicacao__range=(inicial, final))
if kwargs.get('tramitacao__unidade_tramitacao_destino'):
local = int(kwargs['tramitacao__unidade_tramitacao_destino']) if 'tipo' in kwargs:
for m in lista_materias: materias = materias.filter(tipo_id=kwargs['tipo'])
l = m.tramitacao_set.last().unidade_tramitacao_destino_id
if l == local: if 'numero' in kwargs:
materias.append(m) materias = materias.filter(numero=kwargs['numero'])
return materias
if 'ano' in kwargs:
if kwargs.get('tramitacao__status'): materias = materias.filter(ano=kwargs['ano'])
status = int(kwargs['tramitacao__status'])
for m in lista_materias: if 'numero_protocolo' in kwargs:
s = m.tramitacao_set.last().status_id materias = materias.filter(numero=kwargs['numero_protocolo'])
if s == status:
materias.append(m) if 'em_tramitacao' in kwargs:
return materias materias = materias.filter(em_tramitacao=kwargs['em_tramitacao'])
else: if 'local_origem_externa' in kwargs:
return lista_materias materias = materias.filter(
local_origem_externa=kwargs['local_origem_externa'])
def get_context_data(self, **kwargs):
context = super(PesquisaMateriaListView, self).get_context_data( # autor
**kwargs) # localizao atual
# situacao
paginator = context['paginator']
page_obj = context['page_obj'] return materias
context['page_range'] = make_pagination(
page_obj.number, paginator.num_pages)
return context
class ProposicaoView(CreateView): class ProposicaoView(CreateView):

Loading…
Cancel
Save