Browse Source

Inicia a pesquisa textual

pull/980/head
Eduardo Calil 9 years ago
committed by Edward Ribeiro
parent
commit
fe8b3a14e9
  1. 1
      .gitignore
  2. 4
      requirements/requirements.txt
  3. 57
      sapl/base/search_indexes.py
  4. 11
      sapl/base/templatetags/common_tags.py
  5. 2
      sapl/base/urls.py
  6. 11
      sapl/settings.py
  7. 7
      sapl/templates/search/indexes/materia/documentoacessorio_text.txt
  8. 7
      sapl/templates/search/indexes/materia/materialegislativa_text.txt
  9. 70
      sapl/templates/search/search.html

1
.gitignore

@ -92,3 +92,4 @@ collected_static
bower bower
bower_components bower_components
media media
whoosh/

4
requirements/requirements.txt

@ -13,19 +13,23 @@ django-extensions==1.6.7
django-extra-views==0.8.0 django-extra-views==0.8.0
django-filter==0.15.3 django-filter==0.15.3
django-floppyforms==1.6.2 django-floppyforms==1.6.2
django-haystack==2.5.1
django-model-utils==2.5 django-model-utils==2.5
django-sass-processor==0.4.6 django-sass-processor==0.4.6
djangorestframework djangorestframework
drfdocs drfdocs
easy-thumbnails==2.3 easy-thumbnails==2.3
git+git://github.com/interlegis/trml2pdf.git git+git://github.com/interlegis/trml2pdf.git
haystack==0.36
libsass==0.11.1 libsass==0.11.1
psycopg2==2.6.2 psycopg2==2.6.2
python-decouple==3.0 python-decouple==3.0
pytz==2016.4 pytz==2016.4
pyyaml==3.11 pyyaml==3.11
rtyaml==0.0.3 rtyaml==0.0.3
textract==1.5.0
unipath==1.1 unipath==1.1
python-magic==0.4.12 python-magic==0.4.12
gunicorn==19.6.0 gunicorn==19.6.0
django-reversion==2.0.8 django-reversion==2.0.8
whoosh==2.7.4

57
sapl/base/search_indexes.py

@ -0,0 +1,57 @@
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):
"""Used when the entire index for model is updated."""
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', ' ')
# 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'

11
sapl/base/templatetags/common_tags.py

@ -2,6 +2,7 @@ from compressor.utils import get_class
from django import template from django import template
from sapl.base.models import AppConfig from sapl.base.models import AppConfig
from sapl.materia.models import DocumentoAcessorio, MateriaLegislativa
from sapl.parlamentares.models import Filiacao from sapl.parlamentares.models import Filiacao
register = template.Library() register = template.Library()
@ -137,3 +138,13 @@ def cronometro_to_seconds(value):
@register.filter @register.filter
def to_list_pk(object_list): def to_list_pk(object_list):
return [o.pk for o in object_list] return [o.pk for o in object_list]
@register.filter
def search_get_model(object):
if type(object) == MateriaLegislativa:
return 'm'
elif type(object) == DocumentoAcessorio:
return 'd'
return None

2
sapl/base/urls.py

@ -99,4 +99,6 @@ urlpatterns = [
name='login'), name='login'),
url(r'^logout/$', views.logout, {'next_page': '/login'}, name='logout'), url(r'^logout/$', views.logout, {'next_page': '/login'}, name='logout'),
url(r'^search/', include('haystack.urls')),
] + recuperar_senha ] + recuperar_senha

11
sapl/settings.py

@ -76,12 +76,23 @@ INSTALLED_APPS = (
'crispy_forms', 'crispy_forms',
'easy_thumbnails', 'easy_thumbnails',
'floppyforms', 'floppyforms',
'haystack',
'sass_processor', 'sass_processor',
'rest_framework', 'rest_framework',
'reversion', 'reversion',
'whoosh',
) + SAPL_APPS ) + SAPL_APPS
HAYSTACK_CONNECTIONS = {
'default': {
'ENGINE': 'haystack.backends.whoosh_backend.WhooshEngine',
'PATH': PROJECT_DIR.child('whoosh'),
},
}
if DEBUG: if DEBUG:
INSTALLED_APPS += ('debug_toolbar', 'rest_framework_docs',) INSTALLED_APPS += ('debug_toolbar', 'rest_framework_docs',)

7
sapl/templates/search/indexes/materia/documentoacessorio_text.txt

@ -0,0 +1,7 @@
{% for k, v in extracted.metadata.items %}
{% for val in v %}
{{ k }}: {{ val|safe }}
{% endfor %}
{% endfor %}
{{ extracted|striptags|safe }}

7
sapl/templates/search/indexes/materia/materialegislativa_text.txt

@ -0,0 +1,7 @@
{% for k, v in extracted.metadata.items %}
{% for val in v %}
{{ k }}: {{ val|safe }}
{% endfor %}
{% endfor %}
{{ extracted|striptags|safe }}

70
sapl/templates/search/search.html

@ -0,0 +1,70 @@
{% 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>
{% if query %}
<h3>Resultados</h3>
{% for result in page.object_list %}
{% if result.object|search_get_model == 'm' %}
<p>
<a href="{% url 'sapl.materia:materialegislativa_detail' result.object.pk %}">{{ result.object }}</a>
</p>
{% elif result.object|search_get_model == 'd' %}
<p>
<a href="{% url 'sapl.materia:documentoacessorio_detail' result.object.pk %}">{{ result.object }}</a>
</p>
{% endif %}
{% empty %}
<p>No results found.</p>
{% endfor %}
{% if page.has_previous or page.has_next %}
<div>
{% if page.has_previous %}<a href="?q={{ query }}&amp;page={{ page.previous_page_number }}">{% endif %}&laquo; Previous{% if page.has_previous %}</a>{% endif %}
|
{% if page.has_next %}<a href="?q={{ query }}&amp;page={{ page.next_page_number }}">{% endif %}Next &raquo;{% if page.has_next %}</a>{% endif %}
</div>
{% endif %}
{% else %}
{# Show some example queries to run, maybe query syntax, something else? #}
{% endif %}
</form>
{% endblock %}
Loading…
Cancel
Save