# -*- coding: utf-8 -*-
# This file is part of Shuup.
#
# Copyright (c) 2012-2017, Shoop Commerce Ltd. All rights reserved.
#
# This source code is licensed under the OSL-3.0 license found in the
# LICENSE file in the root directory of this source tree.
import six
from django.contrib import messages
from django.contrib.auth.forms import PasswordChangeForm
from django.contrib.auth.views import password_change
from django.http import HttpResponseNotFound
from django.shortcuts import redirect
from django.utils.translation import ugettext_lazy as _
from django.views.generic import FormView, TemplateView
from registration.signals import user_registered
from shuup import configuration
from shuup.core.models import (
get_company_contact, get_person_contact, MutableAddress, SavedAddress
)
from shuup.front.views.dashboard import DashboardViewMixin
from shuup.utils.form_group import FormGroup
from shuup.utils.importing import cached_load
from .forms import CompanyContactForm, PersonContactForm, SavedAddressForm
from .notify_events import CompanyAccountCreated
[docs]class PasswordChangeView(DashboardViewMixin, TemplateView):
template_name = "shuup/customer_information/change_password.jinja"
[docs] def post(self, *args, **kwargs):
response = password_change(
self.request,
post_change_redirect="shuup:customer_edit",
template_name=self.template_name
)
if response.status_code == 302:
messages.success(self.request, _("Password successfully changed."))
return response
[docs] def get_context_data(self, **kwargs):
context = super(PasswordChangeView, self).get_context_data(**kwargs)
context["form"] = PasswordChangeForm(user=self.request.user)
return context
[docs]class CustomerEditView(DashboardViewMixin, FormView):
template_name = "shuup/customer_information/edit_customer.jinja"
def get_form(self, form_class):
contact = get_person_contact(self.request.user)
form_group = FormGroup(**self.get_form_kwargs())
address_form_class = cached_load("SHUUP_ADDRESS_MODEL_FORM")
form_group.add_form_def("billing", address_form_class, kwargs={"instance": contact.default_billing_address})
form_group.add_form_def("shipping", address_form_class, kwargs={"instance": contact.default_shipping_address})
form_group.add_form_def("contact", PersonContactForm, kwargs={"instance": contact})
return form_group
[docs]class CompanyEditView(DashboardViewMixin, FormView):
template_name = "shuup/customer_information/edit_company.jinja"
[docs] def dispatch(self, request, *args, **kwargs):
if not configuration.get(None, "allow_company_registration"):
return HttpResponseNotFound()
return super(CompanyEditView, self).dispatch(request, *args, **kwargs)
def get_form(self, form_class):
user = self.request.user
company = get_company_contact(user)
person = get_person_contact(user)
form_group = FormGroup(**self.get_form_kwargs())
address_form_class = cached_load("SHUUP_ADDRESS_MODEL_FORM")
form_group.add_form_def(
"billing",
address_form_class,
kwargs={
"instance": _get_default_address_for_contact(company, "default_billing_address", person)
}
)
form_group.add_form_def(
"shipping",
address_form_class,
kwargs={
"instance": _get_default_address_for_contact(company, "default_shipping_address", person)
}
)
form_group.add_form_def("contact", CompanyContactForm, kwargs={"instance": company})
return form_group
[docs]class AddressBookView(DashboardViewMixin, TemplateView):
template_name = "shuup/customer_information/addressbook/index.jinja"
[docs] def get_context_data(self, **kwargs):
context = super(AddressBookView, self).get_context_data(**kwargs)
context["addresses"] = SavedAddress.objects.filter(owner=self.request.customer)
context["customer"] = self.request.customer
return context
[docs]class AddressBookEditView(DashboardViewMixin, FormView):
template_name = "shuup/customer_information/addressbook/edit.jinja"
form_class = SavedAddressForm
instance = None
[docs] def dispatch(self, request, *args, **kwargs):
try:
self.instance = SavedAddress.objects.get(pk=kwargs.get("pk", 0), owner=self.request.customer)
except:
self.instance = None
return super(AddressBookEditView, self).dispatch(request, *args, **kwargs)
def get_form(self, form_class):
form_group = FormGroup(**self.get_form_kwargs())
address_kwargs = {}
saved_address_kwargs = {}
if self.instance:
address_kwargs["instance"] = self.instance.address
saved_address_kwargs["initial"] = {
"role": self.instance.role,
"status": self.instance.status,
"title": self.instance.title,
}
form_group.add_form_def("address", cached_load("SHUUP_ADDRESS_MODEL_FORM"), kwargs=address_kwargs)
form_group.add_form_def(
"saved_address",
SavedAddressForm,
kwargs=saved_address_kwargs
)
return form_group
[docs]def delete_address(request, pk):
try:
SavedAddress.objects.get(pk=pk, owner=request.customer).delete()
except SavedAddress.DoesNotExist:
messages.error(request, _("Cannot remove address"))
return redirect("shuup:address_book")
def _get_default_address_for_contact(contact, address_attr, fallback_contact):
if contact and getattr(contact, address_attr, None):
return getattr(contact, address_attr)
if fallback_contact and getattr(fallback_contact, address_attr, None):
return getattr(fallback_contact, address_attr)
return None