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

У меня есть пользовательская групповая модель следующего вида:

class MyGroup(models.Model):
    name = models.CharField(max_length=200,null=True,blank=False,default="Group name")
    members = models.ManyToManyField(get_user_model(), blank=True, related_name="grpmembers")
    created_by = models.ForeignKey(get_user_model(), on_delete=models.DO_NOTHING, null=True, blank=False, related_name="createdby+")
    created_at = models.DateTimeField(editable=False)

Все работает, все в порядке, я переопределяю метод сохранения в django admin, так что created_by будет указывать на вошедшего пользователя при сохранении.

Проблема №1

Даже если вы являетесь создателем группы, вы можете выбрать себя, чтобы быть в ней или быть удаленным из нее, что выглядит глупо. Я думаю решить эту проблему, сказав, что пользователь может просматривать группу, если он находится в members или created_by.

Проблема №2

Пользовательское разрешение. Я хочу иметь некоторые разрешения, например:

  • Можно просматривать группу: это означает, что пользователь либо является создателем, либо находится в списке участников
  • Можно редактировать группу: это означает, что пользователь является создателем (может редактировать свои собственные материалы) или является персоналом (может редактировать чьи-либо материалы) или является суперпользователем (root)

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

Я нашел несколько способов, например, создать Meta и определить там права доступа, а также сделать права доступа как def(/functions), но как я могу получить доступ к текущему вошедшему пользователю?

Либо хорошо, допустим, я сделаю

def can_view_group(self):
r1 = self.filter(members=req.user) # where req.uset is not accessible bc we're in models.py

, но как мне указать разрешение на проверку текущего вошедшего пользователя?

Проблема в том, что вся логика выполняется в моделях. По проблеме 1 вам нужно проверить, что пользователь не является владельцем, прежде чем разрешить ему выйти в views.py.
. Для проблемы 2 есть два решения, либо вы переносите can_view_group в views.py, либо определяете это в моделях как:

def can_view_group(self, user):
    #all the logic

А вы передаете пользователя из views.py

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