from django.utils import timezone from .models import TicketMagicLink MAGIC_LINK_SESSION_KEY = "ticket_magic_link_id" def grant_ticket_magic_access(request, link): """Grant an anonymous session access to exactly one ticket until link expiry.""" request.session.cycle_key() request.session[MAGIC_LINK_SESSION_KEY] = link.pk remaining = max(1, int((link.expires_at - timezone.now()).total_seconds())) request.session.set_expiry(remaining) def get_ticket_magic_access(request, ticket=None): link_id = request.session.get(MAGIC_LINK_SESSION_KEY) if not link_id: return None filters = { "pk": link_id, "revoked_at__isnull": True, "expires_at__gt": timezone.now(), "customer__is_active": True, } if ticket is not None: filters["ticket_id"] = ticket.pk link = TicketMagicLink.objects.select_related("customer", "ticket").filter(**filters).first() if link is None and ticket is None: request.session.pop(MAGIC_LINK_SESSION_KEY, None) return link