Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.

views.py 6.0KB

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