1

我想利用django-guardian的对象权限并将特定用户的特定权限授予一个或多个 Django 用户。

我试图向我的 Process 类添加一些权限,如下所示:

class TestProcess(Process):
    title = models.CharField(max_length=64)

    something = models.ForeignKey(ForInheritage, null=True, on_delete=models.CASCADE)
    no_approval = models.BooleanField(default=False)
    approved = models.BooleanField(default=False)

    def something_is_approved(self):
        try:
            return self.something.approved
        except:
            return None

    class Meta:
        permissions = (
            ('view_process', 'View Process'),
        )

不幸的是,这会导致viewflow在启动后立即抛出错误runserver

File "/home/me/.virtualenvs/viewflow3/lib/python3.4/site-packages/viewflow/mixins.py", line 253, in ready
    self.flow_class.process_class._meta.permissions.append(
AttributeError: 'tuple' object has no attribute 'append'

我最初的计划是对类进行子类化StartView流化,以改变从 .Permission继承的函数的PermissionMixin工作方式。但这似乎也比这更多的工作。

django-guardian已在此处cookbook的某个部分中提到,但目前导致 404 页面。

在进程和任务上使用监护人权限的推荐/最干净的方法是什么?

4

1 回答 1

1

您的具体问题发生在您指定元组之类的权限时,请尝试使用列表

class Meta:
    permissions = [
        ('view_process', 'View Process'),
    ]

Viewflow 已经添加了“查看”和“管理”权限,因此您可以重复使用它们。

但是使用 django-guardian 在对象级别上进一步限制每个进程的查看权限并不是很实用。在每次创建新流程时,在开始视图中,您必须向所有流程参与者授予查看权限。这会导致巨大的权限表增长并减慢权限查找。

例如,对象级权限的合理用例可能是基于用户部门限制用户对任务的访问。

deliver = flow.View(
    views.deliver
).Permission(
    'parcel.land_on_planet',
    obj=lambda process: process.department
).Next(this.report)
于 2017-02-25T05:56:23.697 回答