Как работать с объектно-специфическими разрешениями в django-river?
У меня есть сценарий использования django-river, в котором пользователи могут одобрить некоторые объекты (записи базы данных) в модели, но не все. Мне нужно проверить, может ли пользователь утвердить переход программно, так как пользователь может утвердить объект в зависимости от пользователя и в зависимости от свойств объекта (например: менеджеры могут утверждать посты, которые имеют категорию "фантастика")
django-river позволяет указывать группы и разрешения для мета утверждения переходов. Однако это означает, что если у пользователя есть разрешение или он входит в группу, он может утверждать все объекты.
Я исследовал возможное решение, которое заключается в добавлении пользовательских разрешений к модели, которая у меня есть в подклассе Meta. Пример:
class BlogPost(models.Model):
title = models.CharField(verbose_name="Title", max_length=255)
content = models.TextField(verbose_name="Content")
state = StateField()
def approve_draft(self, user):
self.river.state.approve(as_user=user, next_state=State.objects.get(slug="published"))
class Meta:
permissions = [
("approve_draft", "Approve draft"),
]
def __str__(self):
return self.title
Затем я добавил разрешение approve_draft в мета-утверждение перехода и проверил, есть ли у пользователя это разрешение, используя функцию has_perm в модели пользователя.
eg:
...
...
def has_perm(self, perm: str, obj = None) -> bool:
if perm = "app.approve_draft":
# I have my logic here to check if the user has permissions to approve th obj
return True
return super().has_perm(perm, obj)
Однако, я исследовал исходный код django-river, и он, похоже, не выполняет has_perm. Он выполняет auth backend get_all_permissions и получает все разрешения, назначенные пользователю, которые, конечно, не включают объектные разрешения, которые я обрабатываю в has_perm.
Есть ли способ решить эту проблему? Или я должен отказаться от использования django-river для этой цели?