| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292 |
- from django.contrib import messages
- from django.core.urlresolvers import reverse_lazy, reverse
- from django.db.models import get_model
- from django.http import HttpResponseRedirect
- from django.shortcuts import get_object_or_404
- from django.utils.translation import ugettext_lazy as _
- from django.template.loader import render_to_string
- from django.views import generic
-
- from oscar.apps.customer.utils import normalise_email
- from oscar.apps.dashboard.partners.forms import UserEmailForm, ExistingUserForm, NewUserForm
- from oscar.core.loading import get_classes
- from oscar.core.compat import get_user_model
-
- User = get_user_model()
- Partner = get_model('partner', 'Partner')
- PartnerSearchForm, PartnerCreateForm, PartnerAddressForm = get_classes(
- 'dashboard.partners.forms',
- ['PartnerSearchForm', 'PartnerCreateForm', 'PartnerAddressForm'])
-
-
- class PartnerListView(generic.ListView):
- model = Partner
- context_object_name = 'partners'
- template_name = 'dashboard/partners/partner_list.html'
- form_class = PartnerSearchForm
-
- def get_queryset(self):
- qs = self.model._default_manager.all()
- qs = self.sort_queryset(qs)
-
- self.description = _("All partners")
-
- # We track whether the queryset is filtered to determine whether we
- # show the search form 'reset' button.
- self.is_filtered = False
- self.form = self.form_class(self.request.GET)
- if not self.form.is_valid():
- return qs
-
- data = self.form.cleaned_data
-
- if data['name']:
- qs = qs.filter(name__icontains=data['name'])
- self.description = _("Partners matching '%s'") % data['name']
- self.is_filtered = True
-
- return qs
-
- def sort_queryset(self, queryset):
- sort = self.request.GET.get('sort', None)
- allowed_sorts = ['name']
- if sort in allowed_sorts:
- direction = self.request.GET.get('dir', 'desc')
- sort = ('-' if direction == 'desc' else '') + sort
- queryset = queryset.order_by(sort)
- return queryset
-
- def get_context_data(self, **kwargs):
- ctx = super(PartnerListView, self).get_context_data(**kwargs)
- ctx['queryset_description'] = self.description
- ctx['form'] = self.form
- ctx['is_filtered'] = self.is_filtered
- return ctx
-
-
- class PartnerCreateView(generic.CreateView):
- model = Partner
- template_name = 'dashboard/partners/partner_form.html'
- form_class = PartnerCreateForm
- success_url = reverse_lazy('dashboard:partner-list')
-
- def get_context_data(self, **kwargs):
- ctx = super(PartnerCreateView, self).get_context_data(**kwargs)
- ctx['title'] = _('Create new partner')
- return ctx
-
- def get_success_url(self):
- messages.success(self.request,
- _("Partner '%s' was created successfully.") %
- self.object.name)
- return reverse_lazy('dashboard:partner-list')
-
-
- class PartnerManageView(generic.TemplateView):
- """
- This multi-purpose view renders out a form to edit the partner's details,
- the associated address and a list of all associated users.
- """
- template_name = 'dashboard/partners/partner_manage.html'
- partner_form_class = PartnerCreateForm
- address_form_class = PartnerAddressForm
-
- def dispatch(self, request, *args, **kwargs):
- self.partner = self.object = get_object_or_404(
- Partner, pk=kwargs['pk'])
- self.address = self.partner.primary_address
- if self.address is None:
- self.address = self.partner.addresses.model(partner=self.partner)
- return super(PartnerManageView, self).dispatch(
- request, *args, **kwargs)
-
- def get(self, request, *args, **kwargs):
- partner_form = self.partner_form_class(instance=self.partner)
- address_form = self.address_form_class(instance=self.address)
- context = self.get_context_data(partner_form, address_form)
- return self.render_to_response(context)
-
- def get_context_data(self, partner_form, address_form, **kwargs):
- ctx = super(PartnerManageView, self).get_context_data(**kwargs)
- ctx['partner'] = self.object
- ctx['title'] = self.object.name
- ctx['users'] = self.object.users.all()
- ctx['partner_form'] = partner_form
- ctx['address_form'] = address_form
- return ctx
-
- def post(self, request, *args, **kwargs):
- if request.POST['submit'] == 'partner_form':
- partner_form = self.partner_form_class(
- request.POST, instance=self.partner)
- if partner_form.is_valid():
- self.partner = self.object = partner_form.save()
- messages.success(
- self.request, _("Partner '%s' was updated successfully.") %
- self.object.name)
- address_form = self.address_form_class(instance=self.address)
- else:
- address_form = self.address_form_class(
- request.POST, instance=self.address)
- if address_form.is_valid():
- address_form.save()
- messages.success(
- self.request, _("Address was updated successfully."))
- partner_form = self.partner_form_class(instance=self.partner)
-
- context = self.get_context_data(partner_form, address_form)
-
- return self.render_to_response(context)
-
-
- class PartnerDeleteView(generic.DeleteView):
- model = Partner
- template_name = 'dashboard/partners/partner_delete.html'
-
- def get_success_url(self):
- messages.success(self.request,
- _("Partner '%s' was deleted successfully.") %
- self.object.name)
- return reverse_lazy('dashboard:partner-list')
-
-
- # =============
- # Partner users
- # =============
-
-
- class PartnerUserCreateView(generic.CreateView):
- model = User
- template_name = 'dashboard/partners/partner_user_form.html'
- form_class = NewUserForm
-
- def dispatch(self, request, *args, **kwargs):
- self.partner = get_object_or_404(
- Partner, pk=kwargs.get('partner_pk', None))
- return super(PartnerUserCreateView, self).dispatch(
- request, *args, **kwargs)
-
- def get_context_data(self, **kwargs):
- ctx = super(PartnerUserCreateView, self).get_context_data(**kwargs)
- ctx['partner'] = self.partner
- ctx['title'] = _('Create user')
- return ctx
-
- def get_form_kwargs(self):
- kwargs = super(PartnerUserCreateView, self).get_form_kwargs()
- kwargs['partner'] = self.partner
- return kwargs
-
- def get_success_url(self):
- name = self.object.get_full_name() or self.object.email
- messages.success(self.request,
- _("User '%s' was created successfully.") % name)
- return reverse_lazy('dashboard:partner-list')
-
-
- class PartnerUserSelectView(generic.ListView):
- template_name = 'dashboard/partners/partner_user_select.html'
- form_class = UserEmailForm
- context_object_name = 'users'
-
- def dispatch(self, request, *args, **kwargs):
- self.partner = get_object_or_404(
- Partner, pk=kwargs.get('partner_pk', None))
- return super(PartnerUserSelectView, self).dispatch(
- request, *args, **kwargs)
-
- def get(self, request, *args, **kwargs):
- data = None
- if 'email' in request.GET:
- data = request.GET
- self.form = self.form_class(data)
- return super(PartnerUserSelectView, self).get(request, *args, **kwargs)
-
- def get_context_data(self, **kwargs):
- ctx = super(PartnerUserSelectView, self).get_context_data(**kwargs)
- ctx['partner'] = self.partner
- ctx['form'] = self.form
- return ctx
-
- def get_queryset(self):
- if self.form.is_valid():
- email = normalise_email(self.form.cleaned_data['email'])
- return User.objects.filter(is_staff=True, email__icontains=email)
- else:
- return User.objects.none()
-
-
- class PartnerUserLinkView(generic.View):
-
- def get(self, request, user_pk, partner_pk):
- # need to allow GET to make Undo link in PartnerUserUnlinkView work
- return self.post(request, user_pk, partner_pk)
-
- def post(self, request, user_pk, partner_pk):
- user = get_object_or_404(User, pk=user_pk)
- partner = get_object_or_404(Partner, pk=partner_pk)
- name = user.get_full_name() or user.email
- if not partner.users.filter(pk=user_pk).exists():
- partner.users.add(user)
- messages.success(
- request, _("User '%(name)s' was linked to '%(partner_name)s'") %
- {'name': name, 'partner_name': partner.name})
- else:
- messages.error(
- request, _("User '%(name)s' is already linked to '%(partner_name)s'") %
- {'name': name, 'partner_name': partner.name})
- return HttpResponseRedirect(reverse('dashboard:partner-manage',
- kwargs={'pk': partner_pk}))
-
-
- class PartnerUserUnlinkView(generic.View):
-
- def post(self, request, user_pk, partner_pk):
- user = get_object_or_404(User, pk=user_pk)
- name = user.get_full_name() or user.email
- partner = get_object_or_404(Partner, pk=partner_pk)
- if partner.users.filter(pk=user_pk).exists():
- partner.users.remove(user)
- msg = render_to_string(
- 'dashboard/partners/messages/user_unlinked.html',
- {'user_name': name,
- 'partner_name': partner.name,
- 'user_pk': user_pk,
- 'partner_pk': partner_pk })
- messages.success(self.request, msg, extra_tags='safe')
- else:
- messages.error(
- request, _("User '%(name)s' is not linked to '%(partner_name)s'") %
- {'name': name, 'partner_name': partner.name})
- return HttpResponseRedirect(reverse('dashboard:partner-manage',
- kwargs={'pk': partner_pk}))
-
-
- # =====
- # Users
- # =====
-
-
- class PartnerUserUpdateView(generic.UpdateView):
- template_name = 'dashboard/partners/partner_user_form.html'
- form_class = ExistingUserForm
-
- def get_object(self, queryset=None):
- return get_object_or_404(User,
- pk=self.kwargs['user_pk'],
- partners__pk=self.kwargs['partner_pk'],
- is_staff=True)
-
- def get_context_data(self, **kwargs):
- ctx = super(PartnerUserUpdateView, self).get_context_data(**kwargs)
- name = self.object.get_full_name() or self.object.email
- ctx['title'] = _("Edit user '%s'") % name
- return ctx
-
- def get_success_url(self):
- name = self.object.get_full_name() or self.object.email
- messages.success(self.request,
- _("User '%s' was updated successfully.") % name)
- return reverse_lazy('dashboard:partner-list')
-
|