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

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204
  1. from django.db.models import Q, get_model
  2. from django.contrib import messages
  3. from django.utils.translation import ugettext_lazy as _
  4. from django.http import HttpResponseRedirect
  5. from django.core.urlresolvers import reverse
  6. from django.views.generic import ListView, DetailView, DeleteView, \
  7. UpdateView, FormView
  8. from django.views.generic.detail import SingleObjectMixin
  9. from oscar.apps.customer.utils import normalise_email
  10. from oscar.views.generic import BulkEditMixin
  11. from oscar.core.compat import get_user_model
  12. from oscar.core.loading import get_class, get_classes
  13. UserSearchForm, ProductAlertSearchForm, ProductAlertUpdateForm = get_classes(
  14. 'dashboard.users.forms', ('UserSearchForm', 'ProductAlertSearchForm',
  15. 'ProductAlertUpdateForm'))
  16. PasswordResetForm = get_class('customer.forms', 'PasswordResetForm')
  17. ProductAlert = get_model('customer', 'ProductAlert')
  18. User = get_user_model()
  19. class IndexView(BulkEditMixin, ListView):
  20. template_name = 'dashboard/users/index.html'
  21. paginate_by = 25
  22. model = User
  23. actions = ('make_active', 'make_inactive', )
  24. current_view = 'dashboard:users-index'
  25. form_class = UserSearchForm
  26. desc_template = _('%(main_filter)s %(email_filter)s %(name_filter)s')
  27. description = ''
  28. context_object_name = 'user_list'
  29. def get_queryset(self):
  30. queryset = self.model.objects.all().order_by('-date_joined')
  31. self.desc_ctx = {
  32. 'main_filter': _('All users'),
  33. 'email_filter': '',
  34. 'name_filter': '',
  35. }
  36. if 'email' not in self.request.GET:
  37. self.form = self.form_class()
  38. return queryset
  39. self.form = self.form_class(self.request.GET)
  40. if not self.form.is_valid():
  41. return queryset
  42. data = self.form.cleaned_data
  43. if data['email']:
  44. email = normalise_email(data['email'])
  45. queryset = queryset.filter(email__startswith=email)
  46. self.desc_ctx['email_filter'] \
  47. = _(" with email matching '%s'") % email
  48. if data['name']:
  49. # If the value is two words, then assume they are first name and
  50. # last name
  51. parts = data['name'].split()
  52. if len(parts) == 2:
  53. condition = Q(first_name__istartswith=parts[0]) \
  54. | Q(last_name__istartswith=parts[1])
  55. else:
  56. condition = Q(first_name__istartswith=data['name']) \
  57. | Q(last_name__istartswith=data['name'])
  58. queryset = queryset.filter(condition).distinct()
  59. self.desc_ctx['name_filter'] \
  60. = _(" with name matching '%s'") % data['name']
  61. return queryset
  62. def get_context_data(self, **kwargs):
  63. context = super(IndexView, self).get_context_data(**kwargs)
  64. context['form'] = self.form
  65. context['queryset_description'] = self.desc_template % self.desc_ctx
  66. return context
  67. def make_inactive(self, request, users):
  68. return self._change_users_active_status(users, False)
  69. def make_active(self, request, users):
  70. return self._change_users_active_status(users, True)
  71. def _change_users_active_status(self, users, value):
  72. for user in users:
  73. if not user.is_superuser:
  74. user.is_active = value
  75. user.save()
  76. messages.info(self.request, _("Users' status successfully changed"))
  77. return HttpResponseRedirect(reverse(self.current_view))
  78. class UserDetailView(DetailView):
  79. template_name = 'dashboard/users/detail.html'
  80. model = User
  81. context_object_name = 'customer'
  82. class PasswordResetView(SingleObjectMixin, FormView):
  83. form_class = PasswordResetForm
  84. http_method_names = ['post']
  85. model = User
  86. def post(self, request, *args, **kwargs):
  87. self.object = self.get_object()
  88. return super(PasswordResetView, self).post(request, *args, **kwargs)
  89. def get_form_kwargs(self):
  90. kwargs = super(PasswordResetView, self).get_form_kwargs()
  91. kwargs['data'] = {'email': self.object.email}
  92. return kwargs
  93. def form_valid(self, form):
  94. # The PasswordResetForm's save method sends the reset email
  95. form.save(request=self.request)
  96. return super(PasswordResetView, self).form_valid(form)
  97. def get_success_url(self):
  98. messages.success(
  99. self.request, _("A password reset email has been sent"))
  100. return reverse(
  101. 'dashboard:user-detail', kwargs={'pk': self.object.id}
  102. )
  103. class ProductAlertListView(ListView):
  104. model = ProductAlert
  105. form_class = ProductAlertSearchForm
  106. context_object_name = 'alerts'
  107. template_name = 'dashboard/users/alerts/list.html'
  108. paginate_by = 20
  109. base_description = _('All Alerts')
  110. description = ''
  111. def get_queryset(self):
  112. queryset = self.model.objects.all()
  113. self.description = self.base_description
  114. self.form = self.form_class(self.request.GET)
  115. if not self.form.is_valid():
  116. return queryset
  117. data = self.form.cleaned_data
  118. if data['status']:
  119. queryset = queryset.filter(status=data['status']).distinct()
  120. self.description \
  121. += _(" with status matching '%s'") % data['status']
  122. if data['name']:
  123. # If the value is two words, then assume they are first name and
  124. # last name
  125. parts = data['name'].split()
  126. if len(parts) >= 2:
  127. queryset = queryset.filter(
  128. user__first_name__istartswith=parts[0],
  129. user__last_name__istartswith=parts[1]
  130. ).distinct()
  131. else:
  132. queryset = queryset.filter(
  133. Q(user__first_name__istartswith=parts[0]) |
  134. Q(user__last_name__istartswith=parts[-1])
  135. ).distinct()
  136. self.description \
  137. += _(" with customer name matching '%s'") % data['name']
  138. if data['email']:
  139. queryset = queryset.filter(
  140. Q(user__email__icontains=data['email']) |
  141. Q(email__icontains=data['email'])
  142. )
  143. self.description \
  144. += _(" with customer email matching '%s'") % data['email']
  145. return queryset
  146. def get_context_data(self, **kwargs):
  147. context = super(ProductAlertListView, self).get_context_data(**kwargs)
  148. context['form'] = self.form
  149. context['queryset_description'] = self.description
  150. return context
  151. class ProductAlertUpdateView(UpdateView):
  152. template_name = 'dashboard/users/alerts/update.html'
  153. model = ProductAlert
  154. form_class = ProductAlertUpdateForm
  155. context_object_name = 'alert'
  156. def get_success_url(self):
  157. messages.success(self.request, _("Product alert saved"))
  158. return reverse('dashboard:user-alert-list')
  159. class ProductAlertDeleteView(DeleteView):
  160. model = ProductAlert
  161. template_name = 'dashboard/users/alerts/delete.html'
  162. context_object_name = 'alert'
  163. def get_success_url(self):
  164. messages.warning(self.request, _("Product alert deleted"))
  165. return reverse('dashboard:user-alert-list')