From c5f4eeeb28b61fd392c713d94ce301d06edbfba8 Mon Sep 17 00:00:00 2001 From: Mira Weller Date: Thu, 4 Apr 2024 14:02:06 +0200 Subject: [PATCH] Distinguish real and time_machine now in Order creation --- src/pretix/base/services/orders.py | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/src/pretix/base/services/orders.py b/src/pretix/base/services/orders.py index a11cdfa09..a52cc541a 100644 --- a/src/pretix/base/services/orders.py +++ b/src/pretix/base/services/orders.py @@ -649,10 +649,11 @@ def _check_date(event: Event, now_dt: datetime): raise OrderError(error_messages['ended']) -def _check_positions(event: Event, now_dt: datetime, positions: List[CartPosition], address: InvoiceAddress=None, +def _check_positions(event: Event, now_dt: datetime, time_machine_now_dt: datetime, positions: List[CartPosition], + address: InvoiceAddress = None, sales_channel='web', customer=None): err = None - _check_date(event, now_dt) + _check_date(event, time_machine_now_dt) products_seen = Counter() q_avail = Counter() @@ -730,7 +731,7 @@ def _check_positions(event: Event, now_dt: datetime, positions: List[CartPositio delete(cp) continue - if cp.subevent and cp.subevent.presale_start and now_dt < cp.subevent.presale_start: + if cp.subevent and cp.subevent.presale_start and time_machine_now_dt < cp.subevent.presale_start: err = err or error_messages['some_subevent_not_started'] delete(cp) break @@ -742,7 +743,7 @@ def _check_positions(event: Event, now_dt: datetime, positions: List[CartPositio tlv.datetime(cp.subevent).date(), time(hour=23, minute=59, second=59) ), event.timezone) - if term_last < now_dt: + if term_last < time_machine_now_dt: err = err or error_messages['some_subevent_ended'] delete(cp) break @@ -788,19 +789,19 @@ def _check_positions(event: Event, now_dt: datetime, positions: List[CartPositio delete(cp) continue - if cp.subevent and cp.item.pk in cp.subevent.item_overrides and not cp.subevent.item_overrides[cp.item.pk].is_available(now_dt): + if cp.subevent and cp.item.pk in cp.subevent.item_overrides and not cp.subevent.item_overrides[cp.item.pk].is_available(time_machine_now_dt): err = err or error_messages['unavailable'] delete(cp) continue if cp.subevent and cp.variation and cp.variation.pk in cp.subevent.var_overrides and \ - not cp.subevent.var_overrides[cp.variation.pk].is_available(now_dt): + not cp.subevent.var_overrides[cp.variation.pk].is_available(time_machine_now_dt): err = err or error_messages['unavailable'] delete(cp) continue if cp.voucher: - if cp.voucher.valid_until and cp.voucher.valid_until < now_dt: + if cp.voucher.valid_until and cp.voucher.valid_until < time_machine_now_dt: err = err or error_messages['voucher_expired'] delete(cp) continue @@ -1164,7 +1165,8 @@ def _perform_order(event: Event, payment_requests: List[dict], position_ids: Lis warnings = [] any_payment_failed = False - now_dt = time_machine_now() + real_now_dt = now() + time_machine_now_dt = time_machine_now(real_now_dt) err_out = None with transaction.atomic(durable=True): positions = list( @@ -1176,14 +1178,15 @@ def _perform_order(event: Event, payment_requests: List[dict], position_ids: Lis if len(position_ids) != len(positions): raise OrderError(error_messages['internal']) try: - _check_positions(event, now_dt, positions, address=addr, sales_channel=sales_channel, customer=customer) + _check_positions(event, real_now_dt, time_machine_now_dt, positions, + address=addr, sales_channel=sales_channel, customer=customer) except OrderError as e: err_out = e # Don't raise directly to make sure transaction is committed, as it might have deleted things else: if 'sleep-after-quota-check' in debugflags_var.get(): sleep(2) - order, payment_objs = _create_order(event, email, positions, now_dt, payment_requests, + order, payment_objs = _create_order(event, email, positions, real_now_dt, payment_requests, locale=locale, address=addr, meta_info=meta_info, sales_channel=sales_channel, shown_total=shown_total, customer=customer, valid_if_pending=valid_if_pending)