Source code for shuup.admin.modules.contacts.forms

# -*- 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.
from django import forms
from django.utils.encoding import force_text
from django.utils.translation import ugettext_lazy as _
from django_countries import countries
from django_countries.fields import LazyTypedChoiceField
from enumfields import EnumField

from shuup.admin.forms.fields import Select2MultipleField
from shuup.admin.forms.widgets import PersonContactChoiceWidget
from shuup.core.fields import LanguageFormField
from shuup.core.models import (
    CompanyContact, Contact, ContactGroup, Gender, PersonContact
)

FIELDS_BY_MODEL_NAME = {
    "Contact": (
        "is_active", "marketing_permission", "phone", "www",
        "timezone", "prefix", "suffix", "name_ext", "email", "tax_group",
        "merchant_notes", "account_manager"
    ),
    "PersonContact": (
        "first_name", "last_name", "gender", "language", "birth_date"
    ),
    "CompanyContact": (
        "name", "tax_number", "members"
    )
}


[docs]class ContactBaseFormMixin(object): def __init__(self, *args, **kwargs): super(ContactBaseFormMixin, self).__init__(*args, **kwargs) self.init_fields()
[docs] def init_fields(self): self.fields["groups"] = forms.ModelMultipleChoiceField( queryset=ContactGroup.objects.all_except_defaults(), initial=(self.instance.groups.all_except_defaults() if self.instance.pk else ()), required=False, widget=forms.SelectMultiple(), label=_("Contact Groups"), help_text=_( "The contact groups this contact belongs to. Contact groups are defined in Contacts - Contact Groups " "and are used to configure sales, campaigns, and product pricing tailored for a set of users." ) ) if "account_manager" in self.fields: self.fields["account_manager"].widget = PersonContactChoiceWidget(clearable=True)
[docs] def save(self, commit=True): if not self.instance.pk: self.instance.is_active = True obj = super(ContactBaseFormMixin, self).save(commit) obj.groups = [obj.get_default_group()] + list(self.cleaned_data["groups"]) return obj
[docs]class PersonContactBaseForm(ContactBaseFormMixin, forms.ModelForm): language = LanguageFormField(label=_("Language"), required=False, include_blank=True, help_text=_( "The primary language to be used in all communications with the contact." ))
[docs] class Meta: model = PersonContact fields = list(FIELDS_BY_MODEL_NAME["PersonContact"]) + list(FIELDS_BY_MODEL_NAME["Contact"])
def __init__(self, user=None, *args, **kwargs): self.user = user super(PersonContactBaseForm, self).__init__(*args, **kwargs)
[docs] def init_fields(self): super(PersonContactBaseForm, self).init_fields() for field_name in ("first_name", "last_name"): self.fields[field_name].required = True self.initial["language"] = self.instance.language
[docs] def save(self, commit=True): self.instance.name = self.cleaned_data["first_name"] + " " + self.cleaned_data["last_name"] self.instance.language = self.cleaned_data["language"] obj = super(PersonContactBaseForm, self).save(commit) if self.user and not getattr(obj, "user", None): # Allow binding only once obj.user = self.user obj.save() return obj
[docs]class CompanyContactBaseForm(ContactBaseFormMixin, forms.ModelForm):
[docs] class Meta: model = CompanyContact fields = list(FIELDS_BY_MODEL_NAME["CompanyContact"]) + list(FIELDS_BY_MODEL_NAME["Contact"])
[docs] def init_fields(self): super(CompanyContactBaseForm, self).init_fields() self.fields["name"].help_text = _("The company name.") members_field = Select2MultipleField(model=PersonContact, required=False, help_text=_( "The contacts that are members of this company." )) if self.instance.pk and hasattr(self.instance, "members"): members_field.widget.choices = [ (object.pk, force_text(object)) for object in self.instance.members.all() ] self.fields["members"] = members_field
[docs]class MassEditForm(forms.Form): gender = EnumField(Gender).formfield(default=Gender.UNDISCLOSED, label=_('Gender'), required=False) merchant_notes = forms.CharField(label=_('Merchant Notes'), widget=forms.Textarea, required=False) www = forms.URLField(required=False, label=_("Website URL")) account_manager = forms.ModelChoiceField(PersonContact.objects.all(), label=_("Account Manager"), required=False) tax_number = forms.CharField(label=_("Company: Tax Number"), max_length=32, required=False) members = forms.ModelMultipleChoiceField(Contact.objects.all(), label=_("Company: Members"), required=False) language = LazyTypedChoiceField( choices=[("", _("Select Language"))] + list(countries), label=_('Language'), required=False)
[docs]class GroupMassEditForm(forms.Form): contact_group = forms.ModelMultipleChoiceField( ContactGroup.objects.all(), label=_("Contact Group"), required=False)