Как написать декоратор для проверки кастомных permissions

Есть PERMISSION_CHOICES и есть модель в которую передаётся User и choiсes оба уникальные поля. Разрешения еще будут добавляться(пока хочу проверить на одном).

class Perm(models.Model):
    EDIT_USER = 'edit_user'

    PERMISSION_CHOICES = [
         (EDIT_USER, 'Can edit user '),
     ]

    user_perm = models.ForeignKey(User, on_delete=models.CASCADE, null=True, unique=True,
                              blank=True, related_name='user_perm')
    choices_perm = models.CharField(max_length=2, choices=PERMISSION_CHOICES,
                                unique=True)

Мне нужно написать декоратор который будет проверять есть ли у данного user такое разрешение. если есть его пускает к views если нет то редирект.

Я уже кое что написал но застрял.

def check_perm(??????):
def you_need_perms(view):
    def wrapper(request):
        current_perms = Perm.objects.filter(user=request.user)
        if func(current_perms, ??????):
            return view(request)
        else:
            return redirect('account:index')
    return wrapper
return you_need_perms

Как мне передать разрешения для проверки в этот будущий декоратор.


Ответы (1 шт):

Автор решения: Rostyslav

Нужно еще одну оболочку добавить, как-то так

def you_need_perms(permissions):
    def wrapper1(view):
        def wrapper(request):
            current_perms = Perm.objects.filter(user=request.user)
            if func(current_perms, permissions):
               return view(request)
            else:
               return redirect('account:index')
         return wrapper
    return wrapper1

Использовать

@you_need_perms(your_permissions)
def get(request):
    pass 

Только в представлении первый параметр self(тогда его нужно добавить перед request) если оно относиться не к класу в целом

→ Ссылка