Как обрабатывать разрешения для конкретных объектов в 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 для этой цели?

0 ответов

Другие вопросы по тегам