You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

views.py 3.1KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. import json
  2. from django.http import HttpResponse, HttpResponseRedirect
  3. from django.views.generic.base import View
  4. from django.conf import settings
  5. from haystack.query import SearchQuerySet
  6. from haystack.views import FacetedSearchView
  7. from oscar.core.loading import import_module
  8. product_models = import_module('catalogue.models', ['Product'])
  9. class SuggestionsView(View):
  10. u"""
  11. Auto suggest view
  12. Returns the suggestions in JSON format (especially suited for consumption by
  13. jQuery autocomplete)
  14. """
  15. suggest_limit = settings.OSCAR_SEARCH_SUGGEST_LIMIT
  16. def get(self, request):
  17. context = self.get_context_data()
  18. return self.render_to_response(context)
  19. def get_context_data(self):
  20. '''
  21. Creates a list of suggestions
  22. '''
  23. query_term = self.request.GET['query_term'];
  24. query_set = SearchQuerySet().filter(text__contains=query_term)[:self.suggest_limit]
  25. context = []
  26. for item in query_set:
  27. context.append({
  28. 'label': item.object.title,
  29. 'url': item.object.get_absolute_url(),
  30. })
  31. return context
  32. def render_to_response(self, context):
  33. "Returns a JSON response containing 'context' as payload"
  34. return self.get_json_response(self.convert_context_to_json(context))
  35. def get_json_response(self, content, **httpresponse_kwargs):
  36. "Construct an `HttpResponse` object."
  37. return HttpResponse(content,
  38. content_type='application/json',
  39. **httpresponse_kwargs)
  40. def convert_context_to_json(self, context):
  41. "Convert the context into a JSON object"
  42. return json.dumps(context)
  43. class MultiFacetedSearchView(FacetedSearchView):
  44. """
  45. Search view for multifaceted searches
  46. """
  47. template = 'search/results.html'
  48. def __call__(self, request, *args, **kwargs):
  49. """
  50. Generates the actual response to the search.
  51. Relies on internal, overridable methods to construct the response.
  52. """
  53. # Look for UPC match
  54. query = request.GET.get('q', '').strip()
  55. try:
  56. item = product_models.Product._default_manager.get(upc=query)
  57. return HttpResponseRedirect(item.get_absolute_url())
  58. except product_models.Product.DoesNotExist:
  59. pass
  60. return super(MultiFacetedSearchView, self).__call__(request, *args, **kwargs)
  61. @property
  62. def __name__(self):
  63. return "MultiFacetedSearchView"
  64. def extra_context(self):
  65. '''
  66. Adds details about the facets applied
  67. '''
  68. extra = super(MultiFacetedSearchView, self).extra_context()
  69. if hasattr(self.form, 'cleaned_data') and 'selected_facets' in self.form.cleaned_data:
  70. extra['facets_applied'] = []
  71. for f in self.form.cleaned_data['selected_facets'].split("|"):
  72. facet = f.split(":")
  73. extra['facets_applied'].append({
  74. 'facet': facet[0][:-6], # removing the _exact suffix that haystack uses for some reason
  75. 'value' : facet[1].strip('"')
  76. })
  77. return extra