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

# -*- coding: utf-8 -*-
# This file is part of Shuup.
#
# Copyright (c) 2012-2021, Shuup Commerce Inc. 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.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 (
    FileDnDUploaderWidget,
    PersonContactChoiceWidget,
    QuickAddContactGroupMultiSelect,
    QuickAddTaxGroupSelect,
)
from shuup.admin.shop_provider import get_shop
from shuup.core.fields import LanguageFormField
from shuup.core.models import CompanyContact, Contact, ContactGroup, Gender, PersonContact, Shop
from shuup.utils.django_compat import force_text

FIELDS_BY_MODEL_NAME = {
    "Contact": (
        "is_active",
        "marketing_permission",
        "phone",
        "www",
        "timezone",
        "prefix",
        "suffix",
        "name_ext",
        "email",
        "tax_group",
        "merchant_notes",
        "account_manager",
        "picture",
    ),
    "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=QuickAddContactGroupMultiSelect(attrs={"data-model": "shuup.ContactGroup"}), 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) if "picture" in self.fields: self.fields["picture"].widget = FileDnDUploaderWidget( upload_path="/contacts", kind="images", clearable=True ) if not self.request or (self.request and self.request.user.is_superuser): shops_qs = Shop.objects.all() else: shops_qs = Shop.objects.filter(staff_members__in=[self.request.user]) if "tax_group" in self.fields: self.fields["tax_group"].widget = QuickAddTaxGroupSelect(editable_model="shuup.CustomerTaxGroup") if self.instance and self.instance.tax_group: self.fields["tax_group"].widget.choices = [(self.instance.tax_group.id, self.instance.tax_group.name)] self.fields["shops"] = forms.ModelMultipleChoiceField( queryset=shops_qs, initial=(self.instance.shops.all() if self.instance.pk else ()), required=False, widget=forms.SelectMultiple(), label=_("Shops"), help_text=_("The shops this contact belongs to"), )
[docs] def save(self, commit=True): if not self.instance.pk: self.instance.is_active = True obj = super(ContactBaseFormMixin, self).save(commit) shop = get_shop(self.request) obj.groups.set([obj.get_default_group()] + list(self.cleaned_data["groups"])) obj.add_to_shops(shop, list(self.cleaned_data["shops"])) 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 self.request = kwargs.pop("request", None) 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"])
def __init__(self, *args, **kwargs): self.request = kwargs.pop("request", None) super(CompanyContactBaseForm, self).__init__(*args, **kwargs)
[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)