diff --git a/src/pretix/base/timemachine.py b/src/pretix/base/timemachine.py index 2ff819257e..8927a8b682 100644 --- a/src/pretix/base/timemachine.py +++ b/src/pretix/base/timemachine.py @@ -26,43 +26,39 @@ from contextlib import contextmanager from dateutil.parser import parse from django.utils.timezone import now +tls = threading.local() -class TimeMachineMiddleware: - tls = threading.local() - def __init__(self, get_response=None): - self.get_response = get_response - super().__init__() +@contextmanager +def time_machine_now_assigned_from_request(request): + print("time_machine_now_assigned_from_request") + if hasattr(request, 'event') and 'timemachine_now_dt' in request.session and \ + request.event.testmode and request.user.is_authenticated and \ + request.user.has_event_permission(request.organizer, request.event, 'can_change_event_settings', request): + request.now_dt = parse(request.session['timemachine_now_dt']) + request.now_dt_is_fake = True + else: + request.now_dt = now() + request.now_dt_is_fake = False - def __call__(self, request): - if hasattr(request, 'event') and hasattr(request, '_namespace') and hasattr(request, '_event_detected') and \ - 'timemachine_now_dt' in request.session and \ - request.event.testmode and request.user.is_authenticated and \ - request.user.has_event_permission(request.organizer, request.event, 'can_change_event_settings', request): - request.now_dt = parse(request.session['timemachine_now_dt']) - request.now_dt_is_fake = True - else: - request.now_dt = now() - request.now_dt_is_fake = False + try: + tls.now_dt = request.now_dt if request.now_dt_is_fake else None - try: - TimeMachineMiddleware.tls.now_dt = request.now_dt if request.now_dt_is_fake else None - - return self.get_response(request) - finally: - TimeMachineMiddleware.tls.now_dt = None + yield + finally: + tls.now_dt = None def time_machine_now(default=False): if default is False: default = now() - return getattr(TimeMachineMiddleware.tls, 'now_dt', None) or default + return getattr(tls, 'now_dt', None) or default @contextmanager def time_machine_now_assigned(now_dt): try: - TimeMachineMiddleware.tls.now_dt = now_dt + tls.now_dt = now_dt yield finally: - TimeMachineMiddleware.tls.now_dt = None + tls.now_dt = None diff --git a/src/pretix/presale/middleware.py b/src/pretix/presale/middleware.py index 4cbf52a839..81d4e137f1 100644 --- a/src/pretix/presale/middleware.py +++ b/src/pretix/presale/middleware.py @@ -37,6 +37,7 @@ from django.urls import resolve from django_scopes import scope from pretix.base.channels import WebshopSalesChannel +from pretix.base.timemachine import time_machine_now_assigned_from_request from pretix.presale.signals import process_response from .utils import _detect_event @@ -68,7 +69,8 @@ class EventMiddleware: if redirect: return redirect - with scope(organizer=getattr(request, 'organizer', None)): + with scope(organizer=getattr(request, 'organizer', None)), \ + time_machine_now_assigned_from_request(request): response = self.get_response(request) if hasattr(request, '_namespace') and request._namespace == 'presale' and hasattr(request, 'event'): diff --git a/src/pretix/presale/utils.py b/src/pretix/presale/utils.py index 40d45ee049..a091159df9 100644 --- a/src/pretix/presale/utils.py +++ b/src/pretix/presale/utils.py @@ -55,6 +55,7 @@ from django_scopes import scope from pretix.base.middleware import LocaleMiddleware from pretix.base.models import Customer, Event, Organizer +from pretix.base.timemachine import time_machine_now_assigned_from_request from pretix.helpers.http import redirect_to_url from pretix.multidomain.urlreverse import ( get_event_domain, get_organizer_domain, @@ -407,7 +408,8 @@ def _event_view(function=None, require_live=True, require_plugin=None): if ret: return ret else: - with scope(organizer=getattr(request, 'organizer', None)): + with scope(organizer=getattr(request, 'organizer', None)), \ + time_machine_now_assigned_from_request(request): response = func(request=request, *args, **kwargs) if getattr(request, 'event', None): for receiver, r in process_response.send(request.event, request=request, response=response): diff --git a/src/pretix/settings.py b/src/pretix/settings.py index a27eadfe90..0d1d0ee042 100644 --- a/src/pretix/settings.py +++ b/src/pretix/settings.py @@ -454,7 +454,6 @@ MIDDLEWARE = [ 'pretix.base.middleware.LocaleMiddleware', 'pretix.base.middleware.SecurityMiddleware', 'pretix.presale.middleware.EventMiddleware', - 'pretix.base.timemachine.TimeMachineMiddleware', 'pretix.api.middleware.ApiScopeMiddleware', ]