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.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. from django.http import HttpResponsePermanentRedirect, Http404
  2. from django.views.generic import ListView, DetailView
  3. from django.db.models import get_model
  4. from oscar.apps.product.signals import product_viewed, product_search
  5. item_model = get_model('product','item')
  6. category_model = get_model('product', 'category')
  7. class ItemDetailView(DetailView):
  8. model = item_model
  9. view_signal = product_viewed
  10. template_folder = "product"
  11. _item = None
  12. def get(self, request, **kwargs):
  13. u"""
  14. Ensures that the correct URL is used
  15. """
  16. item = self.get_object()
  17. correct_path = item.get_absolute_url()
  18. if correct_path != request.path:
  19. return HttpResponsePermanentRedirect(correct_path)
  20. response = super(ItemDetailView, self).get(request, **kwargs)
  21. # Send signal to record the view of this product
  22. self.view_signal.send(sender=self, product=item, user=request.user, request=request, response=response)
  23. return response;
  24. def get_template_names(self):
  25. """
  26. Returns a list of possible templates.
  27. We try 2 options before defaulting to product/detail.html:
  28. 1). detail-for-upc-<upc>.html
  29. 2). detail-for-class-<classname>.html
  30. This allows alternative templates to be provided for a per-product
  31. and a per-item-class basis.
  32. """
  33. product = self.get_object()
  34. names = ['%s/detail-for-upc-%s.html' % (self.template_folder, product.upc),
  35. '%s/detail-for-class-%s.html' % (self.template_folder, product.item_class.name.lower()),
  36. '%s/detail.html' % (self.template_folder)]
  37. return names
  38. class CategoryView(ListView):
  39. u"""A list of products"""
  40. context_object_name = "products"
  41. template_name = 'product/browse.html'
  42. paginate_by = 20
  43. def get_categories(self):
  44. slug = self.kwargs['category_slug']
  45. try:
  46. category = category_model.objects.get(slug=slug)
  47. except category_model.DoesNotExist:
  48. raise Http404()
  49. categories = list(category.get_descendants())
  50. categories.append(category)
  51. return categories
  52. def get_context_data(self, **kwargs):
  53. context = super(CategoryView, self).get_context_data(**kwargs)
  54. categories = self.get_categories()
  55. context['categories'] = categories
  56. context['category'] = categories[-1]
  57. context['summary'] = categories[-1].name
  58. return context
  59. def get_queryset(self):
  60. return item_model.browsable.filter(categories__in=self.get_categories()).distinct()
  61. class ProductListView(ListView):
  62. u"""A list of products"""
  63. context_object_name = "products"
  64. template_name = 'product/browse.html'
  65. paginate_by = 20
  66. search_signal = product_search
  67. def get_search_query(self):
  68. u"""Return a search query from GET"""
  69. q = None
  70. if 'q' in self.request.GET and self.request.GET['q']:
  71. q = self.request.GET['q'].strip()
  72. return q
  73. def get_queryset(self):
  74. u"""Return a set of products"""
  75. q = self.get_search_query()
  76. if q:
  77. # Send signal to record the view of this product
  78. self.search_signal.send(sender=self, query=q, user=self.request.user)
  79. return item_model.browsable.filter(title__icontains=q)
  80. else:
  81. return item_model.browsable.all()
  82. def get_context_data(self, **kwargs):
  83. context = super(ProductListView, self).get_context_data(**kwargs)
  84. q = self.get_search_query()
  85. if not q:
  86. context['summary'] = 'All products'
  87. else:
  88. context['summary'] = "Products matching '%s'" % q
  89. context['search_term'] = q
  90. return context