En esta ocasión voy a mostrarte cómo ordenar las líneas de un registro (One2many), utilizando el widget section_and_note_one2many, al estilo de las facturas, órdenes de venta y órdenes de compra de Odoo.
Para ello usaremos el campo display_type, que nos permita identificar cuándo se trata de un registro nuevo, de una sección o de una nota. En los siguientes fragmentos de código podrás encontrar la forma de hacerlo.
En el modelo:
class MyModel(models.Model):
_name = "my.model"
_description = "My model example"
name = fields.Char('Name')
description = fields.Text('Desc')
line_ids = fields.One2many('my.model.line', 'my_id', 'Lines')
class MyModelLine(models.Model):
_name = "my.model.line"
_description = "My model line example"
name = fields.Char('Name')
amount = fields.Float('Amount')
description = fields.Text('Desc')
display_type = fields.Selection([
('line_section', "Section"),
('line_note', "Note")], default=False, help="Technical field for UX purpose.")
my_id = fields.Many2one('my.model', 'Lines Model')
sequence = fields.Integer()
En la definición de tu vista:
<record id="mymodel_report_form_view" model="ir.ui.view">
<field name="name">My Model view form</field>
<field name="model">my.model</field>
<field name="type">form</field>
<field name="arch" type="xml">
<form>
<sheet name="My model">
<group colspan="4">
<group col="4">
<field name="name"/>
</group>
</group>
<notebook>
<page string="Lines">
<field name="line_ids" widget="section_and_note_one2many"
mode="tree" context="{'default_my_id': active_id}">
<tree string="Example Lines" editable="bottom">
<control>
<create name="add_line_control" string="Add a record"/>
<create name="add_section_control" string="Add a section"
context="{'default_display_type': 'line_section'}"/>
<create name="add_note_control" string="Add a note"
context="{'default_display_type': 'line_note'}"/>
</control>
<field name="sequence" widget="handle"/>
<field name="name" widget="section_and_note_text"/>
<field name="display_type" force_save="1" invisible="1"/>
<field name="amount"/>
<field name="description"/>
</tree>
</field>
</page>
<page string="Description">
<field name="description"/>
</page>
</notebook>
</sheet>
</form>
</field>
</record>
Como resultado, Odoo te mostrará tres enlaces debajo del listado: Add a record, Add a section y Add a note. Por supuesto tanto el orden como las etiquetas podrás personalizarlas a tu gusto dentro de la sección <control>...</control> de la vista del ejemplo anterior.
Al presionar en el enlace Add a record, podrás añadir nuevos registros o líneas.
Al presionar sobre el enlace Add a section, estarás adicionando Secciones nuevas a tu listado de líneas, pues a través del context, estás especificando que la variable display_type tiene valor line_section .
Al presionar sobre el enlace Add a note, estarás añadiendo Notas nuevas a tu listado de líneas, de igual forma a través del context, estás especificando que la variable display_type tiene valor line_note .
El resultado será una vista Listado con sus registros divididos en secciones y con sus respectivas notas. Convenientemente también hemos adicionado un campo Sequence:
<field name="sequence" widget="handle"/>
De esta forma será más fácil mover líneas entre secciones y ordenar mejor nuestros registros.
Como puedes ver, tiene su truco ... pero el resultado es muy práctico.