mirror of https://github.com/interlegis/sapl.git
Browse Source
* Inicia a pesquisa textual * Melhora o front-end da pesquisa textual * Bug fix * Ajusta alguns detalhes e cria botão de acesso a pesquisa * Adiciona signals para atualizar o index * Inicia a pesquisa textual * Melhora o front-end da pesquisa textual * Bug fix * Ajusta alguns detalhes e cria botão de acesso a pesquisa * Adiciona signals para atualizar o index * Insere ao README o comando de indexação * Atualiza versão do Haystack * Remove pacote haystack antigo Coloca url de search no padrãopull/978/head
eduardocalil
8 years ago
committed by
Edward
13 changed files with 235 additions and 1 deletions
@ -0,0 +1,58 @@ |
|||||
|
import textract |
||||
|
|
||||
|
from haystack import indexes |
||||
|
from sapl.materia.models import DocumentoAcessorio, MateriaLegislativa |
||||
|
from django.template import Context, loader |
||||
|
|
||||
|
|
||||
|
class DocumentoAcessorioIndex(indexes.SearchIndex, indexes.Indexable): |
||||
|
text = indexes.CharField(document=True, use_template=True) |
||||
|
|
||||
|
filename = 'arquivo' |
||||
|
model = DocumentoAcessorio |
||||
|
template_name = 'materia/documentoacessorio_text.txt' |
||||
|
|
||||
|
def get_model(self): |
||||
|
return self.model |
||||
|
|
||||
|
def index_queryset(self, using=None): |
||||
|
return self.get_model().objects.all() |
||||
|
|
||||
|
def prepare(self, obj): |
||||
|
if not self.filename or not self.model or not self.template_name: |
||||
|
raise Exception |
||||
|
|
||||
|
data = super(DocumentoAcessorioIndex, self).prepare(obj) |
||||
|
|
||||
|
arquivo = getattr(obj, self.filename) |
||||
|
|
||||
|
if arquivo: |
||||
|
try: |
||||
|
arquivo.open() |
||||
|
except OSError: |
||||
|
return self.prepared_data |
||||
|
|
||||
|
extracted_data = textract.process( |
||||
|
arquivo.path).decode( |
||||
|
'utf-8').replace('\n', ' ') |
||||
|
|
||||
|
extracted_data = extracted_data.replace('\t', ' ') |
||||
|
|
||||
|
# Now we'll finally perform the template processing to render the |
||||
|
# text field with *all* of our metadata visible for templating: |
||||
|
t = loader.select_template(( |
||||
|
'search/indexes/' + self.template_name, )) |
||||
|
data['text'] = t.render(Context({'object': obj, |
||||
|
'extracted': extracted_data})) |
||||
|
|
||||
|
return data |
||||
|
|
||||
|
return self.prepared_data |
||||
|
|
||||
|
|
||||
|
class MateriaLegislativaIndex(DocumentoAcessorioIndex): |
||||
|
text = indexes.CharField(document=True, use_template=True) |
||||
|
|
||||
|
filename = 'texto_original' |
||||
|
model = MateriaLegislativa |
||||
|
template_name = 'materia/materialegislativa_text.txt' |
@ -0,0 +1,29 @@ |
|||||
|
from django.db.models.signals import post_delete, post_save |
||||
|
from sapl.settings import PROJECT_DIR |
||||
|
from subprocess import PIPE, call |
||||
|
from threading import Thread |
||||
|
|
||||
|
|
||||
|
from .models import MateriaLegislativa, DocumentoAcessorio |
||||
|
|
||||
|
|
||||
|
class UpdateIndexCommand(Thread): |
||||
|
def run(self): |
||||
|
call([PROJECT_DIR.child('manage.py'), 'update_index'], |
||||
|
stdout=PIPE) |
||||
|
|
||||
|
|
||||
|
def save_texto(sender, instance, **kwargs): |
||||
|
update_index = UpdateIndexCommand() |
||||
|
update_index.start() |
||||
|
|
||||
|
|
||||
|
def delete_texto(sender, instance, **kwargs): |
||||
|
update_index = UpdateIndexCommand() |
||||
|
update_index.start() |
||||
|
|
||||
|
|
||||
|
post_save.connect(save_texto, sender=MateriaLegislativa) |
||||
|
post_save.connect(save_texto, sender=DocumentoAcessorio) |
||||
|
post_delete.connect(delete_texto, sender=MateriaLegislativa) |
||||
|
post_delete.connect(delete_texto, sender=DocumentoAcessorio) |
@ -0,0 +1,7 @@ |
|||||
|
{% for k, v in extracted.metadata.items %} |
||||
|
{% for val in v %} |
||||
|
{{ k }}: {{ val|safe }} |
||||
|
{% endfor %} |
||||
|
{% endfor %} |
||||
|
|
||||
|
{{ extracted|striptags|safe }} |
@ -0,0 +1,7 @@ |
|||||
|
{% for k, v in extracted.metadata.items %} |
||||
|
{% for val in v %} |
||||
|
{{ k }}: {{ val|safe }} |
||||
|
{% endfor %} |
||||
|
{% endfor %} |
||||
|
|
||||
|
{{ extracted|striptags|safe }} |
@ -0,0 +1,95 @@ |
|||||
|
{% extends 'crud/form.html' %} |
||||
|
{% load crispy_forms_tags %} |
||||
|
{% load common_tags %} |
||||
|
|
||||
|
{% block base_content %} |
||||
|
<h1><legend>Pesquisa Textual</legend></h1> |
||||
|
|
||||
|
</br> |
||||
|
|
||||
|
<form method="get" action="."> |
||||
|
<div class="row container-detail clearfix"> |
||||
|
|
||||
|
<div class="row-fluid"> |
||||
|
<div class="col-md-8"> |
||||
|
{{ form.q|as_crispy_field }} |
||||
|
</div> |
||||
|
</div> |
||||
|
|
||||
|
<div class="row-fluid"> |
||||
|
<div class="col-md-8"> |
||||
|
</br> |
||||
|
<h4> Em quais tipos de documento deseja pesquisar?</h4> |
||||
|
</div> |
||||
|
</div> |
||||
|
|
||||
|
<div class="row-fluid"> |
||||
|
<div class="col-md-8"> |
||||
|
{{ form.models }} |
||||
|
</div> |
||||
|
</div> |
||||
|
|
||||
|
|
||||
|
<div class="row-fluid"> |
||||
|
<div class="col-md-12"> |
||||
|
<input class="btn btn-primary pull-right" type="submit" value="Pesquisar"> |
||||
|
</div> |
||||
|
</div> |
||||
|
|
||||
|
</div> |
||||
|
|
||||
|
</br> |
||||
|
{% if query %} |
||||
|
<table class="table table-striped table-bordered"> |
||||
|
<thead class="thead-default"> |
||||
|
<tr><td><h3>Resultados</h3></td></tr> |
||||
|
</thead> |
||||
|
|
||||
|
{% for result in page.object_list %} |
||||
|
<tr> |
||||
|
<td> |
||||
|
{% if result.object|search_get_model == 'm' %} |
||||
|
<p> |
||||
|
<strong>Matéria Legislativa: </strong> <a href="{% url 'sapl.materia:materialegislativa_detail' result.object.pk %}">{{ result.object }}</a></br> |
||||
|
|
||||
|
{% if result.object.texto_original %} |
||||
|
<strong>Texto Original:</strong> <a href="{{result.object.texto_original.url}}"> Clique aqui </a></br> |
||||
|
{% else %} |
||||
|
<strong>O texto desta matéria foi removido recentemente. Em breve ela sairá desta listagem.</strong></br> |
||||
|
{% endif %} |
||||
|
</p> |
||||
|
|
||||
|
{% elif result.object|search_get_model == 'd' %} |
||||
|
<p> |
||||
|
<strong> Documento Acessório: </strong><a href="{% url 'sapl.materia:documentoacessorio_detail' result.object.pk %}">{{ result.object }}</a></br> |
||||
|
{% if result.object.arquivo %} |
||||
|
<strong>Texto Original:</strong> <a href="{{result.object.arquivo.url}}"> Clique aqui </a></br> |
||||
|
{% else %} |
||||
|
<strong>O texto deste documento foi removido recentemente. Em breve ele sairá desta listagem.</strong></br> |
||||
|
{% endif %} |
||||
|
</p> |
||||
|
{% endif %} |
||||
|
</td> |
||||
|
</tr> |
||||
|
|
||||
|
{% empty %} |
||||
|
<h3> Nenhum texto encontrado! </h3> |
||||
|
<tr> |
||||
|
<td> |
||||
|
</td> |
||||
|
</tr> |
||||
|
{% endfor %} |
||||
|
</table> |
||||
|
|
||||
|
{% if page.has_previous or page.has_next %} |
||||
|
<div> |
||||
|
{% if page.has_previous %}<a href="?q={{ query }}&page={{ page.previous_page_number }}">{% endif %}« Previous{% if page.has_previous %}</a>{% endif %} |
||||
|
| |
||||
|
{% if page.has_next %}<a href="?q={{ query }}&page={{ page.next_page_number }}">{% endif %}Next »{% if page.has_next %}</a>{% endif %} |
||||
|
</div> |
||||
|
{% endif %} |
||||
|
{% else %} |
||||
|
{# Show some example queries to run, maybe query syntax, something else? #} |
||||
|
{% endif %} |
||||
|
</form> |
||||
|
{% endblock %} |
Loading…
Reference in new issue