4

我需要根据对象的工作流状态为其设置不同的权限。例如,“经理组”只能在状态=草稿时编辑对象,但“超级经理组”也可以在状态=已验证时编辑。

似乎无法使用ir.model.access,我正在评估是否可以使用ir.rule. 好像不是...

有没有official办法得到这个或者我需要实现这个功能(也许通过在 ir.model.access 机器中添加一个条件)。

4

4 回答 4

5

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

您可以使用 来实现类似的东西ir.rule,因为它实现了基于字段值的动态每条记录访问控制。通过仅针对writeandunlink操作并基于state字段定义一组规则,您将能够防止某些组修改某些状态下的记录。通过使用始终为真规则的技术,[(1,'=',1)]您可以为拥有“超级访问权限”组的用户放宽非全局规则。另请参阅此答案
但是,此选项将有重要的警告:

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

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

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

于 2012-06-12T10:32:43.153 回答
1

还有另一种方法,而不是破解网络客户端。对于同一个 Object ,您始终可以有 2 个视图。

  1. 对于经理组。

  2. 对于超级经理组。

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

或您需要的任何条件。

并且在超级经理组中同样的方式,您可以将他的条件放在字段中。

于 2012-06-12T12:36:58.647 回答
0

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

这些是使用的记录规则在此处输入图像描述::

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

在action的方法中,如果经过其他write操作改变了State,用户就可以改变State;但是如果状态更新后有一些write操作,用户将无法改变状态。

在我的示例中,打开问题的项目问题方法是case_open(). 它首先更改状态,然后进行其他更改,例如设置打开日期、用户和消息历史记录。因此,基本用户无法打开问题。如果您希望他们能够这样做,case_open()则必须将其覆盖,以便在write完成所有其他操作后更改状态。

于 2012-06-22T08:34:53.560 回答
0

我有一个类似的要求......我的要求是如果用户属于“销售用户”组,则在 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。也许这对你有帮助。:)

于 2012-06-24T04:14:37.703 回答