Breba
Breba

Reputation: 173

Odoo - Multi level inheritance in views

I'm trying to have views with multi level inheritance, but fields from the children are not shown in the view. I'm currently working in Odoo 11, community version.

Please see details below:

Trying to have some base models for future wizards. This is how the models are defined (using always inherit = <base_model> for inheritance between models):

Model definition

Since I want to define views only once, I created a form view for every model, following the same approach: inheriting always from "above". Below is the definition for the (very first) base view, model handleprocess.quick.action:

<record model="ir.ui.view" id="handleprocess_qact_abstract_wz_form_view">
        <field name="name">handleprocess_qact_abstract_wz.form</field>
        <field name="model">handleprocess.quick.action</field>
        <field name="arch" type="xml">
            <form string="Quick Action">
                <group class="bg-info" col="4" id="security_check_group">
                    <h6 colspan="4" style="color: red">Are you sure you want to execute this Quick Action?</h6>
                    <h6 colspan="4">Check to confirm you know what you are doing: <field name="security_check" nolabel="1" /></h6>
                </group>
                <group id="basic_fields">
                    <field name="environment" />
                    <field name="data_center" attrs="{'invisible': [('environment', '!=', 'prod')], 'required': [('environment', '=', 'prod')]}" />
                </group>
                <footer class="pull-right">
                    <button name="execute_qact" type="object" string="Execute" class="oe_highlight" attrs="{'invisible': [('security_check', '=', False)]}" />
                    <button special="cancel" string="Cancel" />
                </footer>
            </form>
        </field>
    </record>

Then, each one of the next 3 views inherits from "above" using xpath and adding its own fields.

This is the second view, model handleprocess.quick.action.update.file:

<record model="ir.ui.view" id="handleprocess_qact_abstract_wz_form_view">
        <field name="name">handleprocess_qact_abstract_wz.form</field>
        <field name="model">handleprocess.quick.action</field>
        <field name="arch" type="xml">
            <form string="Quick Action">
                <group class="bg-info" col="4" id="security_check_group">
                    <h6 colspan="4" style="color: red">Are you sure you want to execute this Quick Action?</h6>
                    <h6 colspan="4">Check to confirm you know what you are doing: <field name="security_check" nolabel="1" /></h6>
                </group>
                <group id="basic_fields">
                    <field name="environment" />
                    <field name="data_center" attrs="{'invisible': [('environment', '!=', 'prod')], 'required': [('environment', '=', 'prod')]}" />
                </group>
                <footer class="pull-right">
                    <button name="execute_qact" type="object" string="Execute" class="oe_highlight" attrs="{'invisible': [('security_check', '=', False)]}" />
                    <button special="cancel" string="Cancel" />
                </footer>
            </form>
        </field>
    </record>

If I show the form view for that model at this point, all fields are shown correctly. Fields disappear after the second level inheritance, i.e. after I define this view (for model handleprocess.quick.action.update.file.intergate):

<record model="ir.ui.view" id="handleprocess_qact_abstract_ig_wz_form_view">
        <field name="name">handleprocess_qact_abstract_ig_wz.form</field>
        <field name="model">handleprocess.quick.action.update.file.intergate</field>
        <field name="inherit_id" ref="handleprocess.handleprocess_qact_update_file_wz_form_view"/>
        <field name="arch" type="xml">
            <data>
                <xpath expr="//field[@name='create_backup']" position="before">
                    <field name="carrier_id" options="{'no_create': True}" />
                </xpath>
            </data>
        </field>
    </record>

And below the wizard's form view, with same issue: no fields are shown.

<record model="ir.ui.view" id="handleprocess_qact_ig_template_wz_form_view">
        <field name="name">handleprocess_qact_ig_template_wz.form</field>
        <field name="model">handleprocess.qact.ig.template.wz</field>
        <field name="inherit_id" ref="handleprocess_qact_abstract_ig_wz_form_view"/>
        <field name="priority">70</field>
        <field name="arch" type="xml">
            <xpath expr="//group[@id='security_check_group']/h6" position="before">
                <div>This Quick Action updates the template files in carrier boxes, in the environment specified below.</div>
            </xpath>
            <xpath expr="//field[@name='carrier_id']" position="after">
                <field name="template_file_id" options="{'no_create': True}" />
            </xpath>
        </field>
    </record>

Please note I'm using different models because I need to separate them according to the fields, since some other wizards are planned to be created in the future, and not all fields are the same for the other wizards (above wizard definition is just the first one, more should be coming).

The action for opening the wizard (TransientModel) is defined like this, calling directly to he wizard model's form view:

<record model="ir.actions.act_window" id="handleprocess_qact_ig_template_wz_action">
        <field name="name">Update Template</field>
        <field name="type">ir.actions.act_window</field>
        <field name="res_model">handleprocess.qact.ig.template.wz</field>
        <field name="view_mode">form</field>
        <field name="view_id" ref="handleprocess.handleprocess_qact_ig_template_wz_form_view" />
        <field name="target">new</field>
    </record>

Am I missing something in the views definition?

Thanks in advance.

Upvotes: 1

Views: 762

Answers (1)

Kenly
Kenly

Reputation: 26748

The mode of the derived view needs to be set to primary, because it’s the base (and maybe only) view for that derived model. Otherwise, the view matching rules won’t apply.

From views Common Structure:

mode

inheritance mode, see Inheritance. If inherit_id is unset the mode can only be primary. If inherit_id is set, extension by default but can be explicitly set to primary.

An example of where you would want to do that is delegation inheritance. In that case, your derived model will be separate from its parent, and views matching with one won’t match with the other. Suppose you inherit from a view associated with the parent model and want to customize the derived view to show data from the derived model. The mode of the derived view needs to be set to primary because it’s the base (and maybe only) view for that derived model. Otherwise, the view matching rules won’t apply.

Upvotes: 0

Related Questions