1from plain.auth.views import AuthView
2from plain.http import RedirectResponse, Response
3from plain.sessions.views import SessionView
4
5from .constants import _IMPERSONATE_SESSION_KEY
6from .permissions import can_be_impersonator
7from .requests import get_request_impersonator
8
9
10class ImpersonateStartView(AuthView):
11 def get(self) -> Response:
12 # We *could* already be impersonating, so need to consider that
13 impersonator = get_request_impersonator(self.request) or self.user
14 if impersonator and can_be_impersonator(impersonator):
15 self.session[_IMPERSONATE_SESSION_KEY] = self.url_kwargs["id"]
16 return RedirectResponse(self.request.query_params.get("next", "/"))
17
18 return Response(status_code=403)
19
20
21class ImpersonateStopView(SessionView):
22 def get(self) -> Response:
23 self.session.pop(_IMPERSONATE_SESSION_KEY)
24 return RedirectResponse(self.request.query_params.get("next", "/"))