Source code for annotations.views.search_views

"""
Provides search views.
"""

from django.http import HttpResponse

from haystack.generic_views import SearchView, FacetedSearchView
from haystack.query import SearchQuerySet

from annotations.models import Text
from concepts.models import Concept

import json


[docs]class TextSearchView(FacetedSearchView): """Class based view for thread-safe search.""" facet_fields = ['collections'] template_name = 'annotations/list_texts.html' queryset = SearchQuerySet().models(Text) results_per_page = 20
[docs] def get_context_data(self, *args, **kwargs): """ Return context data. """ context = super(TextSearchView, self).get_context_data(*args, **kwargs) sort_base = self.request.get_full_path().split('?')[0] if 'query' in context and context['query']: sort_base += '?q=' + context['query'] context.update({'sort_base': sort_base,}) return context
[docs] def form_valid(self, form): order_by = self.request.GET.get('order_by', 'title') # If there is no query, just show all of the texts. q = form.cleaned_data.get(self.search_field) query_for_display = q if not q: q = '*' query_for_display = '' form.cleaned_data[self.search_field] = q self.queryset = form.search().order_by(order_by) queryset = self.queryset # else: # params = self.request.GET.getlist('selected_facets') # queryset = self.get_queryset().order_by(order_by) context = self.get_context_data(**{ self.form_name: form, 'query': query_for_display, #form.cleaned_data.get(self.search_field), 'object_list': queryset, 'order_by': order_by, }) return self.render_to_response(context)
[docs] def form_invalid(self, form): """ Just return all of the texts. """ order_by = self.request.GET.get('order_by', 'title') sqs = self.get_queryset() # Facet the hell out of those texts. self.selected_facets = self.request.GET.getlist('selected_facets', []) for facet in self.selected_facets: if ":" not in facet: continue field, value = facet.split(":", 1) if value: sqs = sqs.narrow(u'%s:"%s"' % (field, sqs.query.clean(value))) context = self.get_context_data(**{ self.form_name: form, 'query': '', 'object_list': sqs.order_by(order_by), 'order_by': order_by, }) # Goddammit. context.update({'facets': sqs.facet_counts()}) return self.render_to_response(context)
[docs]def concept_autocomplete(request): """ Provides the :class:`.Concept` autocomplete in the home view. """ query = request.GET.get('q', '') if not query: suggestions = [] else: sqs = SearchQuerySet().models(Concept).filter(label__icontains=query.lower())[:20] suggestions = [{ 'label': result.label.title(), 'id': result.id, 'type': result.typed, 'description': result.description, 'uri': result.uri } for result in sqs] # TODO: can we use the built-in Django JsonResponse for this? response_data = json.dumps({'results': suggestions}) return HttpResponse(response_data, content_type='application/json')