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