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 9.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266
  1. import urlparse
  2. from django.shortcuts import get_object_or_404
  3. from django.views.generic import TemplateView, ListView, DetailView, CreateView, UpdateView, DeleteView
  4. from django.core.urlresolvers import reverse
  5. from django.http import HttpResponseRedirect, Http404
  6. from django.contrib import messages
  7. from django.utils.translation import ugettext as _
  8. from django.contrib.auth import authenticate, login as auth_login
  9. from django.contrib.sites.models import get_current_site
  10. from django.conf import settings
  11. from django.db.models import get_model
  12. from oscar.apps.address.forms import UserAddressForm
  13. from oscar.views.generic import PostActionMixin
  14. from oscar.apps.customer.forms import EmailAuthenticationForm, EmailUserCreationForm
  15. from oscar.core.loading import import_module
  16. import_module('customer.utils', ['Dispatcher'], locals())
  17. order_model = get_model('order', 'Order')
  18. order_line_model = get_model('order', 'Line')
  19. basket_model = get_model('basket', 'Basket')
  20. user_address_model = get_model('address', 'UserAddress')
  21. email_model = get_model('customer', 'email')
  22. communicationtype_model = get_model('customer', 'communicationeventtype')
  23. class AccountSummaryView(ListView):
  24. """Customer order history"""
  25. context_object_name = "orders"
  26. template_name = 'customer/profile.html'
  27. paginate_by = 20
  28. model = order_model
  29. def get_queryset(self):
  30. """Return a customer's orders"""
  31. return self.model._default_manager.filter(user=self.request.user)[0:5]
  32. class AccountAuthView(TemplateView):
  33. template_name = 'customer/login_registration.html'
  34. redirect_field_name = 'next'
  35. login_prefix = 'login'
  36. registration_prefix = 'registration'
  37. communication_type_code = 'REGISTRATION'
  38. def get_logged_in_redirect(self):
  39. return reverse('customer:summary')
  40. def get_context_data(self, *args, **kwargs):
  41. context = super(AccountAuthView, self).get_context_data(*args, **kwargs)
  42. redirect_to = self.request.REQUEST.get(self.redirect_field_name, '')
  43. context[self.redirect_field_name] = redirect_to
  44. context['login_form'] = EmailAuthenticationForm(prefix=self.login_prefix)
  45. context['registration_form'] = EmailUserCreationForm(prefix=self.registration_prefix)
  46. return context
  47. def check_redirect(self, context):
  48. redirect_to = context.get(self.redirect_field_name)
  49. netloc = urlparse.urlparse(redirect_to)[1]
  50. if not redirect_to:
  51. redirect_to = settings.LOGIN_REDIRECT_URL
  52. elif netloc and netloc != self.request.get_host():
  53. redirect_to = settings.LOGIN_REDIRECT_URL
  54. return redirect_to
  55. def send_registration_email(self, user):
  56. code = self.communication_type_code
  57. ctx = {'user': user,
  58. 'site': get_current_site(self.request)}
  59. try:
  60. event_type = communicationtype_model.objects.get(code=code)
  61. except communicationtype_model.DoesNotExist:
  62. # No event in database, attempt to find templates for this type
  63. messages = communicationtype_model.objects.get_and_render(code, ctx)
  64. else:
  65. # Create order event
  66. messages = event_type.get_messages(ctx)
  67. if messages and messages['body']:
  68. dispatcher = Dispatcher()
  69. dispatcher.dispatch_user_messages(user, messages)
  70. def get(self, request, *args, **kwargs):
  71. context = self.get_context_data(*args, **kwargs)
  72. if request.user.is_authenticated():
  73. return HttpResponseRedirect(self.get_logged_in_redirect())
  74. self.request.session.set_test_cookie()
  75. return self.render_to_response(context)
  76. def post(self, request, *args, **kwargs):
  77. context = self.get_context_data(*args, **kwargs)
  78. redirect_to = self.check_redirect(context)
  79. if u'login_submit' in self.request.POST:
  80. login_form = EmailAuthenticationForm(prefix=self.login_prefix, data=request.POST)
  81. if login_form.is_valid():
  82. auth_login(request, login_form.get_user())
  83. if request.session.test_cookie_worked():
  84. request.session.delete_test_cookie()
  85. return HttpResponseRedirect(redirect_to)
  86. context['login_form'] = login_form
  87. if u'registration_submit' in self.request.POST:
  88. registration_form = EmailUserCreationForm(prefix=self.registration_prefix, data=request.POST)
  89. context['registration_form'] = registration_form
  90. if registration_form.is_valid():
  91. user = registration_form.save()
  92. if getattr(settings, 'OSCAR_SEND_REGISTRATION_EMAIL', True):
  93. self.send_registration_email(user)
  94. user = authenticate(username=user.email, password=registration_form.cleaned_data['password1'])
  95. auth_login(self.request, user)
  96. if self.request.session.test_cookie_worked():
  97. self.request.session.delete_test_cookie()
  98. return HttpResponseRedirect(redirect_to)
  99. self.request.session.set_test_cookie()
  100. return self.render_to_response(context)
  101. class EmailHistoryView(ListView):
  102. """Customer email history"""
  103. context_object_name = "emails"
  104. template_name = 'customer/email-history.html'
  105. paginate_by = 20
  106. def get_queryset(self):
  107. """Return a customer's orders"""
  108. return email_model._default_manager.filter(user=self.request.user)
  109. class EmailDetailView(DetailView):
  110. """Customer order details"""
  111. template_name = "customer/email.html"
  112. context_object_name = 'email'
  113. def get_object(self):
  114. """Return an order object or 404"""
  115. return get_object_or_404(email_model, user=self.request.user, id=self.kwargs['email_id'])
  116. class OrderHistoryView(ListView):
  117. """Customer order history"""
  118. context_object_name = "orders"
  119. template_name = 'customer/order-history.html'
  120. paginate_by = 20
  121. model = order_model
  122. def get_queryset(self):
  123. """Return a customer's orders"""
  124. return self.model._default_manager.filter(user=self.request.user)
  125. class OrderDetailView(DetailView):
  126. """Customer order details"""
  127. model = order_model
  128. def get_template_names(self):
  129. return ["customer/order.html"]
  130. def get_object(self):
  131. return get_object_or_404(self.model, user=self.request.user, number=self.kwargs['order_number'])
  132. class OrderLineView(DetailView, PostActionMixin):
  133. """Customer order line"""
  134. def get_object(self):
  135. """Return an order object or 404"""
  136. order = get_object_or_404(order_model, user=self.request.user, number=self.kwargs['order_number'])
  137. return order.lines.get(id=self.kwargs['line_id'])
  138. def do_reorder(self, line):
  139. if not line.product:
  140. messages.info(self.request, _("This product is no longer available for re-order"))
  141. return
  142. # We need to pass response to the get_or_create... method
  143. # as a new basket might need to be created
  144. self.response = HttpResponseRedirect(reverse('basket:summary'))
  145. basket = self.request.basket
  146. # Convert line attributes into basket options
  147. options = []
  148. for attribute in line.attributes.all():
  149. if attribute.option:
  150. options.append({'option': attribute.option, 'value': attribute.value})
  151. basket.add_product(line.product, 1, options)
  152. messages.info(self.request, "Line reordered")
  153. class AddressListView(ListView):
  154. """Customer address book"""
  155. context_object_name = "addresses"
  156. template_name = 'customer/address-book.html'
  157. paginate_by = 40
  158. def get_queryset(self):
  159. """Return a customer's addresses"""
  160. return user_address_model._default_manager.filter(user=self.request.user)
  161. class AddressCreateView(CreateView):
  162. form_class = UserAddressForm
  163. mode = user_address_model
  164. def form_valid(self, form):
  165. self.object = form.save(commit=False)
  166. self.object.user = self.request.user
  167. self.object.save()
  168. return HttpResponseRedirect(self.get_success_url())
  169. def get_template_names(self):
  170. return ["customer/address-create.html"]
  171. def get_success_url(self):
  172. return reverse('customer:address-list')
  173. class AddressUpdateView(UpdateView):
  174. form_class = UserAddressForm
  175. model = user_address_model
  176. def get_queryset(self):
  177. """Return a customer's addresses"""
  178. return user_address_model._default_manager.filter(user=self.request.user)
  179. def get_template_names(self):
  180. return ["customer/address-form.html"]
  181. def get_success_url(self):
  182. return reverse('customer:address-detail', kwargs={'pk': self.get_object().pk })
  183. class AddressDeleteView(DeleteView):
  184. model = user_address_model
  185. def get_queryset(self):
  186. """Return a customer's addresses"""
  187. return user_address_model._default_manager.filter(user=self.request.user)
  188. def get_success_url(self):
  189. return reverse('customer:address-list')
  190. def get_template_names(self):
  191. return ["customer/address-delete.html"]
  192. class AnonymousOrderDetailView(DetailView):
  193. model = order_model
  194. def get_template_names(self):
  195. return ["customer/anon-order.html"]
  196. def get_object(self):
  197. order = get_object_or_404(self.model, user=None, number=self.kwargs['order_number'])
  198. if self.kwargs['hash'] != order.verification_hash():
  199. raise Http404()
  200. return order