Cómo añadir secciones y notas en las líneas de un modelo
Widget section_and_note_one2many
5 octubre, 2021 por
Cómo añadir secciones y notas en las líneas de un modelo
Yen Martínez
| Sin comentarios

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.

Teniendo en cuenta que las notas y secciones también son registros (marcados como Notas o Secciones) es posible que si tienes campos en tu listado con atributos especiales (tal vez algunos campos requeridos, por ejemplo) tengas que especificar que sean requeridos si display_type es False (este valor es el que marca el registro con datos).

Como puedes ver, tiene su truco ... pero el resultado es muy práctico.
Espero te sirva este tip.


Cómo añadir secciones y notas en las líneas de un modelo
Yen Martínez
5 octubre, 2021
Share this post
Archivar
Registrarse to leave a comment