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