from django.http import HttpRequest, HttpResponse from django.middleware.csrf import get_token from inertia import share from labs.models import User from .sudo import get_sudo_remaining_seconds, is_sudo_active class InertiaSharedPropsMiddleware: """Middleware to set shared Inertia props for admin requests only.""" def __init__(self, get_response): self.get_response = get_response def __call__(self, request: HttpRequest) -> HttpResponse: # Only process requests to /admin/ paths if not request.path.startswith("/admin/"): return self.get_response(request) user: User = request.user permissions: list[str] = [] sudo_info: dict | None = None if user.is_authenticated: permissions = list(user.get_all_permissions()) # Include sudo session info for authenticated staff users if user.is_staff: sudo_active = is_sudo_active(request) sudo_info = { "active": sudo_active, "remaining_seconds": get_sudo_remaining_seconds(request) if sudo_active else None, } share( request, auth={ "user": { "id": user.id, "email": user.email, "is_staff": user.is_staff, "is_superuser": user.is_superuser, } if user.is_authenticated else None, "permissions": permissions, "sudo": sudo_info, }, flash={ "success": request.session.pop("flash_success", None), "error": request.session.pop("flash_error", None), }, csrf_token=get_token(request), ) return self.get_response(request)