Permissions 基于工作流状态的不同权限
我需要根据对象的工作流状态对其设置不同的权限。例如,仅当state=draft时,“经理组”可以编辑对象,但如果state=validated,“超级经理组”也可以编辑对象 似乎使用Permissions 基于工作流状态的不同权限,permissions,workflow,openerp,Permissions,Workflow,Openerp,我需要根据对象的工作流状态对其设置不同的权限。例如,仅当state=draft时,“经理组”可以编辑对象,但如果state=validated,“超级经理组”也可以编辑对象 似乎使用ir.model.access是不可能的,我正在评估是否可以使用ir.rule来完成。似乎不是 是否有一种官方方法来实现此功能,或者我是否需要实现此功能(可能通过向ir.model.access机制中添加一个条件)。对于ir.model.access,默认情况下这是不可能的,因为此权限模型的作用类似于对CRUD操作的
ir.model.access是不可能的,我正在评估是否可以使用ir.rule
来完成。似乎不是
是否有一种官方
方法来实现此功能,或者我是否需要实现此功能(可能通过向ir.model.access机制中添加一个条件)。对于ir.model.access
,默认情况下这是不可能的,因为此权限模型的作用类似于对CRUD操作的简单Unix权限,它是静态定义的,每个模型和每个组
您可以使用ir.rule
实现类似的功能,因为它基于字段值实现了动态的每记录访问控制。通过仅在写入
和取消链接
操作上定义一组规则,并基于状态
字段,可以防止某些组修改某些状态下的记录。通过使用始终为真规则的技术,您可以为拥有“超级访问”组的用户放宽非全局规则。另见此。
但是,此选项有重要的注意事项:
- 小心不要让这些规则适用于
读取
,因为这会使记录完全消失,并且通常会对流程造成严重破坏
- 当规则生效时,界面将不会变为只读,如果要使字段和按钮变为只读,则必须找到一种方法,通过
attrs
以一种取决于用户组的方式指定。另见此
- UI中的“保存”按钮将不会被禁用
- 在
ir.rule
限制的情况下,标准错误报告不是很清楚,因此它肯定会让用户感到困惑(注意:它正在为7.0改进)
如您所见,为此目的使用ir.rule
过滤器远不是一个完美的解决方案,您首先需要为上述问题找到合适的解决方案
最终,您可能需要更轻松地实现自己的逻辑,在ORM基本API方法中插入新机制:fields\u view\u get
(用于根据用户组使字段动态只读)和CRUD方法(用于实际限制操作)有另一种方法代替黑客入侵web客户端。
对于同一对象,始终可以有两个视图
对于经理组
超级经理组
在管理器组中,您可以使用attrs={'readonly':[('state','!=','draft')]}
或者你需要的任何条件
同样,在超级经理组中,您可以为字段设置他的条件 我在生产环境中使用此功能,只使用记录规则:在项目问题中,“基本用户”可以创建和取消问题,但不能打开或关闭问题。
尽管@odony提到了GUI限制,但它仍然可以完美地工作
以下是使用的记录规则:
有一种特殊情况需要注意:从读写状态更改为只读状态:
在动作的方法中,如果在其他写入
操作后状态发生更改,则用户将能够更改状态;但是,如果在状态更新之后有一些写入操作,用户将无法更改状态
在我的示例中,打开问题的项目问题方法是case\u Open()
。它首先更改状态,然后执行其他更改,如设置打开日期、用户和消息历史记录。因此,基本用户无法打开问题。如果您希望他们能够这样做,则必须覆盖case\u open()
,以便在所有其他写入操作完成后更改状态。我也有类似的要求。。。
我的要求是,如果用户属于“销售用户”组,则在sale.order中设置一个字符字段(如“test_123”)为只读,否则可为“销售经理”组编辑。
也就是说,如果销售订单处于草稿状态,则任何人都可以编辑,但如果确认了销售订单,则此字段“test_123”仅可用于“销售经理”编辑
我所做的是添加了一个功能字段(is_group_manager),如果用户属于“sale manager”组,并且状态不是“draft”,否则返回True。
然后在xml视图中,我添加了字段“test_123”,属性为attrs=“{'readonly':[('is_group_manager','=',0)]”
比如说
<field name="is_group_manager" invisible="1"/>
<field name="test_123" attrs="{'readonly':[('is_group_manager','=',0)]}"/>
这仅适用于OpenERPv6.0。也许这会对你有所帮助。:) 是的,这也是我的结论,这就是为什么我说“我正在评估是否可以使用ir.rule来完成。似乎不是…”:)一个可能的解决方案是ir.rule+web客户端黑客攻击来相应地显示编辑/删除/复制按钮,希望你无论如何都不要在v7.0:p上重写这个,tnx为您提供了详尽的答案。7.0中的web客户端API将有相当多的改进,因此根据您扩展的部分,您的里程可能会有所不同。API的设计不会有太大的改变,但特定的领域将以不总是向后兼容的方式得到改进。顺便说一句,7.0 API可能会在字段\u view\u get()
的结果中包含额外的数据,以便根据该模型上的用户访问权限,让客户端知道要显示哪些按钮。您可能希望观察trunk(尚未完成),以防您可以使自己的实现使用相同的命名约定。是的,字段\u视图\u加载,这就是我尝试插入的地方。您希望在您自己的模型或现有模型(如sale.order、purchase.order等)中显示此功能吗??在哪个openerp版本中?