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')