from django.http import HttpRequest
from .models import Agent, AgentQuerySet
__all__ = ("AgentMiddleware",)
[docs]
class AgentMiddleware:
"""
This middleware adds user's agents to the request object, as:
- ``agent``: the current agent user is acting as;
- ``agents``: the agents user can impersonate.
It creates user's default agent if none is already present.
You can add it to the ``MIDDLEWARE`` setting, after ``AuthenticationMiddleware``:
..code-block:: python
MIDDLEWARE = [
# ...
"django.contrib.auth.middleware.AuthenticationMiddleware",
# ...
"django.middleware.clickjacking.XFrameOptionsMiddleware",
"caps.middleware.AgentMiddleware",
]
"""
agent_class = Agent
"""Agent model class to use."""
agent_cookie_key = "django_caps.agent"
"""Cookie used to get agent."""
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request: HttpRequest):
request.agents = self.get_agents(request)
request.agent = self.get_agent(request, request.agents)
return self.get_response(request)
[docs]
def get_agents(self, request: HttpRequest) -> AgentQuerySet:
"""Return queryset for user's agents, ordered by ``-user_id``."""
return Agent.objects.user(request.user, strict=False).order_by("-user_id")
[docs]
def get_agent(self, request: HttpRequest, agents: AgentQuerySet) -> Agent:
"""Return user's active agent."""
if request.user.is_anonymous:
return next(iter(agents), None)
if agent := getattr(request.user, "agent", None):
return agent
agent = Agent.objects.create(user=request.user)
# assign agent to request's user as it ain't already present
request.user.__dict__["agent"] = agent
return agent