【问题标题】:different permissions based on workflow state基于工作流状态的不同权限
【发布时间】:2012-06-24 15:06:00
【问题描述】:

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

使用ir.model.access 似乎不可能,我正在评估是否可以使用ir.rule 来完成。好像没有……

有没有official 的方法来获得这个或者我需要实现这个功能(可能通过在 ir.model.access 机制中添加一个条件)。

【问题讨论】:

  • 你想在你自己的模型中展示这个还是在现有的模型中,比如 sale.order、purchase.order 等?在哪个 openerp 版本中?

标签: permissions workflow openerp


【解决方案1】:

默认情况下 ir.model.access 无法做到这一点,因为此权限模型旨在像简单的 Unix 权限一样对 CRUD 操作进行操作,并且它是静态定义的,每个模型和每个组。

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

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

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

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

【讨论】:

  • 是的,这也是我的结论,这就是为什么我说“我正在评估是否可以使用 ir.rule 来完成。似乎不能......”: ) 一个可能的解决方案是 ir.rule + web 客户端 hacking 以相应地显示编辑/删除/复制按钮,希望您不会在 v7.0 上重写它:P 无论如何,tnx 为您提供详尽的答案。
  • 在 7.0 中,Web 客户端 API 将发生相当多的演变,因此您的里程可能会根据您扩展的部分而有所不同。 API 设计不会有太大变化,但特定领域将得到改进,但并不总是向后兼容。顺便说一句,7.0 API 可能会在fields_view_get() 的结果中包含额外的数据,以根据用户对该模型的访问权限让客户端知道要显示哪些按钮。你可能想看一下trunk(尚未完成),以防你可以让自己的实现使用相同的命名约定。
  • 是的,fields_view_get on_loaded,这就是我要插入的地方。
【解决方案2】:

还有另一种方法可以代替入侵网络客户端。 对于同一个对象,您始终可以有 2 个视图。

  1. 对于经理组。

  2. 超级经理组。

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

或您需要的任何条件。

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

【讨论】:

    【解决方案3】:

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

    这些是使用的记录规则::

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

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

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

    【讨论】:

      【解决方案4】:

      我有类似的要求... 我的要求是,如果用户属于“销售用户”组,则在 sale.order 中只读一个字符字段(比如“test_123”),否则对于“销售经理”组是可编辑的。 也就是说,如果销售订单处于草稿状态,那么任何人都可以编辑,但如果销售订单被确认,那么这个字段“test_123”只能对“销售经理”进行编辑

      我所做的是添加了一个功能字段 (is_group_manager),如果用户属于“销售经理”组并且状态不是“草稿”,则返回 True,否则返回 false。 然后在 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。也许这对你有帮助。 :)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-04-01
        • 1970-01-01
        相关资源
        最近更新 更多