diff --git a/src/pretix/api/serializers/i18n.py b/src/pretix/api/serializers/i18n.py index fcd1369d3d..80a94c016b 100644 --- a/src/pretix/api/serializers/i18n.py +++ b/src/pretix/api/serializers/i18n.py @@ -20,6 +20,7 @@ # . # from django.conf import settings +from django.core.validators import URLValidator from i18nfield.fields import I18nCharField, I18nTextField from i18nfield.strings import LazyI18nString from rest_framework.exceptions import ValidationError @@ -69,3 +70,17 @@ class I18nAwareModelSerializer(ModelSerializer): I18nAwareModelSerializer.serializer_field_mapping[I18nCharField] = I18nField I18nAwareModelSerializer.serializer_field_mapping[I18nTextField] = I18nField + + +class I18nURLField(I18nField): + def to_internal_value(self, value): + value = super().to_internal_value(value) + if not value: + return value + if isinstance(value.data, dict): + for v in value.data.values(): + if v: + URLValidator()(v) + else: + URLValidator()(value.data) + return value diff --git a/src/pretix/base/forms/__init__.py b/src/pretix/base/forms/__init__.py index c8973c1187..9e926aa8fd 100644 --- a/src/pretix/base/forms/__init__.py +++ b/src/pretix/base/forms/__init__.py @@ -36,11 +36,13 @@ import logging import i18nfield.forms from django import forms +from django.core.validators import URLValidator from django.forms.models import ModelFormMetaclass from django.utils.crypto import get_random_string from django.utils.translation import gettext_lazy as _ from formtools.wizard.views import SessionWizardView from hierarkey.forms import HierarkeyForm +from i18nfield.strings import LazyI18nString from pretix.base.reldate import RelativeDateField, RelativeDateTimeField @@ -222,3 +224,17 @@ class SecretKeySettingsField(forms.CharField): if value == SECRET_REDACTED: return return super().run_validators(value) + + +class I18nURLFormField(i18nfield.forms.I18nFormField): + def clean(self, value) -> LazyI18nString: + value = super().clean(value) + if not value: + return value + if isinstance(value.data, dict): + for v in value.data.values(): + if v: + URLValidator()(v) + else: + URLValidator()(value.data) + return value diff --git a/src/pretix/base/settings.py b/src/pretix/base/settings.py index 9a38a98926..c01c12cefe 100644 --- a/src/pretix/base/settings.py +++ b/src/pretix/base/settings.py @@ -63,7 +63,8 @@ from rest_framework import serializers from pretix.api.serializers.fields import ( ListMultipleChoiceField, UploadedFileField, ) -from pretix.api.serializers.i18n import I18nField +from pretix.api.serializers.i18n import I18nField, I18nURLField +from pretix.base.forms import I18nURLFormField from pretix.base.models.tax import VAT_ID_COUNTRIES, TaxRule from pretix.base.reldate import ( RelativeDateField, RelativeDateTimeField, RelativeDateWrapper, @@ -1689,14 +1690,15 @@ DEFAULTS = { }, 'privacy_url': { 'default': None, - 'type': str, - 'form_class': forms.URLField, + 'type': LazyI18nString, + 'form_class': I18nURLFormField, 'form_kwargs': dict( label=_("Privacy Policy URL"), help_text=_("This should point e.g. to a part of your website that explains how you use data gathered in " "your ticket shop."), + widget=I18nTextInput, ), - 'serializer_class': serializers.URLField, + 'serializer_class': I18nURLField, }, 'confirm_texts': { 'default': LazyI18nStringList(),