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.

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