我想利用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'
我最初的计划是子类Start
并View
流类,以改变从PermissionMixin
继承的Permission
函数的工作方式。但这似乎也比这更重要。
django-guardian
已经在此处的cookbook
部分中提到,但目前指向404页面。
对流程和任务使用监护人权限的推荐/最干净方法是什么?
您的特定问题发生 b/c 您指定了元组等权限,请尝试改为列表
class Meta:
permissions = [
('view_process', 'View Process'),
]
Viewflow 已经添加了"查看"和"管理"权限,因此您可以重复使用它们。
但是使用 django-guardian 在对象级别进一步限制每个进程的视图权限并不是很实用。在每次创建新流程时,在开始视图中,您必须向所有流程参与者授予查看权限。这会导致hudge权限表增长并减慢权限查找速度。
例如,对象级权限的合理用例可能是根据用户部门限制用户对任务的访问。
deliver = flow.View(
views.deliver
).Permission(
'parcel.land_on_planet',
obj=lambda process: process.department
).Next(this.report)