Repository: interlegis/sapl

Issue:
Adicionar uma pesquisa em AUTOR na parte de tabelas auxiliares. 
<!--- Forneça um resumo geral da _issue_ no título acima -->
Hoje temos mais de 137 autores, incluindo comissões, parlamentares, prefeitos entre outros,  a tendência é aumentar esse número à medida que os anos passam.
Fica muito custoso para o usuário, baixar a barra de rolagem para saber se determinado autor já foi cadastrado.


## Comportamento Esperado
<!--- Se você está descrevendo um _bug_, conte-nos o que deveria acontecer. -->
<!--- Se você está sugerindo uma mudança/melhoria, conte-nos como deve funcionar. -->
Um formulário de pesquisa na parte de AUTOR
## Comportamento Atual
<!--- Se está descrevendo um bug, conte-nos o que acontece em vez do comportamento esperado. -->
<!--- Se está sugerindo uma mudança/melhoria, explique a diferença com o comportamento atual. -->
Não há formulário de pesquisa.
## Possível Solução
<!--- Não é obrigatório, mas sugira uma possível correção/razão para o bug -->
<!--- ou ideias de como implementar a adição/mudança. -->

## Passos para Reproduzir (para bugs)
<!--- Forneça um link para um exemplo, ou um conjunto de passos inequívocos -->
<!--- para reproduzir esse bug. Inclua código para reproduzir, se relevante. -->
1.
2.
3.
4.

## Contexto
<!--- Como esse problema o afeta? O que você está tentando realizar? -->
<!--- Fornecer o contexto nos ajuda a encontrar uma solução que seja mais útil no mundo real -->

## Imagens do Ocorrido
<!--- Representação visual em vídeo ou imagem do ocorrido -->
<!--- Se está descrevendo um bug poste imagens ou vídeos na reprodução do bug citado, caso se aplique -->
![autores](https://user-images.githubusercontent.com/2423695/83769479-4dbf4380-a656-11ea-86ae-d551ea41e17f.png)

## Seu Ambiente
<!--- Inclua detalhes relevantes sobre o ambiente em que você presenciou/experienciou o bug. -->
* Versão usada (_Release_):
* Nome e versão do navegador:
* Nome e versão do Sistema Operacional (desktop ou mobile):
* Link para o seu projeto (Caso de fork deste projeto):



Discussion:

Resolving patch:
diff --git a/sapl/base/forms.py b/sapl/base/forms.py
--- a/sapl/base/forms.py
+++ b/sapl/base/forms.py
@@ -744,6 +744,26 @@ def save(self, commit=False):
         return autor
 
 
+class AutorFilterSet(django_filters.FilterSet):
+    nome = django_filters.CharFilter(label=_('Nome do Autor'), lookup_expr='icontains')
+
+    class Meta:
+        model = Autor
+        fields = ['nome']
+
+    def __init__(self, *args, **kwargs):
+        super().__init__(*args, **kwargs)
+
+        row0 = to_row([('nome', 12)])
+
+        self.form.helper = SaplFormHelper()
+        self.form.helper.form_method = 'GET'
+        self.form.helper.layout = Layout(
+            Fieldset(_('Pesquisa de Autor'),
+                     row0,
+                     form_actions(label='Pesquisar')))
+
+
 class AutorFormForAdmin(AutorForm):
     status_user = forms.ChoiceField(
         label=_('Bloqueio do Usuário Existente'),
diff --git a/sapl/base/urls.py b/sapl/base/urls.py
--- a/sapl/base/urls.py
+++ b/sapl/base/urls.py
@@ -8,7 +8,8 @@
                                        password_reset_done)
 from django.views.generic.base import RedirectView, TemplateView
 
-from sapl.base.views import AutorCrud, ConfirmarEmailView, TipoAutorCrud, get_estatistica, DetailUsuarioView
+from sapl.base.views import AutorCrud, ConfirmarEmailView, TipoAutorCrud, get_estatistica, DetailUsuarioView, \
+    PesquisarAutorView
 from sapl.settings import EMAIL_SEND_USER, MEDIA_URL
 
 from .apps import AppConfig
@@ -90,6 +91,7 @@
 urlpatterns = [
     url(r'^sistema/autor/tipo/', include(TipoAutorCrud.get_urls())),
     url(r'^sistema/autor/', include(AutorCrud.get_urls())),
+    url(r'^sistema/autor/pesquisar-autor/', PesquisarAutorView.as_view(), name='pesquisar_autor'),
 
     url(r'^sistema/ajuda/(?P<topic>\w+)$',
         HelpTopicView.as_view(), name='help_topic'),
diff --git a/sapl/base/views.py b/sapl/base/views.py
--- a/sapl/base/views.py
+++ b/sapl/base/views.py
@@ -41,7 +41,7 @@
 from sapl import settings
 from sapl.audiencia.models import AudienciaPublica, TipoAudienciaPublica
 from sapl.base.models import Autor, TipoAutor
-from sapl.base.forms import AutorForm, AutorFormForAdmin, TipoAutorForm
+from sapl.base.forms import AutorForm, AutorFormForAdmin, TipoAutorForm, AutorFilterSet
 from sapl.comissoes.models import Comissao, Reuniao
 from sapl.crud.base import CrudAux, make_pagination
 from sapl.materia.models import (Anexada, Autoria, DocumentoAcessorio,
@@ -295,6 +295,58 @@ def get_success_url(self):
             return url_reverse
 
 
+class PesquisarAutorView(FilterView):
+    model = Autor
+    filterset_class = AutorFilterSet
+    paginate_by = 10
+
+    def get_filterset_kwargs(self, filterset_class):
+        super().get_filterset_kwargs(filterset_class)
+
+        kwargs = {'data': self.request.GET or None}
+
+        qs = self.get_queryset().order_by('nome').distinct()
+
+        kwargs.update({
+            'queryset': qs,
+        })
+        return kwargs
+
+    def get_context_data(self, **kwargs):
+        context = super().get_context_data(**kwargs)
+
+        paginator = context['paginator']
+        page_obj = context['page_obj']
+
+        context['page_range'] = make_pagination(page_obj.number, paginator.num_pages)
+
+        context['NO_ENTRIES_MSG'] = 'Nenhum Autor encontrado!'
+
+        context['title'] = _('Autores')
+
+        return context
+
+    def get(self, request, *args, **kwargs):
+        super().get(request)
+
+        data = self.filterset.data
+        url = ''
+        if data:
+            url = "&" + str(self.request.META['QUERY_STRING'])
+            if url.startswith("&page"):
+                ponto_comeco = url.find('nome=') - 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 RelatoriosListView(TemplateView):
     template_name='base/relatorios_list.html'
 


Test patch: