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.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. import json
  2. import settings
  3. from django.http import HttpResponse, HttpResponseRedirect
  4. from django.views.generic.base import View
  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('product.models', ['Item'])
  9. class Suggestions(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. u"""
  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['q'].strip()
  55. try:
  56. item = product_models.Item._default_manager.get(upc=query)
  57. return HttpResponseRedirect(item.get_absolute_url())
  58. except product_models.Item.DoesNotExist:
  59. pass
  60. return super(MultiFacetedSearchView, self).__call__(request, *args, **kwargs)
  61. def __name__(self):
  62. return "MultiFacetedSearchView"
  63. def extra_context(self):
  64. '''
  65. Adds details about the facets applied
  66. '''
  67. extra = super(MultiFacetedSearchView, self).extra_context()
  68. if hasattr(self.form, 'cleaned_data') and self.form.cleaned_data['selected_facets']:
  69. extra['facets_applied'] = []
  70. for f in self.form.cleaned_data['selected_facets'].split("|"):
  71. facet = f.split(":")
  72. extra['facets_applied'].append({
  73. 'facet': facet[0][:-6], # removing the _exact suffix that haystack uses for some reason
  74. 'value' : facet[1].strip('"')
  75. })
  76. return extra