Repository: interlegis/sapl

Issue:
Campos de busca em itens das tabelas auxiliares
## Comportamento Esperado

Ao acessar itens das Tabelas Auxiliares, vários registros como:

    * Modulo Parlamentares>Partido
    * Modulo Parlamentares>Coligação
    * Modulo Matéria Legislativa>Status de Tramitação
    * Modulo Normas Juridicas>Assunto de Normas Juridicas

Onde se tem varios registros divididos em paginas, seja possivel a pesquisa para se confirmar a inexistencia do registro que pretendemos inserir.

## Comportamento Atual

Temos que ir página por pagina verificando a existencia ou não do que se pretende inserir



Discussion:

Resolving patch:
diff --git a/sapl/norma/forms.py b/sapl/norma/forms.py
--- a/sapl/norma/forms.py
+++ b/sapl/norma/forms.py
@@ -40,6 +40,31 @@ def get_esferas():
                      ('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):
 
     ano = django_filters.ChoiceFilter(required=False,
diff --git a/sapl/norma/urls.py b/sapl/norma/urls.py
--- a/sapl/norma/urls.py
+++ b/sapl/norma/urls.py
@@ -1,9 +1,11 @@
 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,
                               TipoVinculoNormaJuridicaCrud, recuperar_norma,
-                              recuperar_numero_norma, AutoriaNormaCrud)
+                              recuperar_numero_norma, AutoriaNormaCrud,
+                              PesquisarAssuntoNormaView)
 
 from .apps import AppConfig
 
@@ -19,7 +21,13 @@
     # Integração com Compilação
     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/assunto/', include(AssuntoNormaCrud.get_urls())),
+    url(
+        r'^sistema/norma/pesquisar-assunto-norma/',
+        PesquisarAssuntoNormaView.as_view(), name="pesquisar_assuntonorma"
+    ),
+
     url(r'^sistema/norma/vinculo/', include(
         TipoVinculoNormaJuridicaCrud.get_urls())),
 
diff --git a/sapl/norma/views.py b/sapl/norma/views.py
--- a/sapl/norma/views.py
+++ b/sapl/norma/views.py
@@ -28,14 +28,13 @@
 from sapl.utils import show_results_filter_set, get_client_ip
 
 from .forms import (AnexoNormaJuridicaForm, NormaFilterSet, NormaJuridicaForm,
-                    NormaPesquisaSimplesForm, NormaRelacionadaForm, AutoriaNormaForm)
+                    NormaPesquisaSimplesForm, NormaRelacionadaForm,
+                    AutoriaNormaForm, AssuntoNormaFilterSet)
 from .models import (AnexoNormaJuridica, AssuntoNorma, NormaJuridica, NormaRelacionada,
                      TipoNormaJuridica, TipoVinculoNormaJuridica, AutoriaNorma, NormaEstatisticas)
 
 
 # LegislacaoCitadaCrud = Crud.build(LegislacaoCitada, '')
-AssuntoNormaCrud = CrudAux.build(AssuntoNorma, 'assunto_norma_juridica',
-                                 list_field_names=['assunto', 'descricao'])
 
 
 TipoNormaCrud = CrudAux.build(
@@ -46,6 +45,75 @@
     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):
     model = NormaRelacionada
     parent_field = 'norma_principal'


Test patch: