Browse Source

Fix #3301 - Busca para Assunto de Norma Jurídica (#3313)

* Adicionar endpoint pesquisa

Adiciona view de pesquisa

Adiciona novas entradas no menu tabela aux

Adiciona form pesquisa

Adiciona template pesquisa e resultados

Adiciona template assunto norma detail

Atualiza url sucesso delete assunto norma

* Conserta chamada multifilter

Co-authored-by: Vinícius Cantuária <cantuariavc@gmail.com>
Co-authored-by: eribeiro <edwardr@senado.leg.br>
pull/3284/head
João Rodrigues 4 years ago
committed by GitHub
parent
commit
52a18d47e1
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 25
      sapl/norma/forms.py
  2. 12
      sapl/norma/urls.py
  3. 74
      sapl/norma/views.py
  4. 9
      sapl/templates/menu_tabelas_auxiliares.yaml
  5. 34
      sapl/templates/norma/assuntonorma_detail.html
  6. 54
      sapl/templates/norma/assuntonorma_filter.html

25
sapl/norma/forms.py

@ -40,6 +40,31 @@ ORDENACAO_CHOICES = [('', '---------'),
('data,tipo,ano,numero', _('Data/Tipo/Ano/Número'))] ('data,tipo,ano,numero', _('Data/Tipo/Ano/Número'))]
class AssuntoNormaFilterSet(django_filters.FilterSet):
assunto = django_filters.CharFilter(label=_("Assunto"),
method='multifield_filter')
class Meta:
model = AssuntoNorma
fields = ["assunto"]
def multifield_filter(self, queryset, name, value):
return queryset.filter(Q(assunto__icontains=value) | Q(descricao__icontains=value))
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
row0 = to_row([("assunto", 12)])
self.form.helper = SaplFormHelper()
self.form.helper.form_method = "GET"
self.form.helper.layout = Layout(
Fieldset(
_("Pesquisa de Assunto de Norma Jurídica"),
row0, form_actions(label="Pesquisar"))
)
class NormaFilterSet(django_filters.FilterSet): class NormaFilterSet(django_filters.FilterSet):
ano = django_filters.ChoiceFilter(required=False, ano = django_filters.ChoiceFilter(required=False,

12
sapl/norma/urls.py

@ -1,9 +1,11 @@
from django.conf.urls import include, url from django.conf.urls import include, url
from sapl.norma.views import (AnexoNormaJuridicaCrud,AssuntoNormaCrud, NormaCrud, NormaPesquisaView, from sapl.norma.views import (AnexoNormaJuridicaCrud, AssuntoNormaCrud,
NormaCrud, NormaPesquisaView,
NormaRelacionadaCrud, NormaTaView, TipoNormaCrud, NormaRelacionadaCrud, NormaTaView, TipoNormaCrud,
TipoVinculoNormaJuridicaCrud, recuperar_norma, TipoVinculoNormaJuridicaCrud, recuperar_norma,
recuperar_numero_norma, AutoriaNormaCrud) recuperar_numero_norma, AutoriaNormaCrud,
PesquisarAssuntoNormaView)
from .apps import AppConfig from .apps import AppConfig
@ -19,7 +21,13 @@ urlpatterns = [
# Integração com Compilação # Integração com Compilação
url(r'^norma/(?P<pk>[0-9]+)/ta$', NormaTaView.as_view(), name='norma_ta'), url(r'^norma/(?P<pk>[0-9]+)/ta$', NormaTaView.as_view(), name='norma_ta'),
url(r'^sistema/norma/tipo/', include(TipoNormaCrud.get_urls())), url(r'^sistema/norma/tipo/', include(TipoNormaCrud.get_urls())),
url(r'^sistema/norma/assunto/', include(AssuntoNormaCrud.get_urls())), url(r'^sistema/norma/assunto/', include(AssuntoNormaCrud.get_urls())),
url(
r'^sistema/norma/pesquisar-assunto-norma/',
PesquisarAssuntoNormaView.as_view(), name="pesquisar_assuntonorma"
),
url(r'^sistema/norma/vinculo/', include( url(r'^sistema/norma/vinculo/', include(
TipoVinculoNormaJuridicaCrud.get_urls())), TipoVinculoNormaJuridicaCrud.get_urls())),

74
sapl/norma/views.py

@ -28,14 +28,13 @@ from sapl.crud.base import (RP_DETAIL, RP_LIST, Crud, CrudAux,
from sapl.utils import show_results_filter_set, get_client_ip from sapl.utils import show_results_filter_set, get_client_ip
from .forms import (AnexoNormaJuridicaForm, NormaFilterSet, NormaJuridicaForm, from .forms import (AnexoNormaJuridicaForm, NormaFilterSet, NormaJuridicaForm,
NormaPesquisaSimplesForm, NormaRelacionadaForm, AutoriaNormaForm) NormaPesquisaSimplesForm, NormaRelacionadaForm,
AutoriaNormaForm, AssuntoNormaFilterSet)
from .models import (AnexoNormaJuridica, AssuntoNorma, NormaJuridica, NormaRelacionada, from .models import (AnexoNormaJuridica, AssuntoNorma, NormaJuridica, NormaRelacionada,
TipoNormaJuridica, TipoVinculoNormaJuridica, AutoriaNorma, NormaEstatisticas) TipoNormaJuridica, TipoVinculoNormaJuridica, AutoriaNorma, NormaEstatisticas)
# LegislacaoCitadaCrud = Crud.build(LegislacaoCitada, '') # LegislacaoCitadaCrud = Crud.build(LegislacaoCitada, '')
AssuntoNormaCrud = CrudAux.build(AssuntoNorma, 'assunto_norma_juridica',
list_field_names=['assunto', 'descricao'])
TipoNormaCrud = CrudAux.build( TipoNormaCrud = CrudAux.build(
@ -46,6 +45,75 @@ TipoVinculoNormaJuridicaCrud = CrudAux.build(
list_field_names=['sigla', 'descricao_ativa', 'descricao_passiva', 'revoga_integralmente']) list_field_names=['sigla', 'descricao_ativa', 'descricao_passiva', 'revoga_integralmente'])
class AssuntoNormaCrud(CrudAux):
model = AssuntoNorma
class BaseMixin(CrudAux.BaseMixin):
list_field_names = ["assunto", "descricao"]
class DeleteView(CrudAux.DeleteView):
def get_success_url(self):
return reverse('sapl.norma:pesquisar_assuntonorma')
class PesquisarAssuntoNormaView(FilterView):
model = AssuntoNorma
filterset_class = AssuntoNormaFilterSet
paginate_by = 10
def get_filterset_kwargs(self, filterset_class):
super(PesquisarAssuntoNormaView, self).get_filterset_kwargs(
filterset_class
)
return ({
"data": self.request.GET or None,
"queryset": self.get_queryset().order_by("assunto").distinct()
})
def get_context_data(self, **kwargs):
context = super(PesquisarAssuntoNormaView, self).get_context_data(
**kwargs
)
paginator = context["paginator"]
page_obj = context["page_obj"]
context.update({
"page_range": make_pagination(
page_obj.number, paginator.num_pages
),
"NO_ENTRIES_MSG": "Nenhum assunto de norma jurídica encontrado!",
"title": _("Assunto de Norma Jurídica")
})
return context
def get(self, request, *args, **kwargs):
super(PesquisarAssuntoNormaView, self).get(request)
data = self.filterset.data
url = ''
if data:
url = '&' + str(self.request.META["QUERY_STRING"])
if url.startswith("&page"):
ponto_comeco = url.find("assunto=") - 1
url = url[ponto_comeco:]
context = self.get_context_data(
filter=self.filterset, object_list=self.object_list,
filter_url=url, numero_res=len(self.object_list)
)
context["show_results"] = show_results_filter_set(
self.request.GET.copy()
)
return self.render_to_response(context)
class NormaRelacionadaCrud(MasterDetailCrud): class NormaRelacionadaCrud(MasterDetailCrud):
model = NormaRelacionada model = NormaRelacionada
parent_field = 'norma_principal' parent_field = 'norma_principal'

9
sapl/templates/menu_tabelas_auxiliares.yaml

@ -140,12 +140,15 @@
- title: {% trans 'Tipo de Norma Jurídica' %} - title: {% trans 'Tipo de Norma Jurídica' %}
url: sapl.norma:tiponormajuridica_list url: sapl.norma:tiponormajuridica_list
css_class: btn btn-link css_class: btn btn-link
- title: {% trans 'Assunto de Norma Jurídica' %}
url: sapl.norma:assuntonorma_list
css_class: btn btn-link
- title: {% trans 'Tipo de Vínculo' %} - title: {% trans 'Tipo de Vínculo' %}
url: sapl.norma:tipovinculonormajuridica_list url: sapl.norma:tipovinculonormajuridica_list
css_class: btn btn-link css_class: btn btn-link
- title: {% trans 'Pesquisar Assunto de Norma Jurídica' %}
url: sapl.norma:pesquisar_assuntonorma
css_class: btn btn-link
- title: {% trans 'Adicionar Assunto de Norma Jurídica' %}
url: sapl.norma:assuntonorma_create
css_class: btn btn-link
- title: {% trans 'Módulo Textos Articulados' %} - title: {% trans 'Módulo Textos Articulados' %}
css_class: head_title css_class: head_title
children: children:

34
sapl/templates/norma/assuntonorma_detail.html

@ -0,0 +1,34 @@
{% extends "crud/detail.html" %}
{% load i18n %}
{% load crispy_forms_tags cropping %}
{% block actions %}
<div class="actions btn-group btn-group-sm" role="group">
<a
href="{% url 'sapl.norma:pesquisar_assuntonorma' %}"
class="btn btn-outline-primary"
>
Pesquisar Assunto de Norma Jurídica
</a>
<a
href="{% url 'sapl.norma:assuntonorma_create' %}"
class="btn btn-outline-primary"
>
Adicionar Assunto de Norma Jurídica
</a>
</div>
<div class="actions btn-group btn-group-sm float-right" role="group">
<a
href="{% url 'sapl.norma:assuntonorma_update' object.pk %}"
class="btn btn-outline-primary"
>
Editar
</a>
<a
href="{% url 'sapl.norma:assuntonorma_delete' object.pk %}"
class="btn btn-outline-danger"
>
Excluir
</a>
</div>
{% endblock actions %}

54
sapl/templates/norma/assuntonorma_filter.html

@ -0,0 +1,54 @@
{% extends "crud/list.html" %}
{% load i18n %}
{% load crispy_forms_tags staticfiles %}
{% block base_content %}
{% if not show_results %}
{% crispy filter.form %}
{% else %}
<div class="actions btn-group float-right btn-group-sm" role="group">
<a
href="{% url 'sapl.norma:pesquisar_assuntonorma' %}"
class="btn btn-outline-primary"
>
{% trans "Fazer nova pesquisa" %}
</a>
{% if not request.user.is_anonymous %}
<a
href="{% url 'sapl.norma:assuntonorma_create' %}"
class="btn btn-outline-primary"
>
Cadastrar Assunto de Norma Jurídica
</a>
{% endif %}
</div>
<br />
{% if numero_res > 0 %}
{% if numero_res == 1 %}
<p>Foi encontrado {{ numero_res }} resultado.</p>
{% else %}
<p>Foram encontrados {{ numero_res }} resultados.</p>
{% endif %}
<table class="table table-striped table-hover">
<thead><tr><th>Assunto</th><th>Descrição</th></tr></thead>
<tbody>
{% for assunto_norma in page_obj %}
<tr>
<td>
<a href="{% url 'sapl.norma:assuntonorma_detail' assunto_norma.pk %}">
{{ assunto_norma.assunto }}
</a>
</td>
<td>{{ assunto_norma.descricao }}</td>
</tr>
{% endfor %}
</tbody>
</table>
{% else %}
<font size="4"><p align="center">{{ NO_ENTRIES_MSG }}</p></font>
{% endif %}
{% endif %}
<br />
{% include "paginacao.html" %}
<br /><br /><br />
{% endblock base_content %}
Loading…
Cancel
Save