Source code for aleksis.core.util.middlewares
from typing import Callable
from django.http import HttpRequest, HttpResponse
from ..models import DummyPerson, Person
from .core_helpers import get_site_preferences, has_person
[docs]class EnsurePersonMiddleware:
"""Middleware that ensures that the logged-in user is linked to a person.
It is needed to inject a dummy person to a superuser that would otherwise
not have an associated person, in order they can get their account set up
without external help.
In addition, if configured in preferences, it auto-creates or links persons
to regular users if they match.
"""
def __call__(self, request: HttpRequest) -> HttpResponse:
if not has_person(request) and not request.user.is_anonymous:
prefs = get_site_preferences()
if (
prefs.get("account__auto_link_person", False)
and request.user.first_name
and request.user.last_name
):
if prefs.get("account__auto_create_person"):
person, created = Person.objects.get_or_create(
email=request.user.email,
defaults={
"first_name": request.user.first_name,
"last_name": request.user.last_name,
},
)
person.user = request.user
else:
person = Person.objects.filter(email=request.user.email).first()
if person:
person.user = request.user
person.save()
if request.user.is_superuser and not has_person(request):
# Super-users get a dummy person linked
dummy_person = DummyPerson(
first_name=request.user.first_name, last_name=request.user.last_name
)
request.user.person = dummy_person
response = self.get_response(request)
return response