Пользовательские разрешения 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) в моделях или в представлениях?