From 4f6eb903c7608e055170da3da65e1a77cb33c6b9 Mon Sep 17 00:00:00 2001 From: Raphael Michel Date: Sun, 20 Nov 2016 22:17:23 +0100 Subject: [PATCH] mark_order_paid: Only lock when necessary --- src/pretix/base/models/orders.py | 7 ++++--- src/pretix/base/services/orders.py | 9 ++++++++- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/src/pretix/base/models/orders.py b/src/pretix/base/models/orders.py index 0e3a4cf41..4e514de4f 100644 --- a/src/pretix/base/models/orders.py +++ b/src/pretix/base/models/orders.py @@ -279,12 +279,13 @@ class Order(LoggedModel): if now() > last_date: return error_messages['late'] - if self.status == self.STATUS_PENDING: - return True if not self.event.settings.get('payment_term_accept_late'): return error_messages['late'] - return self._is_still_available() + if self.status == self.STATUS_PENDING: + return True + else: + return self._is_still_available() def _is_still_available(self, now_dt: datetime=None) -> Union[bool, str]: error_messages = { diff --git a/src/pretix/base/services/orders.py b/src/pretix/base/services/orders.py index b1b76124b..daeb9ab36 100644 --- a/src/pretix/base/services/orders.py +++ b/src/pretix/base/services/orders.py @@ -82,7 +82,14 @@ def mark_order_paid(order: Order, provider: str=None, info: str=None, date: date :param user: The user that performed the change :raises Quota.QuotaExceededException: if the quota is exceeded and ``force`` is ``False`` """ - with order.event.lock() as now_dt: + lock_func = order.event.lock + if order.status == order.STATUS_PENDING and order.expires > now() + timedelta(minutes=10): + # No lock necessary in this case. The 10 minute offset is just to be safe and prevent + # collisions with the cronjob. + def lock_func(): + return now() + + with lock_func() as now_dt: can_be_paid = order._can_be_paid() if not force and can_be_paid is not True: raise Quota.QuotaExceededException(can_be_paid)