如何理解Odoo中规则的行为?

问题描述 投票:0回答:1

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

这就是我们所说的:

规则之间的交互

全局规则(非特定群体)是限制,不能 绕过了。组本地规则授予额外的权限,但 被限制在全球范围内。第一组规则 限制比全局规则更进一步,但任何附加的组规则都会 添加更多权限。

详细算法:

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

示例:GLOBAL_RULE_1 AND GLOBAL_RULE_2 AND ((GROUP_A_RULE_1 OR 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>

当我添加这条规则时,没有人甚至无法读取任何记录,无论用户是否属于该记录的同一家公司都没关系...所以我这样修改了第二条规则:

<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>

但是现在的行为与我只添加了第一条规则完全相同:属于同一公司的用户可以对记录执行任何操作,而不属于同一公司的用户甚至无法读取记录记录一下。

我在规则方面遇到了更大的问题,所以开始理解这个小问题以面对其他问题会很棒。

xml security odoo-8 odoo rules
1个回答
2
投票

全局规则始终是 AND,正如您在问题中复制的文档中所读到的那样。每条记录都将根据这些规则进行检查。

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

你必须做什么才能得到你想要的结果:你必须使用非全局记录规则。

一个非常简单的例子:

模型 -> my.model

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

现在您还需要两个针对员工组的记录规则:

A,具有域

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

B,域为

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

其实就是这样。旁注:在这种情况下,客户的行为非常糟糕。 B 公司的用户将看到 A 公司的记录(根据需要),起初用户似乎可以更改它们,因为显示了编辑按钮并且“起作用”,但在保存时会弹出访问权限警告。

© www.soinside.com 2019 - 2024. All rights reserved.