Odoo 为同一字段添加具有不同条件的多个组

Odoo Add Multiple Group With Different Condition For the Same Field

祝你们一切顺利,gday。

所以我从stock.picking模型继承了一个叫date_done的字段,默认有readonly:true属性。我在下面的代码中为所有 Odoo 用户将其撤销为 readonly but not in 'assigned' status

<field name="date_done" groups="base.group_user" position="attributes" >
    <attribute name="attrs">{'readonly':[('state','not in',('assigned'))],'invisible':['|',('state','not in',('assigned','done'))]}</attribute>
</field>

然后,我想添加一个名为 change_date_group_privilege 的组,稍后将具有 readonly but not in 'assigned' + 'done' status 个属性。

最后,我希望 base.group_user 只能在状态 is not in assigned 时更改字段,而 change_date_group_privilege 将在状态 [=20] 时更改字段=].

我不能简单地将change_date_group_privilege添加到groups="base.group_user"中,因为我还需要在readonly':[('state','not in',('assigned'))]中添加'done'状态,稍后也会给出base.group_user我不想要的特权。

如何在此 XML 代码块中添加条件?如果还有其他方法,我很乐意通过它。

感谢您的帮助。

假设:

  • 您有两个级别的访问组
  • 一个普通组(通常是 base.group_user“内部用户”)
  • 和一个 ID 为 my_module.group_change_date_when_done
  • 的特殊组“完成后更改选择日期”

所以正常的 Picking 视图看起来像这样(简短的例子!)

<record id="default_view" model="ir.ui.view">
    <field name="name">default example view</field>
    <field name="model">stock.picking</field>
    <field name="arch" type="xml">
        <form>
            <field name="date_done" readonly="1" />
            <field name="state" />
        </form>
    </field>
</record>

现在要求普通用户可以在状态不是 assigned 时更改 date_done 字段。因此,您可以扩展和更改每个普通用户的视图(视图中不需要组)。

<record id="default_view_extension_level1" model="ir.ui.view">
    <field name="name">default example view</field>
    <field name="model">stock.picking</field>
    <field name="inherit_id" ref="default_view" />
    <field name="arch" type="xml">
        <field name="date_done" position="attributes">
            <attribute name="readonly" />
            <attribute name="attrs">{'readonly':[('state','not in',('assigned'))]</attribute>
        </field>
    </field>
</record>

现在您可以在上面设置视图,只需将特殊组添加到它即可。这将导致该特殊视图仅供该特殊组中的用户使用。

<record id="default_view_extension_level2" model="ir.ui.view">
    <field name="name">default example view</field>
    <field name="model">stock.picking</field>
    <field name="inherit_id" ref="default_view_extension_level1" />
    <field name="groups_id" eval="[(4, ref('my_module.group_change_date_when_done'))]"/>
    <field name="arch" type="xml">
        <field name="date_done" position="replace">
            <field name="date_done" attrs="{'readonly':[('state','not in',('done', 'assigned'))]" />
        </field>
    </field>
</record>

最终普通用户会加载前两个视图,特殊用户也会加载第三个视图,这将导致他们在完成状态下更改完成日期。

请记住:该代码只是示例代码,用于显示扩展原理和在视图上使用组。不能保证有效!

您可以在表单视图中多次使用一个字段,并使用 groups 属性分别为内部用户和特权用户定义属性。

检查 Semantic components 的表单视图文档:

renders (and allow editing of, possibly) a single field of the current record. Using
several times a field in a form view is supported and the fields can receive different
values for modifiers ‘invisible’ and ‘readonly’. However, the behavior is not
guaranteed when several fields exist with different values for modifier ‘required’.

如果用户不属于该组,您可以在组之前加上 ! 以使组件不可见。

示例:

<field name="date_done" position="replace">
    <label for="date_done"/>
    <div>
        <div groups="!MODULE_NAME.change_date_group_privilege">
            <field name="date_done" 
                   attrs="{'readonly':[('state','not in',('assigned'))]}"/>
        </div>
        <div groups="MODULE_NAME.change_date_group_privilege">
            <field name="date_done" 
                   attrs="{'readonly':[('state','not in',('assigned', 'done'))]}"/>
        </div>
    </div>
</field>

注意在字段标签上使用groups属性时Odoo会使用最后一个字段的值

以下域(用于 attrs 域):

['|',('state','not in',('assigned','done'))]  

是错误的,因为 | 的元数为 2(需要两个标准)