forked from CGM_Public/pretix_original
Move time machine logic into contextmanager
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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'):
|
||||
|
||||
@@ -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):
|
||||
|
||||
@@ -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',
|
||||
]
|
||||
|
||||
|
||||
Reference in New Issue
Block a user