Repository: interlegis/sapl

Issue:
Disponibilizar a busca textual como webservice
Disponibilizar uma interface RESTful com a busca textual do SAPL para permitir uma maior nteração do SAPL com sistemas externos através da busca de informações.

## Comportamento Esperado
Criação de um endpoint rest tal qual `http://<address>/sistema/pesquisa` que retorne os resultados em formato JSON para consumo por sistemas externos. O usuário não precisa estar logado para executar a consulta, mas seria interessante um rate limiter para não sobrecarregar os servidores Solr.

## Comportamento Atual
O usuário precisa executar as consultas iterativamente através dos botões e preenchimento de formulário.

## Possível Solução
Um endpoint usando DRF para o Solr com throttling: https://www.django-rest-framework.org/api-guide/throttling/

## Contexto
Nova funcionalidade.

## Imagens do Ocorrido
Não se aplica

## 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: Chrome
* Nome e versão do Sistema Operacional (desktop ou mobile): Linux
* Link para o seu projeto (Caso de fork deste projeto): 3.2

Disponibilizar a busca textual como webservice
Disponibilizar uma interface RESTful com a busca textual do SAPL para permitir uma maior nteração do SAPL com sistemas externos através da busca de informações.

## Comportamento Esperado
Criação de um endpoint rest tal qual `http://<address>/sistema/pesquisa` que retorne os resultados em formato JSON para consumo por sistemas externos. O usuário não precisa estar logado para executar a consulta, mas seria interessante um rate limiter para não sobrecarregar os servidores Solr.

## Comportamento Atual
O usuário precisa executar as consultas iterativamente através dos botões e preenchimento de formulário.

## Possível Solução
Um endpoint usando DRF para o Solr com throttling: https://www.django-rest-framework.org/api-guide/throttling/

## Contexto
Nova funcionalidade.

## Imagens do Ocorrido
Não se aplica

## 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: Chrome
* Nome e versão do Sistema Operacional (desktop ou mobile): Linux
* Link para o seu projeto (Caso de fork deste projeto): 3.2



Discussion:

Resolving patch:
diff --git a/sapl/base/urls.py b/sapl/base/urls.py
--- a/sapl/base/urls.py
+++ b/sapl/base/urls.py
@@ -38,7 +38,8 @@
                     ListarParlFiliacoesIntersecaoView,
                     ListarAutoresDuplicadosView,
                     ListarBancadaComissaoAutorExternoView,
-                    ListarLegislaturaInfindavelView)
+                    ListarLegislaturaInfindavelView,
+                    pesquisa_textual)
 
 
 app_name = AppConfig.name
@@ -175,6 +176,9 @@
     url(r'^sistema/inconsistencias/legislatura_infindavel$',
         ListarLegislaturaInfindavelView.as_view(),
         name='lista_legislatura_infindavel'),
+    url(r'^sistema/pesquisa-textual',
+        pesquisa_textual,
+        name='pesquisa_textual'),
 
     url(r'^sistema/estatisticas', get_estatistica),
 
diff --git a/sapl/base/views.py b/sapl/base/views.py
--- a/sapl/base/views.py
+++ b/sapl/base/views.py
@@ -27,6 +27,7 @@
 from django.views.generic.base import RedirectView, TemplateView
 from django_filters.views import FilterView
 from haystack.views import SearchView
+from haystack.query import SearchQuerySet
 
 from sapl import settings
 from sapl.audiencia.models import AudienciaPublica, TipoAudienciaPublica
@@ -43,8 +44,7 @@
                                 SessaoPlenariaPresenca, Bancada)
 from sapl.utils import (parlamentares_ativos, gerar_hash_arquivo, SEPARADOR_HASH_PROPOSICAO,
                         show_results_filter_set, mail_service_configured,
-                        intervalos_tem_intersecao,)
-
+                        intervalos_tem_intersecao, remover_acentos)
 from .forms import (AlterarSenhaForm, CasaLegislativaForm,
                     ConfiguracoesAppForm, RelatorioAtasFilterSet,
                     RelatorioAudienciaFilterSet,
@@ -1748,3 +1748,57 @@ def get_redirect_url(self, *args, **kwargs):
         casa = get_casalegislativa()
         logo = casa and casa.logotipo and casa.logotipo.name
         return os.path.join(settings.MEDIA_URL, logo) if logo else STATIC_LOGO
+
+def filtro_campos(dicionario):
+
+    chaves_desejadas = ['ementa',
+                        'ano',
+                        'numero',
+                        'em_tramitacao',
+                        'data_apresentacao',
+                        'apelido',
+                        'indexacao',
+                        'data_publicacao',
+                        'data',
+                        'data_vigencia']
+    del_list = []
+    for key in dicionario.keys():
+        if key not in chaves_desejadas:
+            del_list = del_list + [key]
+
+    for key in del_list:
+        del dicionario[key]
+
+    return dicionario
+
+def pesquisa_textual(request):
+
+    if 'q' not in request.GET:
+        return JsonResponse({'total': 0,
+                             'resultados': []})
+
+    results = SearchQuerySet().filter(content=request.GET['q'])
+    json_dict = {
+        'total': results.count(),
+        'parametros': request.GET['q'],
+        'resultados': [],
+    }
+
+    for e in results:
+
+        sec_dict = {}
+        try:
+            sec_dict['pk'] = e.object.pk
+        except:
+            # Index and db are out of sync. Object has been deleted from database
+            continue
+        dici = filtro_campos(e.object.__dict__)
+        sec_dict['objeto'] = str(dici) 
+        sec_dict['text'] = str(e.object.ementa)
+
+        sec_dict['model'] = str(type(e.object))
+
+        json_dict['resultados'].append(sec_dict)
+
+
+    return JsonResponse(json_dict)
\ No newline at end of file


Test patch: