Source code for shuup.gdpr.admin_module.forms

from django import forms
from django.conf import settings
from django.forms import BaseModelFormSet
from django.forms.formsets import DEFAULT_MAX_NUM, DEFAULT_MIN_NUM

from shuup.admin.form_part import FormPart, TemplatedFormDef
from shuup.admin.forms.widgets import QuickAddRelatedObjectMultiSelect, QuickAddRelatedObjectSelect, TextEditorWidget
from shuup.admin.shop_provider import get_shop
from shuup.gdpr.models import GDPRCookieCategory, GDPRSettings
from shuup.gdpr.utils import get_possible_consent_pages
from shuup.utils.django_compat import reverse_lazy
from shuup.utils.multilanguage_model_form import MultiLanguageModelForm, to_language_codes


[docs] class QuickAddPageSelect(QuickAddRelatedObjectSelect): url = reverse_lazy("shuup_admin:simple_cms.page.new")
[docs] class QuickAddPageMultiSelect(QuickAddRelatedObjectMultiSelect): url = reverse_lazy("shuup_admin:simple_cms.page.new")
[docs] class GDPRSettingsForm(MultiLanguageModelForm):
[docs] class Meta: exclude = ("shop",) model = GDPRSettings widgets = { "auth_consent_text": TextEditorWidget(), "cookie_banner_content": TextEditorWidget(), "cookie_privacy_excerpt": TextEditorWidget(), "privacy_policy_page": QuickAddPageSelect(editable_model="shuup_simple_cms.Page"), "consent_pages": QuickAddPageMultiSelect(), }
[docs] def __init__(self, **kwargs): self.request = kwargs.pop("request") super().__init__(**kwargs) shop = get_shop(self.request) choices = [(p.id, p.safe_translation_getter("title")) for p in get_possible_consent_pages(shop)] self.fields["privacy_policy_page"].choices = choices self.fields["consent_pages"].required = False self.fields["consent_pages"].choices = choices
[docs] class GDPRCookieCategoryForm(MultiLanguageModelForm):
[docs] class Meta: exclude = ("shop",) model = GDPRCookieCategory widgets = {"cookies": forms.TextInput()}
[docs] class GDPRBaseFormPart(FormPart): priority = -1000
[docs] def get_form_defs(self): yield TemplatedFormDef( "base", GDPRSettingsForm, template_name="shuup/admin/gdpr/edit_base_form_part.jinja", required=True, kwargs={ "instance": self.object, "languages": settings.LANGUAGES, "request": self.request, }, )
[docs] def form_valid(self, form): self.object = form["base"].save()
[docs] class GDPRCookieCategoryFormSet(BaseModelFormSet): form_class = GDPRCookieCategoryForm validate_min = False can_delete = True can_order = False validate_max = False min_num = DEFAULT_MIN_NUM max_num = DEFAULT_MAX_NUM absolute_max = DEFAULT_MAX_NUM model = GDPRCookieCategory extra = 1
[docs] def __init__(self, *args, **kwargs): self.shop = kwargs.pop("shop") self.default_language = kwargs.pop("default_language", settings.PARLER_DEFAULT_LANGUAGE_CODE) self.languages = to_language_codes(kwargs.pop("languages", ()), self.default_language) kwargs.pop("empty_permitted", None) # this is unknown to formset super().__init__(*args, **kwargs)
[docs] def get_queryset(self): return GDPRCookieCategory.objects.filter(shop=self.shop)
[docs] def form(self, **kwargs): kwargs.setdefault("languages", self.languages) return self.form_class(**kwargs)
@property def can_delete_extra(self): return self.can_delete @property def empty_form(self): form = self._construct_form(None) form.empty_permitted = True return form
[docs] def save(self, commit=True): forms = self.forms or [] for form in forms: form.instance.shop = self.shop super().save(commit)
[docs] class GDPRCookieCategoryFormPart(FormPart): name = "cookie_categories" formset = GDPRCookieCategoryFormSet
[docs] def get_form_defs(self): yield TemplatedFormDef( self.name, self.formset, template_name="shuup/admin/gdpr/edit_cookie_category_form_part.jinja", required=False, kwargs={ "shop": self.object.shop, "languages": settings.LANGUAGES, }, )
[docs] def form_valid(self, form): if self.name in form.forms: form.forms[self.name].save()