From 5ec7945cb27ad90ddd67b3d2aa1967d152bc89bd Mon Sep 17 00:00:00 2001 From: eduardocalil Date: Tue, 10 May 2016 13:30:37 -0300 Subject: [PATCH] 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 --- materia/forms.py | 2 +- protocoloadm/forms.py | 97 ++++++++++++++++++- protocoloadm/urls.py | 4 +- protocoloadm/views.py | 93 +++++++++--------- templates/base.html | 5 +- .../materia/materialegislativa_filter.html | 4 +- .../documentoadministrativo_filter.html | 48 +++++++++ templates/protocoloadm/pesquisa_doc_adm.html | 66 ------------- templates/protocoloadm/protocolo_filter.html | 6 +- 9 files changed, 197 insertions(+), 128 deletions(-) create mode 100644 templates/protocoloadm/documentoadministrativo_filter.html delete mode 100644 templates/protocoloadm/pesquisa_doc_adm.html diff --git a/materia/forms.py b/materia/forms.py index e7f5fd4e1..11c786949 100644 --- a/materia/forms.py +++ b/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), diff --git a/protocoloadm/forms.py b/protocoloadm/forms.py index 79f930130..f01bc67fc 100644 --- a/protocoloadm/forms.py +++ b/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, diff --git a/protocoloadm/urls.py b/protocoloadm/urls.py index 9022e4358..09951476d 100644 --- a/protocoloadm/urls.py +++ b/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\d+)$', DetailDocumentoAdministrativo.as_view(), name='detail_doc_adm'), url(r'^protocoloadm/doc-ace-adm/(?P\d+)', diff --git a/protocoloadm/views.py b/protocoloadm/views.py index 851cf76f9..19e67e9ba 100644 --- a/protocoloadm/views.py +++ b/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): diff --git a/templates/base.html b/templates/base.html index e14cb7d89..a2eacf6dc 100644 --- a/templates/base.html +++ b/templates/base.html @@ -56,7 +56,8 @@