我需要根据对象的工作流状态为其设置不同的权限。例如,“经理组”只能在状态=草稿时编辑对象,但“超级经理组”也可以在状态=已验证时编辑。
似乎无法使用ir.model.access
,我正在评估是否可以使用ir.rule
. 好像不是...
有没有official
办法得到这个或者我需要实现这个功能(也许通过在 ir.model.access 机器中添加一个条件)。
我需要根据对象的工作流状态为其设置不同的权限。例如,“经理组”只能在状态=草稿时编辑对象,但“超级经理组”也可以在状态=已验证时编辑。
似乎无法使用ir.model.access
,我正在评估是否可以使用ir.rule
. 好像不是...
有没有official
办法得到这个或者我需要实现这个功能(也许通过在 ir.model.access 机器中添加一个条件)。
这在默认情况下是不可能的ir.model.access
,因为这个权限模型被设计为像简单的 Unix 权限一样对 CRUD 操作进行操作,并且它是静态定义的,每个模型和每个组。
您可以使用 来实现类似的东西ir.rule
,因为它实现了基于字段值的动态每条记录访问控制。通过仅针对write
andunlink
操作并基于state
字段定义一组规则,您将能够防止某些组修改某些状态下的记录。通过使用始终为真规则的技术,[(1,'=',1)]
您可以为拥有“超级访问权限”组的用户放宽非全局规则。另请参阅此答案。
但是,此选项将有重要的警告:
read
,因为它会使记录完全消失,并且通常会对您的流程造成严重破坏attrs
以取决于用户组的方式指定它。另请参阅此Launchpad 问题。ir.rule
不是很清楚,所以它肯定会让用户感到困惑(注意:它正在为 7.0 改进)如您所见,ir.rule
为此目的使用过滤器远非完美的解决方案,您首先需要为上述问题找到合适的解决方案。
最终,您可能有一个更简单的任务来实现自己的逻辑,在 ORM 原始 API 方法中插入一个新机制:(fields_view_get
用于根据用户组动态地使字段只读)和 CRUD 方法(用于实际限制操作)
还有另一种方法,而不是破解网络客户端。对于同一个 Object ,您始终可以有 2 个视图。
对于经理组。
对于超级经理组。
在经理组中,您可以使用 attrs = {'readonly': [('state', '!=', 'draft')]}
或您需要的任何条件。
并且在超级经理组中同样的方式,您可以将他的条件放在字段中。
我在生产环境中使用此功能,仅使用记录规则:在项目问题中,“基本用户”可以创建和取消问题,但不能打开或关闭它们。尽管@odony 提到了 GUI 限制,但它运行良好。
这些是使用的记录规则::
有一种特殊情况需要注意:从读写状态变为只读状态:
在action的方法中,如果经过其他write
操作改变了State,用户就可以改变State;但是如果状态更新后有一些write
操作,用户将无法改变状态。
在我的示例中,打开问题的项目问题方法是case_open()
. 它首先更改状态,然后进行其他更改,例如设置打开日期、用户和消息历史记录。因此,基本用户无法打开问题。如果您希望他们能够这样做,case_open()
则必须将其覆盖,以便在write
完成所有其他操作后更改状态。
我有一个类似的要求......我的要求是如果用户属于“销售用户”组,则在 sale.order 中只读一个字符字段(比如“test_123”),否则对于“销售经理”组可编辑。也就是说,如果销售订单处于草稿状态,那么任何人都可以编辑,但如果销售订单被确认,那么这个字段“test_123”只能对“销售经理”进行编辑
我所做的是我添加了一个功能字段(is_group_manager),如果用户属于“销售经理”组并且状态不是“草稿”,则返回 True,否则返回 false。然后在 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)]}"/>
这仅适用于 openerp v6.0。也许这对你有帮助。:)