From 2de032c2be90b75274c366c031c6cb789826ad5d Mon Sep 17 00:00:00 2001 From: Raphael Michel Date: Fri, 17 Jul 2026 19:22:50 +0200 Subject: [PATCH] Fix test failure on PostgreSQL --- src/pretix/base/services/memberships.py | 3 +++ src/tests/base/test_memberships.py | 2 ++ 2 files changed, 5 insertions(+) diff --git a/src/pretix/base/services/memberships.py b/src/pretix/base/services/memberships.py index fb2efbe71..f6495e351 100644 --- a/src/pretix/base/services/memberships.py +++ b/src/pretix/base/services/memberships.py @@ -24,6 +24,7 @@ from typing import List, Optional from dateutil.relativedelta import relativedelta from django.core.exceptions import ValidationError +from django.db import transaction from django.utils.formats import date_format from django.utils.translation import gettext_lazy as _ @@ -96,6 +97,8 @@ def validate_memberships_in_order(customer: Customer, positions: List[AbstractPo :param valid_from_not_chosen: Set to ``True`` to indicate that the customer is in an early step of the checkout flow where the valid_from date is not selected yet. In this case, the valid_from date is not checked. """ + if lock and not transaction.get_connection().in_atomic_block: + raise Exception('validate_memberships_in_order(lock=True) should only be called in atomic transaction!') tz = event.timezone applicable_positions = [ p for p in positions diff --git a/src/tests/base/test_memberships.py b/src/tests/base/test_memberships.py index 4b6d0fe9c..ffea698d7 100644 --- a/src/tests/base/test_memberships.py +++ b/src/tests/base/test_memberships.py @@ -26,6 +26,7 @@ from zoneinfo import ZoneInfo import pytest from django.conf import settings from django.core.exceptions import ValidationError +from django.db import transaction from django.utils.timezone import now from django_scopes import scope from freezegun import freeze_time @@ -211,6 +212,7 @@ def test_validate_membership_required(event, customer, membership, requiring_tic @pytest.mark.django_db(transaction=True) +@transaction.atomic def test_validate_membership_ensure_locking(event, customer, membership, requiring_ticket, membership_type, django_assert_num_queries): with django_assert_num_queries(4) as captured: validate_memberships_in_order(