Compare commits

..
Author SHA1 Message Date
Richard Schreiber fac9483170 [A11y] Improve filterform focus management 2026-10-09 17:19:44 +02:00
18 changed files with 47 additions and 44 deletions

No files matched your search

+1 -1
View File
@@ -1,6 +1,6 @@
sphinx==9.1.*
sphinx-rtd-theme~=3.1.0
sphinxcontrib-httpdomain~=2.1.0
sphinxcontrib-httpdomain~=2.0.0
sphinxcontrib-images~=1.0.1
sphinxcontrib-jquery~=4.1
sphinxcontrib-spelling~=8.0.2
+1 -1
View File
@@ -1,7 +1,7 @@
-e ../
sphinx==9.1.*
sphinx-rtd-theme~=3.1.0
sphinxcontrib-httpdomain~=2.1.0
sphinxcontrib-httpdomain~=2.0.0
sphinxcontrib-images~=1.0.1
sphinxcontrib-jquery~=4.1
sphinxcontrib-spelling~=8.0.2
+3 -3
View File
@@ -34,7 +34,7 @@ dependencies = [
"celery==5.6.*",
"chardet==5.2.*",
"cryptography>=50.0.2",
"css-inline==0.22.*",
"css-inline==0.21.*",
"defusedcsv>=3.0.0",
"dnspython==2.*",
"Django[argon2]==5.2.*,>=5.2.17",
@@ -83,7 +83,7 @@ dependencies = [
"psycopg2-binary",
"pycountry",
"pycparser==3.0",
"pycryptodome==3.24.*",
"pycryptodome==3.23.*",
"pypdf==6.19.*",
"python-bidi==0.6.*", # Support for Arabic in reportlab
"python-dateutil==2.9.*",
@@ -112,7 +112,7 @@ dev = [
"aiohttp==3.14.*",
"coverage",
"coveralls",
"fakeredis==2.39.*",
"fakeredis==2.38.*",
"flake8==7.4.*",
"freezegun",
"isort==9.0.*",
+1 -3
View File
@@ -261,9 +261,7 @@ class ItemAddOnSerializer(serializers.ModelSerializer):
def validate(self, data):
data = super().validate(data)
full_data = self.to_internal_value(self.to_representation(self.instance)) if self.instance else {}
full_data.update(data)
ItemAddOn.clean_max_min_count(full_data.get('max_count'), full_data.get('min_count'))
ItemAddOn.clean_max_min_count(data.get('max_count'), data.get('min_count'))
return data
-1
View File
@@ -316,7 +316,6 @@ def mail(email: Union[str, Sequence[str]], subject: Union[str, FormattedString],
body_html = None
m = OutgoingMail.objects.create(
guid=guid,
organizer=organizer,
event=event,
order=order,
+1 -2
View File
@@ -359,8 +359,7 @@ def mark_order_refunded(order, user=None, auth=None, api_token=None):
def mark_order_expired(order, user=None, auth=None):
"""
Mark this order as expired. This sets the order status, generates an invoice cancellation
and returns the order object.
Mark this order as expired. This sets the payment status and returns the order object.
:param order: The order to change
:param user: The user that performed the change
"""
-5
View File
@@ -752,11 +752,6 @@ def base_placeholders(sender, **kwargs):
lambda position_or_address: concatenation_for_salutation(get_best_name(position_or_address, parts=True)),
lambda event: concatenation_for_salutation(name_scheme['sample']),
))
ph.append(SimpleFunctionalTextPlaceholder(
"attendee_name_for_salutation", ["position"],
lambda position: concatenation_for_salutation(position.attendee_name_parts),
lambda event: concatenation_for_salutation(name_scheme['sample']),
))
for f, l, w in name_scheme['fields']:
if f == 'full_name':
+1 -1
View File
@@ -342,7 +342,7 @@ def nav_context_list(request):
max_to=Max('subevents__date_to'),
max_fromto=Greatest(Max('subevents__date_to'), Max('subevents__date_from'))
).annotate(
order_from=Coalesce('max_from', 'date_from'),
order_from=Coalesce('min_from', 'date_from'),
).order_by('-order_from', 'slug')
if request.user.has_active_staff_session(request.session.session_key):
+10 -9
View File
@@ -138,7 +138,7 @@ logger = logging.getLogger('pretix.plugins.stripe')
# - BLIK: ✗
# - Pay By Bank: ✓
# - TWINT: ✓
# - Wero: ✓
# - Wero: ✓ (No settings UI yet)
# - giropay: ✗ (deprecated)
# - Sofort: ✗ (deprecated)
#
@@ -529,14 +529,15 @@ class StripeSettingsHolder(BasePaymentProvider):
'before they work properly.'),
required=False,
)),
('method_wero',
forms.BooleanField(
label=_('Wero'),
disabled=self.event.currency not in 'EUR',
help_text=_('Some payment methods might need to be enabled in the settings of your Stripe account '
'before they work properly.'),
required=False,
)),
# Disabled for now, since still in closed Beta and only available to dedicated boarded accounts.
# ('method_wero',
# forms.BooleanField(
# label=_('Wero'),
# disabled=self.event.currency not in 'EUR',
# help_text=_('Some payment methods might need to be enabled in the settings of your Stripe account '
# 'before they work properly.'),
# required=False,
# )),
] + extra_fields + list(super().settings_form_fields.items()) + moto_settings
)
if not self.settings.connect_client_id or self.settings.secret_key:
@@ -108,7 +108,7 @@
{% include "pretixpresale/fragment_event_list_filter.html" with request=request %}
</div>
{% endif %}
<div class="panel-body">
<div class="panel-body" id="events-filter-result">
{% cache_large 15 subevent_list subevent_list_cache_key %}
{% if subevent_list.list_type == "calendar" %}
{% include "pretixpresale/event/fragment_subevent_calendar.html" %}
@@ -5,7 +5,7 @@
{% load getitem %}
{% if filter_form.fields %}
<form class="event-list-filter-form" method="get" data-save-scrollpos>
<form class="event-list-filter-form" method="get" data-save-scrollpos data-focus-after-submit="events-filter-result">
<input type="hidden" name="filtered" value="1">
{% for f, v in request_get_items %}
{% if f not in filter_form.fields and f != "page" %}
@@ -33,7 +33,7 @@
{% include "pretixpresale/fragment_event_list_filter.html" with request=request %}
</div>
{% endif %}
<div class="panel-body">
<div class="panel-body" id="events-filter-result">
<nav aria-label="{% trans "calendar navigation" %}">
<ul class="row calendar-nav">
<li class="text-left flip">
@@ -33,7 +33,7 @@
{% include "pretixpresale/fragment_event_list_filter.html" with request=request %}
</div>
{% endif %}
<div class="panel-body">
<div class="panel-body" id="events-filter-result">
<nav aria-label="{% trans "calendar navigation" %}">
<ul class="row calendar-nav">
<li class="text-left flip">
@@ -33,7 +33,7 @@
{% include "pretixpresale/fragment_event_list_filter.html" with request=request %}
</div>
{% endif %}
<div class="panel-body">
<div class="panel-body" id="events-filter-result">
<nav aria-label="{% trans "calendar navigation" %}">
<ul class="row calendar-nav">
<li class="text-left flip">
@@ -45,7 +45,7 @@
</div>
{% endif %}
{% if events %}
<div class="panel-body">
<div class="panel-body" id="events-filter-result">
<div class="event-list full-width-list alternating-rows">
{% for e in events %}{% eventurl e "presale:event.index" as url %}
<article class="row" aria-labelledby="event-{{ e.pk }}-label" aria-describedby="event-{{ e.pk }}-desc">
-4
View File
@@ -247,10 +247,6 @@ class EventIndex(EventViewMixin, EventListMixin, CartMixin, TemplateView):
context['has_addon_choices'] = any(cp.has_addon_choices for cp in get_cart(self.request))
templating_context = PlaceholderContext(event_or_subevent=self.subevent or self.request.event, event=self.request.event)
for field in ('presale_has_ended_text',):
context[field] = templating_context.format(str(self.request.event.settings[field]))
if self.subevent:
context['frontpage_text'] = templating_context.format(str(self.subevent.frontpage_text))
else:
@@ -135,6 +135,29 @@ let form_handlers = function (el) {
}
wait();
});
// usually a hash in the action-url of a form is enough to make the browser jump to the focus-point
// filter-form on subevents needs to be a bit more clever as we only want the list/calendar to be focused
// when the form was actually submitted, not when an URL-with-hash is shared/loaded without form-submit
el.find("form[data-focus-after-submit]").each(function (i, form) {
$(form).on("submit", function (e) {
var currentElement = document.activeElement;
if (currentElement && !$(currentElement).is(':submit')) {
window.sessionStorage.setItem("autofocus", currentElement.id);
} else {
window.sessionStorage.setItem("autofocus", form.getAttribute("data-focus-after-submit"));
}
});
});
if (window.sessionStorage.getItem("autofocus")) {
var afElement = document.getElementById(window.sessionStorage.getItem("autofocus"));
if (afElement) {
afElement.tabIndex = 0;
afElement.focus();
}
window.sessionStorage.removeItem("autofocus");
}
el.find('.input-item-count-dec, .input-item-count-inc').on('click', function (e) {
e.preventDefault()
let step = parseFloat(this.getAttribute('data-step'))
-8
View File
@@ -1925,14 +1925,6 @@ def test_addons_create(token_client, organizer, event, item, category, category2
@pytest.mark.django_db
def test_addons_update(token_client, organizer, event, item, addon):
resp = token_client.patch(
'/api/v1/organizers/{}/events/{}/items/{}/addons/{}/'.format(organizer.slug, event.slug, item.pk, addon.pk),
{
},
format='json'
)
assert resp.status_code == 200
resp = token_client.patch(
'/api/v1/organizers/{}/events/{}/items/{}/addons/{}/'.format(organizer.slug, event.slug, item.pk, addon.pk),
{