Передача аргумента пользовательскому классу разрешения в django

У меня есть пользовательский класс разрешения, который расширяет базовое разрешение rest framework. Я пытаюсь передать аргумент allowed_groups, который будет списком всех групп, имеющих доступ к определенному представлению.

Вот моя текущая реализация пользовательских разрешений.

class CustomUserPermisions(BasePermission): 
    
    message = "Ooops! You do not have permissions to access this particular site"
    def has_permission(self, request, view):
        allowed_groups = [ 'group_hr', 'super_admin', 'employee']
        user1 = Employee.objects.filter(user__email=request.user).first()
        user_groups = user1.user_group.all()
        for group in user_groups:
            if group.title in allowed_groups:
                return True 
        return False

Я попробовал добавить аргумент следующим образом.

class CustomUserPermisions(BasePermission, allowed_groups): 
    
    message = "Ooops! You do not have permissions to access this particular site"
    def has_permission(self, request, view):
        allowed_groups = [ 'group_hr', 'super_admin', 'employee']
        user1 = Employee.objects.filter(user__email=request.user).first()
        user_groups = user1.user_group.all()
        for group in user_groups:
            if group.title in allowed_groups:
                return True 
        return False

но это ошибка, которую я получаю в настоящее время.

class CustomUserPermisions(BasePermission, allowed_groups): 
NameError: name 'allowed_groups' is not defined

Есть ли лучший способ сделать это?

Я предполагаю, что вы новичок в python. Вам следует прочитать https://docs.python.org/3/tutorial/classes.html, чтобы лучше понять классы python.

class CustomUserPermisions(BasePermission, allowed_groups): означает, что класс CustomUserPermisions наследуется от классов BasePermission и allowed_groups. allowed_groups не является классом, поэтому вы получите ошибку.

Вам следует создать атрибут класса для разрешенной группы :

class CustomUserPermisions(BasePermission):
    def __init__(self, allowed_groups):
        self.allowed_groups = allowed_groups
        self.message = "Ooops! You do not have permissions to access this particular site"

    def has_permission(self, request, view):
        user1 = Employee.objects.filter(user__email=request.user).first()
        user_groups = user1.user_group.all()
        for group in user_groups:
            if group.title in self.allowed_groups:
                return True
        return False

и затем вызвать конструктор класса :

permissions = CustomUserPermisions(['group_hr', 'super_admin', 'employee'])

Вернуться на верх