mirror of
https://github.com/pretix/pretix.git
synced 2026-05-03 14:54:04 +00:00
Memberships: Check valid_from/valid_until for parallel usage (#3975)
This commit is contained in:
@@ -215,6 +215,7 @@ def test_validate_membership_ensure_locking(event, customer, membership, requiri
|
||||
customer,
|
||||
[
|
||||
CartPosition(
|
||||
event=event,
|
||||
item=requiring_ticket,
|
||||
used_membership=membership,
|
||||
)
|
||||
@@ -449,6 +450,7 @@ def test_validate_membership_parallel(event, customer, membership, subevent, req
|
||||
customer,
|
||||
[
|
||||
CartPosition(
|
||||
event=event,
|
||||
item=requiring_ticket,
|
||||
used_membership=membership,
|
||||
subevent=subevent
|
||||
@@ -464,6 +466,7 @@ def test_validate_membership_parallel(event, customer, membership, subevent, req
|
||||
customer,
|
||||
[
|
||||
CartPosition(
|
||||
event=event,
|
||||
item=requiring_ticket,
|
||||
used_membership=membership,
|
||||
subevent=se2
|
||||
@@ -479,11 +482,13 @@ def test_validate_membership_parallel(event, customer, membership, subevent, req
|
||||
customer,
|
||||
[
|
||||
CartPosition(
|
||||
event=event,
|
||||
item=requiring_ticket,
|
||||
used_membership=membership,
|
||||
subevent=se2
|
||||
),
|
||||
CartPosition(
|
||||
event=event,
|
||||
item=requiring_ticket,
|
||||
used_membership=membership,
|
||||
subevent=se2
|
||||
@@ -501,6 +506,7 @@ def test_validate_membership_parallel(event, customer, membership, subevent, req
|
||||
customer,
|
||||
[
|
||||
CartPosition(
|
||||
event=event,
|
||||
item=requiring_ticket,
|
||||
used_membership=membership,
|
||||
subevent=subevent
|
||||
@@ -512,6 +518,205 @@ def test_validate_membership_parallel(event, customer, membership, subevent, req
|
||||
)
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_validate_membership_parallel_validity_dynamic(event, customer, membership, requiring_ticket, membership_type):
|
||||
requiring_ticket.validity_mode = Item.VALIDITY_MODE_DYNAMIC
|
||||
requiring_ticket.validity_dynamic_start_choice = False
|
||||
requiring_ticket.validity_dynamic_duration_days = 1
|
||||
requiring_ticket.save()
|
||||
|
||||
membership_type.allow_parallel_usage = False
|
||||
membership_type.save()
|
||||
|
||||
o1 = Order.objects.create(
|
||||
status=Order.STATUS_PENDING,
|
||||
event=event,
|
||||
email='admin@localhost',
|
||||
datetime=now() - timedelta(days=3),
|
||||
expires=now() + timedelta(days=11),
|
||||
total=Decimal("23"),
|
||||
)
|
||||
OrderPosition.objects.create(
|
||||
order=o1,
|
||||
item=requiring_ticket,
|
||||
used_membership=membership,
|
||||
variation=None,
|
||||
price=Decimal("23"),
|
||||
attendee_name_parts={'full_name': "Peter"},
|
||||
valid_from=now(),
|
||||
valid_until=now().replace(hour=23, minute=59, second=59),
|
||||
)
|
||||
|
||||
with pytest.raises(ValidationError) as excinfo:
|
||||
validate_memberships_in_order(
|
||||
customer,
|
||||
[
|
||||
CartPosition(
|
||||
event=event,
|
||||
item=requiring_ticket,
|
||||
used_membership=membership,
|
||||
)
|
||||
],
|
||||
event,
|
||||
lock=False,
|
||||
ignored_order=None
|
||||
)
|
||||
assert "different ticket that overlaps" in str(excinfo.value)
|
||||
|
||||
requiring_ticket.validity_dynamic_start_choice = True
|
||||
requiring_ticket.save()
|
||||
validate_memberships_in_order(
|
||||
customer,
|
||||
[
|
||||
CartPosition(
|
||||
event=event,
|
||||
item=requiring_ticket,
|
||||
used_membership=membership,
|
||||
)
|
||||
],
|
||||
event,
|
||||
lock=False,
|
||||
ignored_order=None,
|
||||
valid_from_not_chosen=True
|
||||
)
|
||||
|
||||
with pytest.raises(ValidationError) as excinfo:
|
||||
validate_memberships_in_order(
|
||||
customer,
|
||||
[
|
||||
CartPosition(
|
||||
event=event,
|
||||
item=requiring_ticket,
|
||||
used_membership=membership,
|
||||
)
|
||||
],
|
||||
event,
|
||||
lock=False,
|
||||
ignored_order=None,
|
||||
valid_from_not_chosen=False
|
||||
)
|
||||
assert "different ticket that overlaps" in str(excinfo.value)
|
||||
|
||||
validate_memberships_in_order(
|
||||
customer,
|
||||
[
|
||||
CartPosition(
|
||||
event=event,
|
||||
item=requiring_ticket,
|
||||
used_membership=membership,
|
||||
requested_valid_from=now() + timedelta(days=1)
|
||||
)
|
||||
],
|
||||
event,
|
||||
lock=False,
|
||||
ignored_order=None,
|
||||
)
|
||||
|
||||
membership_type.allow_parallel_usage = True
|
||||
membership_type.save()
|
||||
validate_memberships_in_order(
|
||||
customer,
|
||||
[
|
||||
CartPosition(
|
||||
event=event,
|
||||
item=requiring_ticket,
|
||||
used_membership=membership,
|
||||
)
|
||||
],
|
||||
event,
|
||||
lock=False,
|
||||
ignored_order=None
|
||||
)
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_validate_membership_parallel_validity_fixed(event, customer, membership, requiring_ticket, membership_type):
|
||||
requiring_ticket.validity_mode = Item.VALIDITY_MODE_FIXED
|
||||
requiring_ticket.validity_fixed_from = now().replace(hour=2, minute=20, second=0)
|
||||
requiring_ticket.validity_fixed_until = now().replace(hour=6, minute=20, second=0)
|
||||
requiring_ticket.save()
|
||||
|
||||
membership_type.allow_parallel_usage = False
|
||||
membership_type.save()
|
||||
|
||||
o1 = Order.objects.create(
|
||||
status=Order.STATUS_PENDING,
|
||||
event=event,
|
||||
email='admin@localhost',
|
||||
datetime=now() - timedelta(days=3),
|
||||
expires=now() + timedelta(days=11),
|
||||
total=Decimal("23"),
|
||||
)
|
||||
OrderPosition.objects.create(
|
||||
order=o1,
|
||||
item=requiring_ticket,
|
||||
used_membership=membership,
|
||||
variation=None,
|
||||
price=Decimal("23"),
|
||||
attendee_name_parts={'full_name': "Peter"},
|
||||
valid_from=now().replace(hour=2, minute=20, second=0),
|
||||
valid_until=now().replace(hour=6, minute=20, second=0),
|
||||
)
|
||||
|
||||
requiring_ticket.validity_fixed_from = now().replace(hour=5, minute=20, second=0)
|
||||
requiring_ticket.validity_fixed_until = now().replace(hour=8, minute=20, second=0)
|
||||
requiring_ticket.save()
|
||||
|
||||
with pytest.raises(ValidationError) as excinfo:
|
||||
validate_memberships_in_order(
|
||||
customer,
|
||||
[
|
||||
CartPosition(
|
||||
event=event,
|
||||
item=requiring_ticket,
|
||||
used_membership=membership,
|
||||
)
|
||||
],
|
||||
event,
|
||||
lock=False,
|
||||
ignored_order=None
|
||||
)
|
||||
assert "different ticket that overlaps" in str(excinfo.value)
|
||||
|
||||
requiring_ticket.validity_fixed_from = now().replace(hour=6, minute=20, second=1)
|
||||
requiring_ticket.validity_fixed_until = now().replace(hour=8, minute=20, second=0)
|
||||
requiring_ticket.save()
|
||||
|
||||
validate_memberships_in_order(
|
||||
customer,
|
||||
[
|
||||
CartPosition(
|
||||
event=event,
|
||||
item=requiring_ticket,
|
||||
used_membership=membership,
|
||||
)
|
||||
],
|
||||
event,
|
||||
lock=False,
|
||||
ignored_order=None,
|
||||
valid_from_not_chosen=True
|
||||
)
|
||||
|
||||
requiring_ticket.validity_fixed_from = now().replace(hour=0, minute=20, second=0)
|
||||
requiring_ticket.validity_fixed_until = now().replace(hour=1, minute=20, second=0)
|
||||
requiring_ticket.save()
|
||||
|
||||
validate_memberships_in_order(
|
||||
customer,
|
||||
[
|
||||
CartPosition(
|
||||
event=event,
|
||||
item=requiring_ticket,
|
||||
used_membership=membership,
|
||||
)
|
||||
],
|
||||
event,
|
||||
lock=False,
|
||||
ignored_order=None,
|
||||
valid_from_not_chosen=True
|
||||
)
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_use_membership(event, customer, membership, requiring_ticket):
|
||||
cp1 = CartPosition.objects.create(
|
||||
|
||||
Reference in New Issue
Block a user