Ordenamiento de una vista en odoo

Ordenamiento de una vista en odoo

Ordenamiento por defecto y ordenamiento dinámico

·

5 min read

Un poco de contexto

Recientemente me encontré en una situación de esas en las que tienes que realizar una implementación "sencilla" pero que resulta ser mas complicada de lo que parecía. Pero en fin, después de algunas horas de investigación pude resolverlo.

El problema a resolver era el siguiente: Se tenia una vista en odoo la cual no estaba ordenada por algún campo en especifico; los registros se mostraban tal cual se encontraban en la base de datos y se tenía que ordenar dicha vista por la fecha de creación de manera descendente, es decir la fecha mas actual al principio. Pero lo divertido era que dependiendo el grupo (perfil) del usuario, se tenían que mostrar columnas dinámicamente y el orden debería cambiar dependiendo el grupo y su campo correspondiente.

Como resultado de mi investigación encontré dos manera para realizar el ordenamiento por defecto de la vista, y también pude ordenar la vista de manera dinámica. Pon atención porque estoy a punto de revelarte tan valiosa información en las siguientes secciones.

Ordenamiento por defecto

Existen dos formas de asignar el orden de una vista, uno es directamente en el xml del módulo y otra es en el modelo (archivo de python), a continuación explicaré cada uno de ellos:

  • Desde el xml solo es necesario agregar el atributo default_order="create_date desc" en la definición del tree view. El texto "create_date" es el campo por el que se quiere ordenar la vista y aqui puede ir el campo que se desee siempre y cuando exista en la definición de las columnas. También para que los ordene de manera ascendente en lugar de poner "desc" se tendría que poner "asc". De esta manera siempre que se ingrese a la vista del módulo los registros estarán ordenados por el campo especificado.

carbon (1).png

  • La otra forma es desde el modelo (archivo models.py), y aquí solo es necesario agregar al modelo la variable o atributo _order = "create_date desc", de esta manera la vista relacionada al modelo siempre se va a mostrar ordenada por el campo especificado. Un punto importante es que cuando se realiza el ordenamiento de esta manera en el archivo .xml no debería existir el atributo default_order="create_date desc".

carbon (2).png

Ordenamiento dinámico

Cuando hablo de un ordenamiento dinámico de una vista me refiero a que dependiendo del perfil o grupo al que pertenece el usuario logueado el treeview se pueda ordenar por distintos campos y también que se muestren columnas que solo apliquen para este grupo y también a los diferentes grupos a los que se quiera aplicar la misma regla.

Lo primero que se debe realizar es una herencia de la vista (treeview). Si nunca has implementado una herencia de este tipo enseguida explicaré los atributos que lleva, además es importante saber que este código debe ir casi al final de tu xml justo antes de la definición de los items del menú.

carbon (3).png

Atributos de la herencia de la vista (solo menciono los que pueden cambiar)

  • id: Nombre con el que identificarás tu herencia
  • name: Nombre que le quieras asignar a tu herencia
  • model: Este es importante porque es el modelo de tu vista (la vista que estas heredando, en donde definiste las columnas de tu treeview). En otras palabras el nombre de tu tabla que definiste en la clase de tu models.py
  • inherit_id: Aquí debes colocar el id de la vista que estas heredando, si, el id de ese bloque de código en el que definiste las columnas que tendría tu vista.
  • groups_id: En este atributo se especifican los grupos a los cuales aplicará esta herencia, me refiero a esos grupos que definiste en tu archivo xml de la carpeta security. Se puede definir mas de un grupo solo debe ir separado por una coma. Ejemplo: eval="[(6, 0, [ref('presupuesto_peliculas.grupo1,presupuesto_peliculas.grupo2')])]" y sin espacios entre las comas.
  • default_order: Aquí es en donde se especifica el campo por el cual se ordenará la vista.
  • expr: Este atributo sirve para identificar la columna que servirá como referencia para agregar las nuevas columnas, es por eso que en el atributo position="after" se indica "after", es decir que la columna la agregará después del campo especificado en el atribut "expr". Es importante recordar que al hacer esta herencia el ordenamiento y las columnas que se agreguen solo aplicará para los usuarios que pertenezcan al grupo especificado.

En el siguiente code snippet se esta agregando una columna para el grupo 1 y una columna diferente para el grupo 2, también el ordenamiento de la vista es diferente en cada herencia. Cabe mencionar que las columnas de la vista original seguirán en el grid.

<record model="ir.ui.view" id="presupuesto_peliculas_grupo1_tree_inherit">
   <field name="name">Presupuesto películas</field>
   <field name="model">presupuesto_peliculas</field>
   <field name="type">tree</field>
   <field name="inherit_id" ref="presupuesto_peliculas_tree"/>
   <field name="groups_id" eval="[(6, 0, [ref('presupuesto_peliculas.grupo1')])]"/>
   <field name="arch" type="xml">            
      <xpath expr="/tree" position="attributes">
         <attribute name="default_order">campo_orden desc</attribute>
      </xpath>
      <xpath expr="/tree/field[@name='campo_columna_grid']" position="after">
         <field name="campo_nuevo_grid" />
      </xpath>            
   </field>
</record>

<record model="ir.ui.view" id="presupuesto_peliculas_grupo2_tree_inherit">
   <field name="name">Presupuesto películas</field>
   <field name="model">presupuesto_peliculas</field>
   <field name="type">tree</field>
   <field name="inherit_id" ref="presupuesto_peliculas_tree"/>
   <field name="groups_id" eval="[(6, 0,[ref('presupuesto_peliculas.grupo2')])]"/>
   <field name="arch" type="xml">            
      <xpath expr="/tree" position="attributes">
         <attribute name="default_order">campo_orden2 desc</attribute>
      </xpath>
      <xpath expr="/tree/field[@name='campo_columna_grid']" position="after">
         <field name="campo_nuevo2_grid" />
      </xpath>            
   </field>
</record>

Conclusión

Bueno pues así fue como pude ordenar una vista y también agregar columnas para ciertos grupos de usuarios. La herencia de la vista es una practica muy útil a la hora de agregar nuevas columnas y cambiar el ordenamiento de las vistas, pero también se usa para otros propósitos, por ejemplo para ocultar y mostrar campos del formulario o incluso hacer readonly o editables campos de la forma, obviamente para cuando se están usando grupos de usuarios. Espero que sea de utilidad este pequeño tutorial para alguien allá afuera y si no pues para mi yo del futuro.