"""policy http response""" from typing import Any, Dict, Optional from django.http.request import HttpRequest from django.template.response import TemplateResponse from django.utils.translation import gettext as _ from passbook.core.models import PASSBOOK_USER_DEBUG from passbook.policies.types import PolicyResult class AccessDeniedResponse(TemplateResponse): """Response used for access denied messages. Can optionally show an error message, and if the user is a superuser or has user_debug enabled, shows a policy result.""" title: str error_message: Optional[str] = None policy_result: Optional[PolicyResult] = None # pyright: reportGeneralTypeIssues=false def __init__(self, request: HttpRequest, template="policies/denied.html") -> None: super().__init__(request, template) self.title = _("Access denied") def resolve_context( self, context: Optional[Dict[str, Any]] ) -> Optional[Dict[str, Any]]: if not context: context = {} context["title"] = self.title if self.error_message: context["error"] = self.error_message # Only show policy result if user is authenticated and # either superuser or has PASSBOOK_USER_DEBUG set if self.policy_result: if self._request.user and self._request.user.is_authenticated: if ( self._request.user.is_superuser or self._request.user.attributes.get(PASSBOOK_USER_DEBUG, False) ): context["policy_result"] = self.policy_result return context