"""Custom authentication backends."""
from __future__ import annotations
from typing import TYPE_CHECKING, Any, Optional
from django.contrib.auth.backends import ModelBackend
if TYPE_CHECKING: # pragma: no cover
from django.contrib.auth.models import User
[docs]class ScanlationBackend(ModelBackend):
"""Authentication backend with scanlator permissions."""
[docs] @staticmethod
def is_scanlator(user_obj: User) -> bool:
"""
Check whether the given user is a scanlator.
:param user_obj: A ``User`` model instance.
:return: ``True`` if the user is in the "Scanlator" group.
"""
return user_obj.groups.filter(name='Scanlator').exists()
[docs] def has_perm(self, user_obj: User, perm: str,
obj: Optional[Any] = None) -> bool:
if not user_obj.is_active:
return False
if self.is_scanlator(user_obj):
return getattr(obj, 'manager_id', -1) == user_obj.pk
# ModelBackend.has_perm checks `is_active` which we already did
return super(ModelBackend, self).has_perm(user_obj, perm, obj=obj)
__all__ = ['ScanlationBackend']