基于工作流状态的不同权限

时间:2012-06-12 09:52:44

标签: permissions workflow openerp

我需要根据对象的工作流状态为对象设置不同的权限。例如,'manager group'只能在state = draft时编辑对象,但如果state = validated,'super manager group'也可以编辑它。

似乎无法使用ir.model.access并且我正在评估是否可以使用ir.rule来完成。好像不是......

是否有official方式来实现此功能,或者是否需要实现此功能(可能通过向ir.model.access机器中添加条件)。

4 个答案:

答案 0 :(得分:5)

默认情况下,这不可能与ir.model.access一起使用,因为此权限模型的设计就像对CRUD操作的简单Unix权限一样,并且是静态定义的,每个模型和每个组。

您可以使用ir.rule实现类似的功能,因为它实现了基于字段值的动态每记录访问控制。通过仅在writeunlink操作上定义一组规则并基于state字段,您将能够阻止某些组修改某些状态的记录。通过使用始终为真的规则[(1,'=',1)]的技术,您可以为具有“超级访问”组的用户放松非全局规则。另见answer 但是,这个选项会有重要的警告:

  • 请注意不要将这些规则适用于read,因为它会使记录完全消失,并且通常会对您的流程造成严重破坏
  • 当规则生效时,界面不会变为只读,如果要将字段和按钮设为只读,则必须找到一种方法通过attrs以某种方式指定这取决于用户的组。另请参阅此Launchpad question
  • UI中的“保存”按钮不会被禁用
  • ir.rule限制情况下的标准错误报告不是很明确,因此肯定会让用户感到困惑(注意:它正在改进7.0)

如您所见,为此目的使用ir.rule过滤器远非完美的解决方案,您首先需要为上述问题找到合适的解决方案。

最终,您可能更容易实现自己的逻辑,在ORM原始API方法中插入新机制:fields_view_get(用于根据用户组动态地只读字段)和CRUD方法(用于实际限制操作)

答案 1 :(得分:1)

还有另一种方法,而不是黑客攻击网络客户端。 对于同一个对象,您始终可以拥有2个视图。

  1. 对于经理组。

  2. 对于超级经理人组。

  3. 在经理组中你可以使用attrs = {'readonly':[('state','!=','draft')]}

    或您需要的任何条件。

    在超级经理人组中,你可以把他的条件放在田野里。

答案 2 :(得分:0)

我在生产环境中使用此功能,仅使用记录规则:在项目问题中,“基本用户”可以创建和取消问题,但无法打开或关闭它们。 尽管@odony提到了GUI限制,但它仍能完美运行。

这些是使用的记录规则:enter image description here

需要注意一个特殊情况:从读写状态变为只读状态:

在动作的方法中,如果在其他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。也许这会对你有所帮助。 :)