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.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  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.shortcuts import get_object_or_404
  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. def get_queryset(self):
  29. queryset = self.model.objects.all().order_by('-date_joined')
  30. self.desc_ctx = {
  31. 'main_filter': _('All users'),
  32. 'email_filter': '',
  33. 'name_filter': '',
  34. }
  35. if 'email' not in self.request.GET:
  36. self.form = self.form_class()
  37. return queryset
  38. self.form = self.form_class(self.request.GET)
  39. if not self.form.is_valid():
  40. return queryset
  41. data = self.form.cleaned_data
  42. if data['email']:
  43. email = normalise_email(data['email'])
  44. queryset = queryset.filter(email__startswith=email)
  45. self.desc_ctx['email_filter'] = _(" with email matching '%s'") % email
  46. if data['name']:
  47. # If the value is two words, then assume they are first name and last name
  48. parts = data['name'].split()
  49. if len(parts) == 2:
  50. queryset = queryset.filter(Q(first_name__istartswith=parts[0]) |
  51. Q(last_name__istartswith=parts[1])).distinct()
  52. else:
  53. queryset = queryset.filter(Q(first_name__istartswith=data['name']) |
  54. Q(last_name__istartswith=data['name'])).distinct()
  55. self.desc_ctx['name_filter'] = _(" with name matching '%s'") % data['name']
  56. return queryset
  57. def get_context_data(self, **kwargs):
  58. context = super(IndexView, self).get_context_data(**kwargs)
  59. context['form'] = self.form
  60. context['queryset_description'] = self.desc_template % self.desc_ctx
  61. return context
  62. def make_inactive(self, request, users):
  63. return self._change_users_active_status(users, False)
  64. def make_active(self, request, users):
  65. return self._change_users_active_status(users, True)
  66. def _change_users_active_status(self, users, value):
  67. for user in users:
  68. if not user.is_superuser:
  69. user.is_active = value
  70. user.save()
  71. messages.info(self.request, _("Users' status successfully changed"))
  72. return HttpResponseRedirect(reverse(self.current_view))
  73. class UserDetailView(DetailView):
  74. template_name = 'dashboard/users/detail.html'
  75. model = User
  76. context_object_name = 'customer'
  77. class PasswordResetView(FormView):
  78. form_class = PasswordResetForm
  79. http_method_names = ['post']
  80. def post(self, request, *args, **kwargs):
  81. self.user = get_object_or_404(
  82. User, id=kwargs['pk'])
  83. return super(PasswordResetView, self).post(request, *args, **kwargs)
  84. def get_form_kwargs(self):
  85. return {'data': {'email': self.user.email}}
  86. def form_valid(self, form):
  87. # The PasswordResetForm's save method sends the reset email
  88. form.save(request=self.request)
  89. return super(PasswordResetView, self).form_valid(form)
  90. def get_success_url(self):
  91. messages.success(
  92. self.request, _("A password reset email has been sent"))
  93. return reverse(
  94. 'dashboard:user-detail', kwargs={'pk': self.user.id}
  95. )
  96. class ProductAlertListView(ListView):
  97. model = ProductAlert
  98. form_class = ProductAlertSearchForm
  99. context_object_name = 'alerts'
  100. template_name = 'dashboard/users/alerts/list.html'
  101. paginate_by = 20
  102. base_description = _('All Alerts')
  103. description = ''
  104. def get_queryset(self):
  105. queryset = self.model.objects.all()
  106. self.description = self.base_description
  107. self.form = self.form_class(self.request.GET)
  108. if not self.form.is_valid():
  109. return queryset
  110. data = self.form.cleaned_data
  111. if data['status']:
  112. queryset = queryset.filter(status=data['status']).distinct()
  113. self.description += _(" with status matching '%s'") % data['status']
  114. if data['name']:
  115. # If the value is two words, then assume they are first name and
  116. # last name
  117. parts = data['name'].split()
  118. if len(parts) >= 2:
  119. queryset = queryset.filter(
  120. user__first_name__istartswith=parts[0],
  121. user__last_name__istartswith=parts[1]
  122. ).distinct()
  123. else:
  124. queryset = queryset.filter(
  125. Q(user__first_name__istartswith=parts[0]) |
  126. Q(user__last_name__istartswith=parts[-1])
  127. ).distinct()
  128. self.description += _(" with customer name matching '%s'") % data['name']
  129. if data['email']:
  130. queryset = queryset.filter(
  131. Q(user__email__icontains=data['email']) |
  132. Q(email__icontains=data['email'])
  133. )
  134. self.description += _(" with customer email matching '%s'") % data['email']
  135. return queryset
  136. def get_context_data(self, **kwargs):
  137. context = super(ProductAlertListView, self).get_context_data(**kwargs)
  138. context['form'] = self.form
  139. context['queryset_description'] = self.description
  140. return context
  141. class ProductAlertUpdateView(UpdateView):
  142. template_name = 'dashboard/users/alerts/update.html'
  143. model = ProductAlert
  144. form_class = ProductAlertUpdateForm
  145. context_object_name = 'alert'
  146. def get_success_url(self):
  147. messages.success(self.request, _("Product alert saved"))
  148. return reverse('dashboard:user-alert-list')
  149. class ProductAlertDeleteView(DeleteView):
  150. model = ProductAlert
  151. template_name = 'dashboard/users/alerts/delete.html'
  152. context_object_name = 'alert'
  153. def get_success_url(self):
  154. messages.warning(self.request, _("Product alert deleted"))
  155. return reverse('dashboard:user-alert-list')