Skip to content
Snippets Groups Projects
backends.py 1.38 KiB
Newer Older
ynerant's avatar
ynerant committed
# Copyright (C) 2018-2020 by BDE ENS Paris-Saclay
# SPDX-License-Identifier: GPL-3.0-or-later

Benjamin Graillot's avatar
Benjamin Graillot committed
from member.models import Club, Membership, RolePermissions
ynerant's avatar
ynerant committed
from django.contrib.auth.backends import ModelBackend
ynerant's avatar
ynerant committed
class PermissionBackend(ModelBackend):
Benjamin Graillot's avatar
Benjamin Graillot committed
    supports_object_permissions = True
    supports_anonymous_user = False
    supports_inactive_user = False

ynerant's avatar
ynerant committed
    def permissions(self, user):
        for membership in Membership.objects.filter(user=user).all():
            if not membership.valid() or membership.roles is None:
Benjamin Graillot's avatar
Benjamin Graillot committed
                continue
ynerant's avatar
ynerant committed
            for role_permissions in RolePermissions.objects.filter(role=membership.roles).all():
                for permission in role_permissions.permissions.all():
                    permission = permission.about(user=user, club=membership.club)
                    yield permission
Benjamin Graillot's avatar
Benjamin Graillot committed

    def has_perm(self, user_obj, perm, obj=None):
ynerant's avatar
ynerant committed
        if user_obj.is_superuser:
            return True

Benjamin Graillot's avatar
Benjamin Graillot committed
        if obj is None:
            return False
        perm = perm.split('_', 3)
Benjamin Graillot's avatar
Benjamin Graillot committed
        perm_type = perm[1]
        perm_field = perm[2] if len(perm) == 3 else None
ynerant's avatar
ynerant committed
        return any(permission.applies(obj, perm_type, perm_field) for permission in self.permissions(user_obj))

    def has_module_perms(self, user_obj, app_label):
        return False
Benjamin Graillot's avatar
Benjamin Graillot committed

    def get_all_permissions(self, user_obj, obj=None):
ynerant's avatar
ynerant committed
        return list(self.permissions(user_obj))