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