Du kannst nicht mehr als 25 Themen auswählen Themen müssen mit entweder einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.

views.py 4.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. from django.http import HttpResponseRedirect, Http404
  2. from django.views import generic
  3. from django.db.models import get_model
  4. from django.shortcuts import get_object_or_404
  5. from django.contrib import messages
  6. from django.utils.translation import ugettext_lazy as _
  7. from django import http
  8. from django.views.generic import TemplateView
  9. from django.views.generic.list import MultipleObjectMixin
  10. from oscar.core.loading import get_class
  11. from oscar.apps.customer.alerts import utils
  12. from oscar.apps.customer.mixins import PageTitleMixin
  13. Product = get_model('catalogue', 'Product')
  14. ProductAlert = get_model('customer', 'ProductAlert')
  15. ProductAlertForm = get_class('customer.forms', 'ProductAlertForm')
  16. class ProductAlertListView(PageTitleMixin, generic.ListView):
  17. model = ProductAlert
  18. template_name = 'customer/alerts/alert_list.html'
  19. context_object_name = 'alerts'
  20. page_title = _('Product Alerts')
  21. active_tab = 'alerts'
  22. def get_queryset(self):
  23. return ProductAlert.objects.select_related().filter(
  24. user=self.request.user,
  25. date_closed=None,
  26. )
  27. class ProductAlertCreateView(generic.CreateView):
  28. """
  29. View to create a new product alert based on a registered user
  30. or an email address provided by an anonymous user.
  31. """
  32. model = ProductAlert
  33. form_class = ProductAlertForm
  34. template_name = 'customer/alerts/form.html'
  35. def get_context_data(self, **kwargs):
  36. ctx = super(ProductAlertCreateView, self).get_context_data(**kwargs)
  37. ctx['product'] = self.product
  38. ctx['alert_form'] = ctx.pop('form')
  39. return ctx
  40. def get(self, request, *args, **kwargs):
  41. product = get_object_or_404(Product, pk=self.kwargs['pk'])
  42. return http.HttpResponseRedirect(product.get_absolute_url())
  43. def post(self, request, *args, **kwargs):
  44. self.product = get_object_or_404(Product, pk=self.kwargs['pk'])
  45. return super(ProductAlertCreateView, self).post(request, *args, **kwargs)
  46. def get_form_kwargs(self):
  47. kwargs = super(ProductAlertCreateView, self).get_form_kwargs()
  48. kwargs['user'] = self.request.user
  49. kwargs['product'] = self.product
  50. return kwargs
  51. def form_valid(self, form):
  52. response = super(ProductAlertCreateView, self).form_valid(form)
  53. if self.object.is_anonymous:
  54. utils.send_alert_confirmation(self.object)
  55. return response
  56. def get_success_url(self):
  57. if self.object.user:
  58. msg = _("An alert has been created")
  59. else:
  60. msg = _("A confirmation email has been sent to %s") % self.object.email
  61. messages.success(self.request, msg)
  62. return self.object.product.get_absolute_url()
  63. class ProductAlertConfirmView(generic.RedirectView):
  64. permanent = False
  65. def get(self, request, *args, **kwargs):
  66. self.alert = get_object_or_404(ProductAlert, key=kwargs['key'])
  67. self.update_alert()
  68. return super(ProductAlertConfirmView, self).get(request, *args, **kwargs)
  69. def update_alert(self):
  70. if self.alert.can_be_confirmed:
  71. self.alert.confirm()
  72. messages.success(self.request, _("Your stock alert is now active"))
  73. else:
  74. messages.error(self.request, _("Your stock alert cannot be confirmed"))
  75. def get_redirect_url(self, **kwargs):
  76. return self.alert.product.get_absolute_url()
  77. class ProductAlertCancelView(generic.RedirectView):
  78. """
  79. This function allows canceling alerts by supplying the key (used for
  80. anonymously created alerts) or the pk (used for alerts created by a
  81. authenticated user).
  82. Specifying the redirect url is possible by supplying a 'next' GET parameter.
  83. It defaults to showing the associated product page.
  84. """
  85. def get(self, request, *args, **kwargs):
  86. if 'key' in kwargs:
  87. self.alert = get_object_or_404(ProductAlert, key=kwargs['key'])
  88. elif 'pk' in kwargs and request.user.is_authenticated():
  89. self.alert = get_object_or_404(ProductAlert, user=self.request.user, pk=kwargs['pk'])
  90. else:
  91. raise Http404
  92. self.update_alert()
  93. return super(ProductAlertCancelView, self).get(request, *args, **kwargs)
  94. def update_alert(self):
  95. if self.alert.can_be_cancelled:
  96. self.alert.cancel()
  97. messages.success(self.request, _("Your stock alert has been cancelled"))
  98. else:
  99. messages.error(self.request, _("Your stock alert cannot be cancelled"))
  100. def get_redirect_url(self, **kwargs):
  101. return self.request.GET.get('next', self.alert.product.get_absolute_url())