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

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256
  1. from django.contrib import messages
  2. from django.contrib.auth.models import User
  3. from django.core.urlresolvers import reverse_lazy, reverse
  4. from django.db.models import get_model
  5. from django.http import HttpResponseRedirect
  6. from django.shortcuts import get_object_or_404
  7. from django.utils.translation import ugettext_lazy as _
  8. from django.template.loader import render_to_string
  9. from django.views import generic
  10. from oscar.apps.customer.utils import normalise_email
  11. from oscar.apps.dashboard.partners.forms import UserEmailForm, ExistingUserForm, NewUserForm
  12. from oscar.core.loading import get_classes
  13. Partner = get_model('partner', 'Partner')
  14. PartnerSearchForm, PartnerCreateForm = get_classes(
  15. 'dashboard.partners.forms', ['PartnerSearchForm', 'PartnerCreateForm'])
  16. class PartnerListView(generic.ListView):
  17. model = Partner
  18. context_object_name = 'partners'
  19. template_name = 'dashboard/partners/partner_list.html'
  20. form_class = PartnerSearchForm
  21. def get_queryset(self):
  22. qs = self.model._default_manager.all()
  23. qs = self.sort_queryset(qs)
  24. self.description = _("All partners")
  25. # We track whether the queryset is filtered to determine whether we
  26. # show the search form 'reset' button.
  27. self.is_filtered = False
  28. self.form = self.form_class(self.request.GET)
  29. if not self.form.is_valid():
  30. return qs
  31. data = self.form.cleaned_data
  32. if data['name']:
  33. qs = qs.filter(name__icontains=data['name'])
  34. self.description = _("Partners matching '%s'") % data['name']
  35. self.is_filtered = True
  36. return qs
  37. def sort_queryset(self, queryset):
  38. sort = self.request.GET.get('sort', None)
  39. allowed_sorts = ['name']
  40. if sort in allowed_sorts:
  41. direction = self.request.GET.get('dir', 'desc')
  42. sort = ('-' if direction == 'desc' else '') + sort
  43. queryset = queryset.order_by(sort)
  44. return queryset
  45. def get_context_data(self, **kwargs):
  46. ctx = super(PartnerListView, self).get_context_data(**kwargs)
  47. ctx['queryset_description'] = self.description
  48. ctx['form'] = self.form
  49. ctx['is_filtered'] = self.is_filtered
  50. return ctx
  51. class PartnerCreateView(generic.CreateView):
  52. model = Partner
  53. template_name = 'dashboard/partners/partner_form.html'
  54. form_class = PartnerCreateForm
  55. success_url = reverse_lazy('dashboard:partner-list')
  56. def get_context_data(self, **kwargs):
  57. ctx = super(PartnerCreateView, self).get_context_data(**kwargs)
  58. ctx['title'] = _('Create new partner')
  59. return ctx
  60. def get_success_url(self):
  61. messages.success(self.request,
  62. _("Partner '%s' was created successfully.") %
  63. self.object.name)
  64. return reverse_lazy('dashboard:partner-list')
  65. class PartnerManageView(generic.UpdateView):
  66. """
  67. Is a merge of an UpdateView to update the name of the partner,
  68. and a ListView to list associated users.
  69. """
  70. model = Partner
  71. template_name = 'dashboard/partners/partner_manage.html'
  72. form_class = PartnerCreateForm
  73. context_object_name = 'partner'
  74. def get_context_data(self, **kwargs):
  75. ctx = super(PartnerManageView, self).get_context_data(**kwargs)
  76. ctx['title'] = self.object.name
  77. ctx['users'] = self.object.users.all()
  78. return ctx
  79. def get_success_url(self):
  80. messages.success(self.request,
  81. _("Partner '%s' was updated successfully.") %
  82. self.object.name)
  83. return reverse_lazy('dashboard:partner-list')
  84. class PartnerDeleteView(generic.DeleteView):
  85. model = Partner
  86. template_name = 'dashboard/partners/partner_delete.html'
  87. def get_success_url(self):
  88. messages.success(self.request,
  89. _("Partner '%s' was deleted successfully.") %
  90. self.object.name)
  91. return reverse_lazy('dashboard:partner-list')
  92. # =============
  93. # Partner users
  94. # =============
  95. class PartnerUserCreateView(generic.CreateView):
  96. model = User
  97. template_name = 'dashboard/partners/partner_user_form.html'
  98. form_class = NewUserForm
  99. def dispatch(self, request, *args, **kwargs):
  100. self.partner = get_object_or_404(
  101. Partner, pk=kwargs.get('partner_pk', None))
  102. return super(PartnerUserCreateView, self).dispatch(
  103. request, *args, **kwargs)
  104. def get_context_data(self, **kwargs):
  105. ctx = super(PartnerUserCreateView, self).get_context_data(**kwargs)
  106. ctx['partner'] = self.partner
  107. ctx['title'] = _('Create user')
  108. return ctx
  109. def get_form_kwargs(self):
  110. kwargs = super(PartnerUserCreateView, self).get_form_kwargs()
  111. kwargs['partner'] = self.partner
  112. return kwargs
  113. def get_success_url(self):
  114. name = self.object.get_full_name() or self.object.email
  115. messages.success(self.request,
  116. _("User '%s' was created successfully.") % name)
  117. return reverse_lazy('dashboard:partner-list')
  118. class PartnerUserSelectView(generic.ListView):
  119. template_name = 'dashboard/partners/partner_user_select.html'
  120. form_class = UserEmailForm
  121. context_object_name = 'users'
  122. def dispatch(self, request, *args, **kwargs):
  123. self.partner = get_object_or_404(
  124. Partner, pk=kwargs.get('partner_pk', None))
  125. return super(PartnerUserSelectView, self).dispatch(
  126. request, *args, **kwargs)
  127. def get(self, request, *args, **kwargs):
  128. data = None
  129. if 'email' in request.GET:
  130. data = request.GET
  131. self.form = self.form_class(data)
  132. return super(PartnerUserSelectView, self).get(request, *args, **kwargs)
  133. def get_context_data(self, **kwargs):
  134. ctx = super(PartnerUserSelectView, self).get_context_data(**kwargs)
  135. ctx['partner'] = self.partner
  136. ctx['form'] = self.form
  137. return ctx
  138. def get_queryset(self):
  139. if self.form.is_valid():
  140. email = normalise_email(self.form.cleaned_data['email'])
  141. return User.objects.filter(is_staff=True, email__icontains=email)
  142. else:
  143. return User.objects.none()
  144. class PartnerUserLinkView(generic.View):
  145. def get(self, request, user_pk, partner_pk):
  146. # need to allow GET to make Undo link in PartnerUserUnlinkView work
  147. return self.post(request, user_pk, partner_pk)
  148. def post(self, request, user_pk, partner_pk):
  149. user = get_object_or_404(User, pk=user_pk)
  150. partner = get_object_or_404(Partner, pk=partner_pk)
  151. name = user.get_full_name() or user.email
  152. if not partner.users.filter(pk=user_pk).exists():
  153. partner.users.add(user)
  154. messages.success(
  155. request, _("User '%(name)s' was linked to '%(partner_name)s'") %
  156. {'name': name, 'partner_name': partner.name})
  157. else:
  158. messages.error(
  159. request, _("User '%(name)s' is already linked to '%(partner_name)s'") %
  160. {'name': name, 'partner_name': partner.name})
  161. return HttpResponseRedirect(reverse('dashboard:partner-manage',
  162. kwargs={'pk': partner_pk}))
  163. class PartnerUserUnlinkView(generic.View):
  164. def post(self, request, user_pk, partner_pk):
  165. user = get_object_or_404(User, pk=user_pk)
  166. name = user.get_full_name() or user.email
  167. partner = get_object_or_404(Partner, pk=partner_pk)
  168. if partner.users.filter(pk=user_pk).exists():
  169. partner.users.remove(user)
  170. msg = render_to_string(
  171. 'dashboard/partners/messages/user_unlinked.html',
  172. {'user_name': name,
  173. 'partner_name': partner.name,
  174. 'user_pk': user_pk,
  175. 'partner_pk': partner_pk })
  176. messages.success(self.request, msg, extra_tags='safe')
  177. else:
  178. messages.error(
  179. request, _("User '%(name)s' is not linked to '%(partner_name)s'") %
  180. {'name': name, 'partner_name': partner.name})
  181. return HttpResponseRedirect(reverse('dashboard:partner-manage',
  182. kwargs={'pk': partner_pk}))
  183. # =====
  184. # Users
  185. # =====
  186. class PartnerUserUpdateView(generic.UpdateView):
  187. template_name = 'dashboard/partners/partner_user_form.html'
  188. form_class = ExistingUserForm
  189. def get_object(self, queryset=None):
  190. return get_object_or_404(User,
  191. pk=self.kwargs['user_pk'],
  192. partners__pk=self.kwargs['partner_pk'],
  193. is_staff=True)
  194. def get_context_data(self, **kwargs):
  195. ctx = super(PartnerUserUpdateView, self).get_context_data(**kwargs)
  196. name = self.object.get_full_name() or self.object.email
  197. ctx['title'] = _("Edit user '%s'") % name
  198. return ctx
  199. def get_success_url(self):
  200. name = self.object.get_full_name() or self.object.email
  201. messages.success(self.request,
  202. _("User '%s' was updated successfully.") % name)
  203. return reverse_lazy('dashboard:partner-list')