Browse Source

Fix #391 refatora pesquisa doc adm django filter (#417)

* Refatora a Pesquisa de Documento Adm

* Finaliza a refatoracao da pesquisa por documento administrativo

* Cria o botao de pesquisa por Documento Administrativo

* Faz ir para o menu principal quando clica na logoda aplicacao

* Arruma PEP8

* Arruma alguns detalhes

* Faz modificacoes propostas pela issue 418
fix #418
pull/445/head
eduardocalil 9 years ago
committed by Edward
parent
commit
5ec7945cb2
  1. 2
      materia/forms.py
  2. 97
      protocoloadm/forms.py
  3. 4
      protocoloadm/urls.py
  4. 93
      protocoloadm/views.py
  5. 5
      templates/base.html
  6. 4
      templates/materia/materialegislativa_filter.html
  7. 48
      templates/protocoloadm/documentoadministrativo_filter.html
  8. 66
      templates/protocoloadm/pesquisa_doc_adm.html
  9. 6
      templates/protocoloadm/protocolo_filter.html

2
materia/forms.py

@ -451,7 +451,7 @@ class MateriaLegislativaFilterSet(django_filters.FilterSet):
self.form.helper = FormHelper()
self.form.helper.form_method = 'GET'
self.form.helper.layout = Layout(
Fieldset(_('Pesquisa Básica'),
Fieldset(_('Pesquisa de Matéria'),
row1, row2, row3,
HTML(sapl.utils.autor_label),
HTML(sapl.utils.autor_modal),

97
protocoloadm/forms.py

@ -28,6 +28,10 @@ NATUREZA_PROCESSO = [('', 'Ambos'),
ANO_CHOICES = [('', '---------')] + RANGE_ANOS
EM_TRAMITACAO = [('', 'Tanto Faz'),
(0, 'Sim'),
(1, 'Não')]
class ProtocoloFilterSet(django_filters.FilterSet):
@ -102,11 +106,6 @@ class ProtocoloFilterSet(django_filters.FilterSet):
('tipo_protocolo', 4),
('tipo_materia', 4)])
row3 = crispy_layout_mixin.to_row(
[('tipo_documento', 4),
('tipo_protocolo', 4),
('tipo_materia', 4)])
row3 = crispy_layout_mixin.to_row(
[('interessado', 6),
('assunto_ementa', 6)])
@ -137,6 +136,94 @@ class ProtocoloFilterSet(django_filters.FilterSet):
)
class DocumentoAdministrativoFilterSet(django_filters.FilterSet):
filter_overrides = {models.DateField: {
'filter_class': django_filters.DateFromToRangeFilter,
'extra': lambda f: {
'label': 'Data (%s)' % (_('Inicial - Final')),
'widget': RangeWidgetOverride}
}}
ano = django_filters.ChoiceFilter(required=False,
label=u'Ano',
choices=ANO_CHOICES)
tramitacao = django_filters.ChoiceFilter(required=False,
label=u'Em Tramitação?',
choices=EM_TRAMITACAO)
assunto = django_filters.CharFilter(lookup_expr='icontains')
interessado = django_filters.CharFilter(lookup_expr='icontains')
class Meta:
model = DocumentoAdministrativo
fields = ['tipo',
'numero',
'numero_protocolo',
'data',
'tramitacaoadministrativo__unidade_tramitacao_destino',
'tramitacaoadministrativo__status']
order_by = (
('', 'Selecione'),
('CRE', 'Ordem Crescente'),
('DEC', 'Ordem Decrescente'),
)
order_by_mapping = {
'': [],
'CRE': ['ano', 'numero'],
'DEC': ['-ano', '-numero'],
}
def get_order_by(self, order_value):
if order_value in self.order_by_mapping:
return self.order_by_mapping[order_value]
else:
return super(DocumentoAdministrativoFilterSet,
self).get_order_by(order_value)
def __init__(self, *args, **kwargs):
super(DocumentoAdministrativoFilterSet, self).__init__(*args, **kwargs)
local_atual = 'tramitacaoadministrativo__unidade_tramitacao_destino'
self.filters['tipo'].label = 'Tipo de Documento'
self.filters['tramitacaoadministrativo__status'].label = 'Situação'
self.filters[local_atual].label = 'Localização Atual'
row1 = crispy_layout_mixin.to_row(
[('tipo', 6),
('numero', 6)])
row2 = crispy_layout_mixin.to_row(
[('ano', 4),
('numero_protocolo', 4),
('data', 4)])
row3 = crispy_layout_mixin.to_row(
[('interessado', 4),
('assunto', 4),
('tramitacao', 4)])
row4 = crispy_layout_mixin.to_row(
[('tramitacaoadministrativo__unidade_tramitacao_destino', 6),
('tramitacaoadministrativo__status', 6)])
row5 = crispy_layout_mixin.to_row(
[('o', 12)])
self.form.helper = FormHelper()
self.form.helper.form_method = 'GET'
self.form.helper.layout = Layout(
Fieldset(_('Pesquisar Documento'),
row1, row2,
row3, row4, row5,
form_actions(save_label='Pesquisar'))
)
class AnularProcoloAdmForm(ModelForm):
numero = forms.CharField(required=True,

4
protocoloadm/urls.py

@ -8,7 +8,7 @@ from protocoloadm.views import (AnularProtocoloAdmView,
DocumentoAcessorioAdministrativoEditView,
DocumentoAcessorioAdministrativoView,
DocumentoAdministrativoCrud,
PesquisarDocumentoAdministrativo,
PesquisarDocumentoAdministrativoView,
ProposicaoDetailView, ProposicaoReceberView,
ProposicaoView, ProposicoesIncorporadasView,
ProposicoesNaoIncorporadasView,
@ -57,7 +57,7 @@ urlpatterns = [
url(r'^protocoloadm/protocolar-mat',
ProtocoloMateriaView.as_view(), name='protocolar_mat'),
url(r'^protocoloadm/pesq-doc-adm',
PesquisarDocumentoAdministrativo.as_view(), name='pesq_doc_adm'),
PesquisarDocumentoAdministrativoView.as_view(), name='pesq_doc_adm'),
url(r'^protocoloadm/doc-adm/(?P<pk>\d+)$',
DetailDocumentoAdministrativo.as_view(), name='detail_doc_adm'),
url(r'^protocoloadm/doc-ace-adm/(?P<pk>\d+)',

93
protocoloadm/views.py

@ -17,6 +17,7 @@ from materia.models import Proposicao, TipoMateriaLegislativa
from sapl.utils import create_barcode, get_client_ip
from .forms import (AnularProcoloAdmForm, DocumentoAcessorioAdministrativoForm,
DocumentoAdministrativoFilterSet,
DocumentoAdministrativoForm, ProposicaoSimpleForm,
ProtocoloDocumentForm, ProtocoloFilterSet,
ProtocoloMateriaForm, TramitacaoAdmForm)
@ -358,69 +359,63 @@ class ProposicaoDetailView(DetailView):
return context
class PesquisarDocumentoAdministrativo(TemplateView):
template_name = "protocoloadm/pesquisa_doc_adm.html"
def get_tipos_doc(self):
return TipoDocumentoAdministrativo.objects.all()
def get(self, request, *args, **kwargs):
return self.render_to_response(
{"tipos_doc": TipoDocumentoAdministrativo.objects.all()}
)
class PesquisarDocumentoAdministrativoView(FilterView):
model = DocumentoAdministrativo
filterset_class = DocumentoAdministrativoFilterSet
paginate_by = 10
def post(self, request, *args, **kwargs):
def get_filterset_kwargs(self, filterset_class):
super(PesquisarDocumentoAdministrativoView,
self).get_filterset_kwargs(filterset_class)
if request.POST['tipo_documento']:
kwargs['tipo_id'] = request.POST['tipo_documento']
kwargs = {'data': self.request.GET or None}
if request.POST['numero']:
kwargs['numero'] = request.POST['numero']
qs = self.get_queryset()
if request.POST['ano']:
kwargs['ano'] = request.POST['ano']
qs = qs.distinct()
if request.POST['numero_protocolo']:
kwargs['numero_protocolo'] = request.POST['numero_protocolo']
kwargs.update({
'queryset': qs,
})
return kwargs
if request.POST['periodo_inicial']:
kwargs['periodo_inicial'] = request.POST['periodo_inicial']
def get_context_data(self, **kwargs):
context = super(PesquisarDocumentoAdministrativoView,
self).get_context_data(**kwargs)
if request.POST['periodo_final']:
kwargs['periodo_final'] = request.POST['periodo_final']
paginator = context['paginator']
page_obj = context['page_obj']
if request.POST['interessado']:
kwargs['interessado'] = request.POST['interessado']
context['page_range'] = make_pagination(
page_obj.number, paginator.num_pages)
if request.POST['assunto']:
kwargs['assunto_ementa__icontains'] = request.POST['assunto']
return context
if request.POST['tramitacao']:
if request.POST['tramitacao'] == 1:
kwargs['tramitacao'] = True
elif request.POST['tramitacao'] == 0:
kwargs['tramitacao'] = False
else:
kwargs['tramitacao'] = request.POST['tramitacao']
def get(self, request, *args, **kwargs):
super(PesquisarDocumentoAdministrativoView, self).get(request)
# TODO
# if request.POST['localizacao']:
# kwargs['localizacao'] = request.POST['localizacao']
# Se a pesquisa estiver quebrando com a paginação
# Olhe esta função abaixo
# Provavelmente você criou um novo campo no Form/FilterSet
# Então a ordem da URL está diferente
data = self.filterset.data
if (data and data.get('tipo') is not None):
url = "&" + str(self.request.environ['QUERY_STRING'])
if url.startswith("&page"):
ponto_comeco = url.find('tipo=') - 1
url = url[ponto_comeco:]
else:
url = ''
# if request.POST['situacao']:
# kwargs['situacao'] = request.POST['situacao']
self.filterset.form.fields['o'].label = _('Ordenação')
doc = DocumentoAdministrativo.objects.filter(**kwargs)
context = self.get_context_data(filter=self.filterset,
object_list=self.object_list,
filter_url=url,
numero_res=len(self.object_list)
)
if len(doc) == 0:
return self.render_to_response(
{'error': _('Nenhum resultado encontrado!'),
"tipos_doc": TipoDocumentoAdministrativo.objects.all()}
)
else:
return self.render_to_response(
{'documentos': doc}
)
return self.render_to_response(context)
class DetailDocumentoAdministrativo(DetailView):

5
templates/base.html

@ -56,7 +56,8 @@
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">Protocolo <span class="caret"></span></a>
<ul class="dropdown-menu">
<li class="nav__sub-item"><a class="nav__sub-link" href="{% url 'protocoloadm:protocolo' %}">Pesquisar</a></li>
<li class="nav__sub-item"><a class="nav__sub-link" href="{% url 'protocoloadm:protocolo' %}">Pesquisar Protocolo</a></li>
<li class="nav__sub-item"><a class="nav__sub-link" href="{% url 'protocoloadm:pesq_doc_adm' %}">Pesquisar Documento Administrativo</a></li>
<!-- <li class="nav__sub-item"><a class="nav__sub-link" href="/materia">Protocolo Legislativo</a></li> -->
{# <li class="nav__sub-item"><a class="nav__sub-link" href="">Protocolo Geral</a></li> #}
{# <li class="nav__sub-item"><a class="nav__sub-link" href="{% url 'protocoloadm:proposicao' %}">Proposições</a></li> #}
@ -112,7 +113,7 @@
<header class="masthead">
<div class="container">
<div class="navbar-header">
<a class="navbar-brand" href="#">
<a class="navbar-brand" href="/">
<img height="95" width="95" src="{% if logotipo %}{{ MEDIA_URL }}{{ logotipo }}{% else %}{% static 'img/logo.png' %}{% endif %}"
alt="Logo" class="img-responsive visible-lg-inline-block vcenter" >
<span class="vcenter">

4
templates/materia/materialegislativa_filter.html

@ -13,6 +13,7 @@
{% crispy filter.form %}
<p></p>
{% if filter_url %}
<table class="table table-striped table-bordered">
<thead class="thead-default">
<tr><td><h3>Resultados</h3></td></tr>
@ -23,7 +24,6 @@
{% elif numero_res == 1 %}
<h3>Pesquisa concluída com sucesso! Foi encontrada {{numero_res}} matéria.</h3>
{% endif %}
{% for m in page_obj %}
<tr>
@ -43,6 +43,8 @@
</table>
{% include "paginacao.html" %}
{% endif %}
{% endblock detail_content %}

48
templates/protocoloadm/documentoadministrativo_filter.html

@ -0,0 +1,48 @@
{% extends "crud/detail.html" %}
{% load i18n %}
{% load crispy_forms_tags %}
{% block actions %}{% endblock %}
{% block sections_nav %} {% endblock %}
{% block detail_content %}
<h1><b>Pesquisar Documento Administrativo</b></h1>
<br></br>
{% crispy filter.form %}
{% if filter_url %}
<p></p>
<table class="table table-striped table-bordered">
<thead class="thead-default">
<tr><td><h3>Resultados</h3></td></tr>
</thead>
{% if page_obj|length %}
{% if numero_res > 1 %}
<h3>Pesquisa concluída com sucesso! Foram encontrados {{numero_res}} documentos.</h3>
{% elif numero_res == 1 %}
<h3>Pesquisa concluída com sucesso! Foi encontrado {{numero_res}} documento.</h3>
{% endif %}
{% for d in page_obj %}
<tr>
<td>
<strong><a href="{% url 'protocoloadm:documentoadministrativo_detail' d.id %}">{{d.tipo.sigla}} {{d.numero}}/{{d.ano}} - {{d.tipo}}</strong></a></br>
{{ d.assunto|safe }}</br>
<p></p>
</tr>
{% endfor %}
{% else %}
<tr>
<td>
<h3>Nenhum documento encontrado com essas especificações</h3>
</tr>
{% endif %}
</table>
{% include "paginacao.html" %}
{% endif %}
{% endblock detail_content %}

66
templates/protocoloadm/pesquisa_doc_adm.html

@ -1,66 +0,0 @@
{% extends "protocoloadm/pesquisa_documento_detail.html" %}
{% load i18n %}
{% load crispy_forms_tags %}
{% block detail_content %}
<fieldset>
<legend>Pesquisa Básica</legend>
{% if documentos %}
Total: {{ documentos|length }}
<table>
{% for d in documentos %}
<tr>
<td>
<a href="{% url 'protocoloadm:detail_doc_adm' d.id %}"><b>{{ d.tipo.sigla }} {{ d.numero }}/{{ d.ano }} - {{ d.tipo }}</b></a> <br />
{{ d.assunto }} <br />
<b>Interessado:</b> {{ d.interessado }}
</td>
</tr>
{% endfor %}
</table>
{% else %}
<form method="POST">
{% csrf_token %}
{% if error %}
<h5 align="center"><font color="#FF0000">{{ error }}</font></h5>
{% endif %}
Tipo Documento:
<select name="tipo_documento">
<option value=""> --- </option>
{% for tipo in tipos_doc %}
<option value="{{tipo.id}}">{{tipo.descricao}}</option>
{% endfor %}
</select> <br>
Número: <input type="text" name="numero" id="numero" /> <br>
Ano: <input type="text" name="ano" id="ano" /> <br>
Núm. Protocolo: <input type="text" name="numero_protocolo" id="numero_protocolo" /> <br>
Período Data: <br>
Inicial: <input type="text" name="periodo_inicial" id="periodo_inicial" class="dateinput"/>
Final: <input type="text" name="periodo_final" id="periodo_final" class="dateinput"/> <br>
Interessado: <input type="text" name="interessado" id="interessado" /> <br>
Assunto: <input type="text" name="assunto" id="assunto" /> <br>
Tramitando:
<select name="tramitacao">
<option value="1">Sim</option>
<option value="0">Não</option>
<option value="" selected>Tanto Faz</option>
</select> <br>
<!-- TODO
Localização Atual:
<select name="localizacao">
<option value=""> - </option>
</select> <br>
Situação:
<select name="situacao">
<option value=""> - </option>
</select> <br><br>
-->
<input type="submit" value="Pesquisar" class="primary button"/>
</form>
{% endif %}
</fieldset>
{% endblock %}

6
templates/protocoloadm/protocolo_filter.html

@ -7,11 +7,11 @@
{% block sections_nav %} {% endblock %}
{% block detail_content %}
<h1><b>Pesquisar Protocolo</b></h1>
<h1><b>Pesquisa de Protocolo</b></h1>
<br></br>
{% crispy filter.form %}
{% if filter_url %}
<p></p>
<table class="table table-striped table-bordered">
<thead class="thead-default">
@ -67,4 +67,6 @@
{% include "paginacao.html" %}
{% endif %}
{% endblock detail_content %}
Loading…
Cancel
Save