From e46e689f01b8926dab57350ff99aa2aeada452da Mon Sep 17 00:00:00 2001 From: Raphael Michel Date: Wed, 28 May 2025 13:23:04 +0200 Subject: [PATCH] Allow to add declaration of accessibility (#5140) * Allow to add declaration of accessibility * add fallback for empty accessibility_title * unify label format (not "Title for") * move title to top and set helptext before text --------- Co-authored-by: Richard Schreiber --- src/pretix/api/serializers/organizer.py | 3 ++ src/pretix/base/settings.py | 32 +++++++++++++++++++ src/pretix/base/validators.py | 1 + src/pretix/control/forms/organizer.py | 3 ++ .../pretixcontrol/organizers/edit.html | 18 +++++++++++ .../templates/pretixpresale/event/base.html | 11 +++++++ .../organizers/accessibility.html | 9 ++++++ .../pretixpresale/organizers/base.html | 11 +++++++ src/pretix/presale/urls.py | 1 + src/pretix/presale/views/organizer.py | 11 +++++++ 10 files changed, 100 insertions(+) create mode 100644 src/pretix/presale/templates/pretixpresale/organizers/accessibility.html diff --git a/src/pretix/api/serializers/organizer.py b/src/pretix/api/serializers/organizer.py index ad262415fd..acff759049 100644 --- a/src/pretix/api/serializers/organizer.py +++ b/src/pretix/api/serializers/organizer.py @@ -426,6 +426,9 @@ class OrganizerSettingsSerializer(SettingsSerializer): 'organizer_logo_image_inherit', 'organizer_logo_image', 'privacy_url', + 'accessibility_url', + 'accessibility_title', + 'accessibility_text', 'cookie_consent', 'cookie_consent_dialog_title', 'cookie_consent_dialog_text', diff --git a/src/pretix/base/settings.py b/src/pretix/base/settings.py index 8caab69c5d..50495abc1e 100644 --- a/src/pretix/base/settings.py +++ b/src/pretix/base/settings.py @@ -2063,6 +2063,38 @@ DEFAULTS = { ), 'serializer_class': I18nURLField, }, + 'accessibility_url': { + 'default': None, + 'type': LazyI18nString, + 'form_class': I18nURLFormField, + 'form_kwargs': dict( + label=_("Accessibility information URL"), + help_text=_("This should point e.g. to a part of your website that explains how your ticket shop complies " + "with accessibility regulation."), + widget=I18nTextInput, + ), + 'serializer_class': I18nURLField, + }, + 'accessibility_title': { + 'default': LazyI18nString.from_gettext(gettext_noop("Accessibility information")), + 'type': LazyI18nString, + 'form_class': I18nFormField, + 'form_kwargs': dict( + label=_("Accessibility information title"), + widget=I18nTextInput, + ), + 'serializer_class': I18nURLField, + }, + 'accessibility_text': { + 'default': None, + 'type': LazyI18nString, + 'form_class': I18nFormField, + 'form_kwargs': dict( + label=_("Accessibility information text"), + widget=I18nMarkdownTextarea, + ), + 'serializer_class': I18nURLField, + }, 'confirm_texts': { 'default': LazyI18nStringList(), 'type': LazyI18nStringList, diff --git a/src/pretix/base/validators.py b/src/pretix/base/validators.py index 254e6778a0..3b2a635312 100644 --- a/src/pretix/base/validators.py +++ b/src/pretix/base/validators.py @@ -73,6 +73,7 @@ class EventSlugBanlistValidator(BanlistValidator): 'customer', 'account', 'lead', + 'accessibility', ] diff --git a/src/pretix/control/forms/organizer.py b/src/pretix/control/forms/organizer.py index 8978eb20ef..688f66629b 100644 --- a/src/pretix/control/forms/organizer.py +++ b/src/pretix/control/forms/organizer.py @@ -498,6 +498,9 @@ class OrganizerSettingsForm(SettingsForm): 'theme_round_borders', 'primary_font', 'privacy_url', + 'accessibility_url', + 'accessibility_title', + 'accessibility_text', 'cookie_consent', 'cookie_consent_dialog_title', 'cookie_consent_dialog_text', diff --git a/src/pretix/control/templates/pretixcontrol/organizers/edit.html b/src/pretix/control/templates/pretixcontrol/organizers/edit.html index f9d000a1f2..acc04a27de 100644 --- a/src/pretix/control/templates/pretixcontrol/organizers/edit.html +++ b/src/pretix/control/templates/pretixcontrol/organizers/edit.html @@ -200,6 +200,24 @@ {% bootstrap_field sform.cookie_consent_dialog_button_yes layout="control" %} {% bootstrap_field sform.cookie_consent_dialog_button_no layout="control" %} +
+ {% trans "Accessibility" %} + + {% bootstrap_field sform.accessibility_title layout="control" %} + {% bootstrap_field sform.accessibility_url layout="control" %} +
+
+

{% trans "Instead of an URL, you can also configure a text that will be shown within pretix. This will be ignored if a URL is configured." %}

+
+
+ {% bootstrap_field sform.accessibility_text layout="control" %} +
{% trans "Reusable media" %} {% bootstrap_field sform.reusable_media_active layout="control" %} diff --git a/src/pretix/presale/templates/pretixpresale/event/base.html b/src/pretix/presale/templates/pretixpresale/event/base.html index 3d39d2217f..8cc81165bb 100644 --- a/src/pretix/presale/templates/pretixpresale/event/base.html +++ b/src/pretix/presale/templates/pretixpresale/event/base.html @@ -224,6 +224,17 @@ {% if request.event.settings.privacy_url %}
  • {% trans "Privacy policy" %}
  • {% endif %} + {% if request.event.settings.accessibility_url %} + {% trans "Accessibility information" as accessibility_title %} +
  • + {{ request.event.settings.accessibility_title|default:accessibility_title }} +
  • + {% elif request.event.settings.accessibility_text %} + {% trans "Accessibility information" as accessibility_title %} +
  • + {{ request.event.settings.accessibility_title|default:accessibility_title }} +
  • + {% endif %} {% if request.event.settings.cookie_consent and cookie_providers %}
  • {% endif %} diff --git a/src/pretix/presale/templates/pretixpresale/organizers/accessibility.html b/src/pretix/presale/templates/pretixpresale/organizers/accessibility.html new file mode 100644 index 0000000000..ab8c9f8c55 --- /dev/null +++ b/src/pretix/presale/templates/pretixpresale/organizers/accessibility.html @@ -0,0 +1,9 @@ +{% extends "pretixpresale/organizers/base.html" %} +{% load i18n %} +{% load rich_text %} +{% block title %}{{ request.organizer.settings.accessibility_title }}{% endblock %} +{% block content %} + {% trans "Accessibility information" as accessibility_title %} +

    {{ request.organizer.settings.accessibility_title|default:accessibility_title }}

    + {{ request.organizer.settings.accessibility_text|rich_text }} +{% endblock %} diff --git a/src/pretix/presale/templates/pretixpresale/organizers/base.html b/src/pretix/presale/templates/pretixpresale/organizers/base.html index 8d75455784..88798b85fe 100644 --- a/src/pretix/presale/templates/pretixpresale/organizers/base.html +++ b/src/pretix/presale/templates/pretixpresale/organizers/base.html @@ -102,6 +102,17 @@ {% if not request.event and request.organizer.settings.privacy_url %}
  • {% trans "Privacy policy" %}
  • {% endif %} + {% if request.organizer.settings.accessibility_url %} + {% trans "Accessibility information" as accessibility_title %} +
  • + {{ request.organizer.settings.accessibility_title|default:accessibility_title }} +
  • + {% elif request.organizer.settings.accessibility_text %} + {% trans "Accessibility information" as accessibility_title %} +
  • + {{ request.organizer.settings.accessibility_title|default:accessibility_title }} +
  • + {% endif %} {% if not request.event and request.organizer.settings.cookie_consent and cookie_providers %}
  • {% endif %} diff --git a/src/pretix/presale/urls.py b/src/pretix/presale/urls.py index e47f5a84e9..2289c41661 100644 --- a/src/pretix/presale/urls.py +++ b/src/pretix/presale/urls.py @@ -199,6 +199,7 @@ organizer_patterns = [ re_path(r'^widget/v1.css$', pretix.presale.views.widget.widget_css, name='organizer.widget.css'), re_path(r'^theme.css$', pretix.presale.views.theme.theme_css, name='organizer.theme.css'), + re_path(r'^accessibility$', pretix.presale.views.organizer.AccessibilityView.as_view(), name='organizer.accessibility'), re_path(r'^account/login/(?P[0-9]+)/$', pretix.presale.views.customer.SSOLoginView.as_view(), name='organizer.customer.login'), re_path(r'^account/login/(?P[0-9]+)/return$', pretix.presale.views.customer.SSOLoginReturnView.as_view(), name='organizer.customer.login.return'), diff --git a/src/pretix/presale/views/organizer.py b/src/pretix/presale/views/organizer.py index 454d45e646..480480fda2 100644 --- a/src/pretix/presale/views/organizer.py +++ b/src/pretix/presale/views/organizer.py @@ -1311,3 +1311,14 @@ class OrganizerFavicon(View): class RedirectToOrganizerIndex(View): def get(self, *args, **kwargs): return redirect_to_url(build_absolute_uri(self.request.organizer, "presale:organizer.index")) + + +class AccessibilityView(OrganizerViewMixin, EventListMixin, TemplateView): + template_name = 'pretixpresale/organizers/accessibility.html' + + def dispatch(self, request, *args, **kwargs): + if self.request.organizer.settings.accessibility_url: + raise Http404() + if not self.request.organizer.settings.accessibility_text: + raise Http404() + return super().dispatch(request, *args, **kwargs)