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

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218
  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
  6. from django.contrib import messages
  7. from django.utils.translation import ugettext as _
  8. from django.contrib.auth import authenticate
  9. from django.contrib.auth import login as auth_login
  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. order_model = get_model('order', 'Order')
  16. order_line_model = get_model('order', 'Line')
  17. basket_model = get_model('basket', 'Basket')
  18. user_address_model = get_model('address', 'UserAddress')
  19. email_model = get_model('customer', 'email')
  20. class AccountSummaryView(ListView):
  21. """Customer order history"""
  22. context_object_name = "orders"
  23. template_name = 'customer/profile.html'
  24. paginate_by = 20
  25. model = order_model
  26. def get_queryset(self):
  27. """Return a customer's orders"""
  28. return self.model._default_manager.filter(user=self.request.user)[0:5]
  29. class AccountAuthView(TemplateView):
  30. template_name = 'customer/login_registration.html'
  31. redirect_field_name = 'next'
  32. login_prefix = 'login'
  33. registration_prefix = 'registration'
  34. def get_logged_in_redirect(self):
  35. return reverse('customer:summary')
  36. def get_context_data(self, *args, **kwargs):
  37. context = super(AccountAuthView, self).get_context_data(*args, **kwargs)
  38. redirect_to = self.request.REQUEST.get(self.redirect_field_name, '')
  39. context[self.redirect_field_name] = redirect_to
  40. context['login_form'] = EmailAuthenticationForm(prefix=self.login_prefix)
  41. context['registration_form'] = EmailUserCreationForm(prefix=self.registration_prefix)
  42. return context
  43. def check_redirect(self, context):
  44. redirect_to = context.get(self.redirect_field_name)
  45. netloc = urlparse.urlparse(redirect_to)[1]
  46. if not redirect_to:
  47. redirect_to = settings.LOGIN_REDIRECT_URL
  48. elif netloc and netloc != self.request.get_host():
  49. redirect_to = settings.LOGIN_REDIRECT_URL
  50. return redirect_to
  51. def get(self, request, *args, **kwargs):
  52. context = self.get_context_data(*args, **kwargs)
  53. if request.user.is_authenticated():
  54. return HttpResponseRedirect(self.get_logged_in_redirect())
  55. self.request.session.set_test_cookie()
  56. return self.render_to_response(context)
  57. def post(self, request, *args, **kwargs):
  58. context = self.get_context_data(*args, **kwargs)
  59. redirect_to = self.check_redirect(context)
  60. if u'login_submit' in self.request.POST:
  61. login_form = EmailAuthenticationForm(prefix=self.login_prefix, data=request.POST)
  62. if login_form.is_valid():
  63. auth_login(request, login_form.get_user())
  64. if request.session.test_cookie_worked():
  65. request.session.delete_test_cookie()
  66. return HttpResponseRedirect(redirect_to)
  67. context['login_form'] = login_form
  68. if u'registration_submit' in self.request.POST:
  69. registration_form = EmailUserCreationForm(prefix=self.registration_prefix, data=request.POST)
  70. context['registration_form'] = registration_form
  71. if registration_form.is_valid():
  72. user = registration_form.save()
  73. authenticate(username=user.email, password=registration_form.cleaned_data['password2'])
  74. auth_login(self.request, user)
  75. if self.request.session.test_cookie_worked():
  76. self.request.session.delete_test_cookie()
  77. return HttpResponseRedirect(redirect_to)
  78. self.request.session.set_test_cookie()
  79. return self.render_to_response(context)
  80. class EmailHistoryView(ListView):
  81. """Customer email history"""
  82. context_object_name = "emails"
  83. template_name = 'customer/email-history.html'
  84. paginate_by = 20
  85. def get_queryset(self):
  86. """Return a customer's orders"""
  87. return email_model._default_manager.filter(user=self.request.user)
  88. class EmailDetailView(DetailView):
  89. """Customer order details"""
  90. template_name = "customer/email.html"
  91. context_object_name = 'email'
  92. def get_object(self):
  93. """Return an order object or 404"""
  94. return get_object_or_404(email_model, user=self.request.user, id=self.kwargs['email_id'])
  95. class OrderHistoryView(ListView):
  96. """Customer order history"""
  97. context_object_name = "orders"
  98. template_name = 'customer/order-history.html'
  99. paginate_by = 20
  100. model = order_model
  101. def get_queryset(self):
  102. """Return a customer's orders"""
  103. return self.model._default_manager.filter(user=self.request.user)
  104. class OrderDetailView(DetailView):
  105. """Customer order details"""
  106. model = order_model
  107. def get_template_names(self):
  108. return ["customer/order.html"]
  109. def get_object(self):
  110. return get_object_or_404(self.model, user=self.request.user, number=self.kwargs['order_number'])
  111. class OrderLineView(DetailView, PostActionMixin):
  112. """Customer order line"""
  113. def get_object(self):
  114. """Return an order object or 404"""
  115. order = get_object_or_404(order_model, user=self.request.user, number=self.kwargs['order_number'])
  116. return order.lines.get(id=self.kwargs['line_id'])
  117. def do_reorder(self, line):
  118. if not line.product:
  119. messages.info(self.request, _("This product is no longer available for re-order"))
  120. return
  121. # We need to pass response to the get_or_create... method
  122. # as a new basket might need to be created
  123. self.response = HttpResponseRedirect(reverse('basket:summary'))
  124. basket = self.request.basket
  125. # Convert line attributes into basket options
  126. options = []
  127. for attribute in line.attributes.all():
  128. if attribute.option:
  129. options.append({'option': attribute.option, 'value': attribute.value})
  130. basket.add_product(line.product, 1, options)
  131. messages.info(self.request, "Line reordered")
  132. class AddressListView(ListView):
  133. """Customer address book"""
  134. context_object_name = "addresses"
  135. template_name = 'customer/address-book.html'
  136. paginate_by = 40
  137. def get_queryset(self):
  138. """Return a customer's addresses"""
  139. return user_address_model._default_manager.filter(user=self.request.user)
  140. class AddressCreateView(CreateView):
  141. form_class = UserAddressForm
  142. mode = user_address_model
  143. def form_valid(self, form):
  144. self.object = form.save(commit=False)
  145. self.object.user = self.request.user
  146. self.object.save()
  147. return HttpResponseRedirect(self.get_success_url())
  148. def get_template_names(self):
  149. return ["customer/address-create.html"]
  150. def get_success_url(self):
  151. return reverse('customer:address-list')
  152. class AddressUpdateView(UpdateView):
  153. form_class = UserAddressForm
  154. model = user_address_model
  155. def get_template_names(self):
  156. return ["customer/address-form.html"]
  157. def get_success_url(self):
  158. return reverse('customer:address-detail', kwargs={'pk': self.get_object().pk })
  159. class AddressDeleteView(DeleteView):
  160. model = user_address_model
  161. def get_success_url(self):
  162. return reverse('customer:address-list')
  163. def get_template_names(self):
  164. return ["customer/address-delete.html"]