谁能解释我在Odoo中的规则行为?

时间:2018-02-27 16:27:13

标签: xml security odoo-8 odoo rules

我一如既往地坚持规则,因为我还无法理解它们。

这就是我们所说的:

  

规则之间的互动

     

全局规则(非特定于组)是限制,不可以   绕过。组本地规则授予其他权限,但是   限制在全球范围内。第一组规则   限制比全局规则更多,但任何其他组规则都将   添加更多权限。

     

详细算法:   1.全局规则与逻辑AND运算符组合在一起,并结合以下步骤   2.特定于组的规则与逻辑OR运算符组合在一起   3.如果用户属于多个组,则步骤2中的结果将与逻辑OR运算符

组合      

示例:GLOBAL_RULE_1 AND GLOBAL_RULE_2 AND((GROUP_A_RULE_1或   GROUP_A_RULE_2)或(GROUP_B_RULE_1或GROUP_B_RULE_2))

但是我总是遇到规则问题,上面的文字不适合我(除非我误解了什么)。

现在我遇到了这样一个简单的情况:我有一个模型,其记录可以被任何用户读取,但只能由与该记录属于同一公司的用户创建,编辑和删除。

所以我需要一个全球规则(它将适用于所有人,而不仅仅是一个群体。)

<record model="ir.rule" id="my_custom_rule_a">
    <field name="name">My custom rule A</field>
    <field name="model_id" ref="my_module.model_my_model"/>
    <field name="domain_force">[('company_id', '=', user.company_id.id)]</field>
    <field name="perm_read" eval="True"/>
    <field name="perm_write" eval="True"/>
    <field name="perm_create" eval="True"/>
    <field name="perm_unlink" eval="True"/>
</record>

如果我只创建此规则,那么与记录属于同一公司的用户可以读取,创建,编辑和删除它,这没关系,但如果用户不属于与记录相同的公司,他们甚至无法阅读记录。

因此,让我们添加另一条规则,让他们读取属于其他公司的记录:

<record model="ir.rule" id="my_custom_rule_b">
    <field name="name">My custom rule B</field>
    <field name="model_id" ref="my_module.model_my_model"/>
    <field name="domain_force">[('company_id', '!=', user.company_id.id)]</field>
    <field name="perm_read" eval="True"/>
    <field name="perm_write" eval="False"/>
    <field name="perm_create" eval="False"/>
    <field name="perm_unlink" eval="False"/>
</record>

当我添加此规则时,没有人甚至无法读取任何记录,如果用户属于该记录的同一公司,则无关紧要......所以我以这种方式修改了第二条规则:< / p>

<record model="ir.rule" id="my_custom_rule_b">
    <field name="name">My custom rule B</field>
    <field name="model_id" ref="my_module.model_my_model"/>
    <field name="domain_force">['|', ('company_id', '=', user.company_id.id), ('company_id', '!=', user.company_id.id)]</field>
    <field name="perm_read" eval="True"/>
    <field name="perm_write" eval="False"/>
    <field name="perm_create" eval="False"/>
    <field name="perm_unlink" eval="False"/>
</record>

但现在的行为与我只添加了第一条规则完全相同:属于同一公司的用户可以对记录做任何事情而不属于同一公司的用户甚至不能阅读记录。

有人可以帮帮我吗?我对规则有更大的问题,所以开始理解这个小问题以面对其他问题会很棒。

1 个答案:

答案 0 :(得分:2)

全局规则始终与AND一致,您可以在问题中复制的文档中阅读。将根据这些规则检查每条记录。

因此,您的第一次尝试是互斥的,因此没有找到记录。 您第二次尝试的结果也是正确的,因为只有用户公司的记录才满足这两个记录规则。

要获得所需的结果,您需要做什么:您必须使用非全局记录规则。

一个非常简单的例子:

模型-> my.model

组雇员的

模型访问权限(ir.model.access)(Odoo中的默认用户组,但是您可以创建自己的用户组)-> CRUD 1111(每个记录的每个人的所有权限都将受到记录规则的影响) )

现在您也需要为员工组设置两个记录规则:

A ,域为[('company_id', '=', user.company_id.id)]和CRUD 1111(用户公司记录上的所有权利)

B ,域为[(1, '=', 1)]和CRUD 0100(每条记录的读取权限)

就是这样。附带说明:客户端在这种情况下的表现很差。公司B的用户将看到公司A的记录(根据需要),起初用户似乎可以对其进行更改,因为显示了编辑按钮且该按钮“可运行”,但是在保存时,将弹出访问权限警告。