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

Permissions 基于工作流状态的不同权限,permissions,workflow,openerp,Permissions,Workflow,Openerp,我需要根据对象的工作流状态对其设置不同的权限。例如,仅当state=draft时,“经理组”可以编辑对象,但如果state=validated,“超级经理组”也可以编辑对象 似乎使用ir.model.access是不可能的,我正在评估是否可以使用ir.rule来完成。似乎不是 是否有一种官方方法来实现此功能,或者我是否需要实现此功能(可能通过向ir.model.access机制中添加一个条件)。对于ir.model.access,默认情况下这是不可能的,因为此权限模型的作用类似于对CRUD操作的

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

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


是否有一种
官方
方法来实现此功能,或者我是否需要实现此功能(可能通过向ir.model.access机制中添加一个条件)。

对于
ir.model.access
,默认情况下这是不可能的,因为此权限模型的作用类似于对CRUD操作的简单Unix权限,它是静态定义的,每个模型和每个组

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

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


最终,您可能需要更轻松地实现自己的逻辑,在ORM基本API方法中插入新机制:
fields\u view\u get
(用于根据用户组使字段动态只读)和CRUD方法(用于实际限制操作)

有另一种方法代替黑客入侵web客户端。 对于同一对象,始终可以有两个视图

  • 对于经理组

  • 超级经理组

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

    或者你需要的任何条件


    同样,在超级经理组中,您可以为字段设置他的条件

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

    以下是使用的记录规则:

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

    在动作的方法中,如果在其他
    写入
    操作后状态发生更改,则用户将能够更改状态;但是,如果在状态更新之后有一些
    写入
    操作,用户将无法更改状态


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

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

    我所做的是添加了一个功能字段(is_group_manager),如果用户属于“sale manager”组,并且状态不是“draft”,否则返回True。 然后在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)]}"/>
    
    
    

    这仅适用于OpenERPv6.0。也许这会对你有所帮助。:)

    是的,这也是我的结论,这就是为什么我说“我正在评估是否可以使用ir.rule来完成。似乎不是…”:)一个可能的解决方案是ir.rule+web客户端黑客攻击来相应地显示编辑/删除/复制按钮,希望你无论如何都不要在v7.0:p上重写这个,tnx为您提供了详尽的答案。7.0中的web客户端API将有相当多的改进,因此根据您扩展的部分,您的里程可能会有所不同。API的设计不会有太大的改变,但特定的领域将以不总是向后兼容的方式得到改进。顺便说一句,7.0 API可能会在
    字段\u view\u get()
    的结果中包含额外的数据,以便根据该模型上的用户访问权限,让客户端知道要显示哪些按钮。您可能希望观察trunk(尚未完成),以防您可以使自己的实现使用相同的命名约定。是的,字段\u视图\u加载,这就是我尝试插入的地方。您希望在您自己的模型或现有模型(如sale.order、purchase.order等)中显示此功能吗??在哪个openerp版本中?