Наследование значения из формы в wizard Odoo и работа с context

Недавно возникла необходимость пробрость значение из формы во всплывающее окно в Odoo. Как всегда это делалось с помощью небольшой магии и поэтому решил это записать.

Создаем виджет

Для демонстрации я создам простой виджет с 2 полями.

demo_widget.py

from odoo import models, fields, api

class DemoWizard(models.TransientModel):
    _name = 'demo.wizard'

    item_id = fields.Many2one("item", "Код записи")
    start_date = fields.Datetime("Дата")

demo_widget.xml

<odoo>
    <data>
        <record model="ir.ui.view" id="wizard_form_view">
            <field name="name">demo.wizard.form</field>
            <field name="model">demo.wizard</field>
            <field name="arch" type="xml">
                <form string="Form">
                    <group>
                        <field name="item_id"/>
                        <field name="start_date"/>
                    </group>
                    <footer>
                        <button special="cancel" string="Отмена"/>
                    </footer>
                </form>
            </field>
        </record>

        <record model="ir.actions.act_window" id="wizard_action_window">
            <field name="name">demo</field>
            <field name="res_model">demo.wizard</field>
            <field name="target">new</field>
            <field name="view_mode">form</field>
        </record>
    </data>
</odoo>

Создаем родительскую форму

Создаем демо модель:

demo_model.py

from odoo import models, fields, api

class DemoModel(models.Model):
    _name = 'demo.model'

    name = fields.Char("Название")

demo_model.xml

<odoo>
    <data>
        <record model="ir.ui.view" id="demo_model_form_view">
            <field name="name">demo.model.form</field>
            <field name="model">demo.model</field>
            <field name="arch" type="xml">
                <form string="Form">
                    <footer>
                        <button name="%(wizard_action_window)d" string="Привязать" type="action" class="oe_highlight" />
                    </footer>
                    <group>
                        <field name="name"/>
                    </group>
                </form>
            </field>
        </record>
</odoo>

Работа с контекстом

Для взаимодействия между представлениями в Odoo используется атрибут context. С помощью него можно задавать переменные которые будут видны в дочерних элементах, например:

<field name="item_ids" context="{'state_ctx':state}">
 <tree>
  <field name="state" domain="[('state', '=', state_ctx)]/>
  <field name="child_table_field1"/>
 </tree>
</field> 

В пример выше мы передали значения поле state из родительской модели в переменную state_ctx, которая используется для фильтрации внутри дочерней модели.

Также в оду есть конвенция что если имя имеет вид с default_<field_name>, то это значение передается полю <field_name> как занчение по умолчанию.

Соответственно если у элемента кнопки заменить:

...
<button name="%(wizard_action_window)d" string="Привязать" type="action" class="oe_highlight" />
...

на

...
<button name="%(wizard_action_window)d" string="Привязать" type="action" class="oe_highlight" context="{'default_item_id':id}" />
...

То в открывшемся виджете в поле item_id будет отображен элемент c id родительского.

Заключение

Данное небольшое описание описание еще чуть чуть расширяет представление о возможностях расширения функциональности Odoo через декларативное описание.

 
comments powered by Disqus