Пользовательские разрешения Djnago фильтруются по роли и идентификатору пользователя

Я работаю с Django Permissions и пытаюсь понять, как реализовать

У меня есть расширенная модель User, в которой пользователи имеют роли:

class UserCustomModel(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE, primary_key=True)
    ROLES = (
        ('ADMIN', 'ADMIN'),
        ('SUPERUSER', 'SUPERUSER'),
        ('CONTRIBUTOR', 'CONTRIBUTOR'),
        ('READER', 'READER'),
    )
    roles = models.CharField(max_length=50, choices=ROLES, null=True)
    deleted = models.IntegerField(default=1)
    last_change_date = models.DateTimeField(auto_now=True)

А есть модель для клиентов (фирм):

class CustomClient(models.Model):
    client_id = models.AutoField(primary_key=True)
    client_name = models.TextField()
    client_description = models.TextField()
    deleted = models.IntegerField(default=1)
    last_change_date = models.DateTimeField(auto_now=True)

    def __str__(self):
        return str(self.client_name)

Каждый пользователь может быть назначен ровно одному клиенту. Это отображается в третьей модели:

class ClientUser(models.Model):
    class Meta:
        unique_together = (('user', 'client', 'group'),)

    user = models.ForeignKey(User, on_delete=models.CASCADE, primary_key=True)
    client = models.ForeignKey(CustomClient, on_delete=models.CASCADE)
    group = models.ForeignKey(Group, on_delete=models.CASCADE) 
    deleted = models.IntegerField(default=1)
    last_change_date = models.DateTimeField(auto_now=True)

И я создал группы в Django для каждой роли:

  • Админы
  • Суперпользователи
  • Контрибуторы
  • Читатели

Идея состоит в том, чтобы назначить пользователя в группу по его/ее роли. Это работает хорошо, но я хочу установить пользовательские разрешения для этих групп. Например, если пользователь имеет роль SUPERUSER, то он может добавлять/изменять/удалять пользователей с ролями CONTRIBUTOR и READER. Или если пользователь имеет роль ADMIN, он может добавлять/изменять/удалять пользователей со всеми остальными ролями. И это должно быть ограничено идентификатором клиента пользователя

Не могу понять с чего начать, возможно ли установить права доступа на основе пользовательских ролей? Я обнаружил, что могу проверить, есть ли у пользователя роль следующим образом:

class IsAdmin(BasePermission):
    def has_permission(self, request, view):
        return request.user.role == "ADMIN"

Но как действовать дальше я не знаю, я конечно могу получить client_id из запроса. Но должен ли я использовать этот класс IsAdmin(BasePermission) в моделях или в представлениях?

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