nk20/apps/member/backends.py

38 lines
1.4 KiB
Python
Raw Normal View History

2020-03-07 12:12:17 +00:00
# Copyright (C) 2018-2020 by BDE ENS Paris-Saclay
# SPDX-License-Identifier: GPL-3.0-or-later
2019-09-18 12:26:42 +00:00
from member.models import Club, Membership, RolePermissions
2020-03-07 12:12:17 +00:00
from django.contrib.auth.backends import ModelBackend
2019-09-18 12:26:42 +00:00
2020-03-07 12:12:17 +00:00
class PermissionBackend(ModelBackend):
2019-09-18 12:26:42 +00:00
supports_object_permissions = True
supports_anonymous_user = False
supports_inactive_user = False
2020-03-07 12:12:17 +00:00
def permissions(self, user):
for membership in Membership.objects.filter(user=user).all():
if not membership.valid() or membership.roles is None:
2019-09-18 12:26:42 +00:00
continue
2020-03-07 12:12:17 +00:00
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
2019-09-18 12:26:42 +00:00
def has_perm(self, user_obj, perm, obj=None):
2020-03-07 12:12:17 +00:00
if user_obj.is_superuser:
return True
2019-09-18 12:26:42 +00:00
if obj is None:
return False
perm = perm.split('_', 3)
2019-09-18 12:26:42 +00:00
perm_type = perm[1]
perm_field = perm[2] if len(perm) == 3 else None
2020-03-07 12:12:17 +00:00
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
2019-09-18 12:26:42 +00:00
def get_all_permissions(self, user_obj, obj=None):
2020-03-07 12:12:17 +00:00
return list(self.permissions(user_obj))