31 lines
1.1 KiB
Python
31 lines
1.1 KiB
Python
from django.shortcuts import get_object_or_404
|
|
|
|
from .models import Event
|
|
from .scoping import current_event
|
|
|
|
|
|
class EventContextMiddleware:
|
|
def __init__(self, get_response):
|
|
self.get_response = get_response
|
|
|
|
def __call__(self, request):
|
|
try:
|
|
return self.get_response(request)
|
|
finally:
|
|
# Not current_event.reset(token): under ASGI, process_view and this
|
|
# finally block can run in different contextvars.Context copies
|
|
# (sync_to_async(thread_sensitive=True) copies the context), and
|
|
# Token.reset() requires the exact Context it was created in.
|
|
# set(None) has no such constraint.
|
|
current_event.set(None)
|
|
|
|
def process_view(self, request, view_func, view_args, view_kwargs):
|
|
event_path = view_kwargs.get("event_path")
|
|
if event_path:
|
|
request.event = get_object_or_404(
|
|
Event.objects.available_to(getattr(request, "user", None)),
|
|
path=event_path,
|
|
)
|
|
current_event.set(request.event)
|
|
return None
|