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

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. from django.conf import settings
  2. from django.http import HttpResponse, Http404, HttpResponsePermanentRedirect, HttpResponseRedirect
  3. from django.template import Context, loader, RequestContext
  4. from django.shortcuts import render, get_object_or_404
  5. from django.core.urlresolvers import reverse
  6. from django.core.paginator import Paginator, InvalidPage, EmptyPage
  7. from django.views.generic import ListView, DetailView
  8. from oscar.core.loading import import_module
  9. product_models = import_module('product.models', ['Item', 'ItemClass'])
  10. product_signals = import_module('product.signals', ['product_viewed', 'product_search'])
  11. basket_forms = import_module('basket.forms', ['FormFactory'])
  12. history_helpers = import_module('customer.history_helpers', ['receive_product_view'])
  13. class ItemDetailView(DetailView):
  14. u"""View a single product."""
  15. template_name = "oscar/product/item.html"
  16. _item = None
  17. def get(self, request, **kwargs):
  18. u"""
  19. Ensures that the correct URL is used
  20. """
  21. item = self.get_object()
  22. correct_path = item.get_absolute_url()
  23. if correct_path != request.path:
  24. return HttpResponsePermanentRedirect(correct_path)
  25. response = super(ItemDetailView, self).get(request, **kwargs)
  26. # Send signal to record the view of this product
  27. product_signals.product_viewed.send(sender=self, product=item, user=request.user, request=request, response=response)
  28. return response;
  29. def get_object(self):
  30. u"""
  31. Return a product object or a 404.
  32. We cache the object as this method gets called twice."""
  33. if not self._item:
  34. self._item = get_object_or_404(product_models.Item, pk=self.kwargs['item_id'])
  35. return self._item
  36. def get_context_data(self, **kwargs):
  37. context = super(ItemDetailView, self).get_context_data(**kwargs)
  38. context['basket_form'] = self.get_add_to_basket_form()
  39. return context
  40. def get_add_to_basket_form(self):
  41. factory = basket_forms.FormFactory()
  42. return factory.create(self.object)
  43. class ItemClassListView(ListView):
  44. u"""View products filtered by item-class."""
  45. context_object_name = "products"
  46. template_name = 'oscar/product/browse.html'
  47. paginate_by = 20
  48. def get_queryset(self):
  49. item_class = get_object_or_404(product_models.ItemClass, slug=self.kwargs['item_class_slug'])
  50. return product_models.Item.browsable.filter(item_class=item_class)
  51. class ProductListView(ListView):
  52. u"""A list of products"""
  53. context_object_name = "products"
  54. template_name = 'oscar/product/browse.html'
  55. paginate_by = 20
  56. def get_search_query(self):
  57. u"""Return a search query from GET"""
  58. q = None
  59. if 'q' in self.request.GET and self.request.GET['q']:
  60. q = self.request.GET['q'].strip()
  61. return q
  62. def get_queryset(self):
  63. u"""Return a set of prodcuts"""
  64. q = self.get_search_query()
  65. if q:
  66. # Send signal to record the view of this product
  67. product_signals.product_search.send(sender=self, query=q, user=self.request.user)
  68. return product_models.Item.browsable.filter(title__icontains=q)
  69. else:
  70. return product_models.Item.browsable.all()
  71. def get_context_data(self, **kwargs):
  72. context = super(ProductListView, self).get_context_data(**kwargs)
  73. q = self.get_search_query()
  74. if not q:
  75. context['summary'] = 'All products'
  76. else:
  77. context['summary'] = "Products matching '%s'" % q
  78. context['search_term'] = q
  79. return context