Как обрабатывать разрешения для конкретных объектов в 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
Затем я добавил разрешение Approft_draft в мета утверждения перехода и проверил, есть ли у пользователя это разрешение, используя функцию has_perm в пользовательской модели.
например:
...
...
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. он выполняет бэкэнд аутентификации get_all_permissions и получает все разрешения, назначенные пользователю, которые, конечно, не включают разрешения для конкретных объектов, которые я обрабатываю в has_perm.
Любой способ решить это? или я должен отказаться от использования django-river для этой цели?