Move time machine logic into contextmanager

This commit is contained in:
Mira Weller
2024-04-30 21:49:58 +02:00
parent 204b8e53de
commit 9787ed1820
4 changed files with 26 additions and 27 deletions
+20 -24
View File
@@ -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
+3 -1
View File
@@ -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'):
+3 -1
View File
@@ -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):
-1
View File
@@ -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',
]