28 lines
2.3 KiB
XML
28 lines
2.3 KiB
XML
<odoo>
|
||
<!--
|
||
Единое GLOBAL-правило видимости директив с диспетчерским bypass.
|
||
|
||
Почему одно global-правило, а не два (диспетчер / остальные):
|
||
в Odoo global-правила комбинируются по AND, а group-правила — по OR
|
||
и только РАСШИРЯЮТ доступ в пределах global. Поэтому global `own` НЕЛЬЗЯ
|
||
расширить group-правилом `all` для диспетчера (получилось бы own AND all = own).
|
||
Единственная форма, одновременно сохраняющая все три требования —
|
||
(1) диспетчер видит все,
|
||
(2) исполнитель/заявитель/автор видят только свои/ролевые,
|
||
(3) пользователь без ролей директив видит ноль строк (fail-closed),
|
||
— это одно global-правило с тернарным bypass для диспетчера.
|
||
Это осознанный, поведение-сохраняющий выбор (см. design.md §4.2),
|
||
а НЕ незавершённый рефактор «надо бы два правила».
|
||
|
||
Диспетчер (член role_directive_dispatcher_res_groups) -> домен [(1,'=',1)] (все).
|
||
Остальные -> 4 OR-условия через 3 оператора '|' (польская нотация):
|
||
своя как исполнитель / свои созданные / своя роль исполнителя / своя роль заявителя.
|
||
-->
|
||
<record id="rule_directive_base_access" model="ir.rule">
|
||
<field name="name">Directive: visibility (dispatcher sees all, others own/role)</field>
|
||
<field name="model_id" ref="model_directive_directive"/>
|
||
<field name="global" eval="True"/>
|
||
<field name="domain_force">[(1, '=', 1)] if user.has_group('directive_layer.role_directive_dispatcher_res_groups') else ['|', '|', '|', ('executor_user_id', '=', user.id), ('create_uid', '=', user.id), ('executor_role_id', 'in', user.role_ids.ids), ('requester_role_id', 'in', user.role_ids.ids)]</field>
|
||
</record>
|
||
</odoo>
|