Porque es importante saber xpath

16 de junio de 2023 por
Gustavo Orrillo
| Sin comentarios aún
 

Una de las tareas recurrentes en el desarrollo de Odoo es extender las vistas existentes (sobre todo los formularios) para agregar nuevos campos, modificar los atributos de los existentes o agregar botones (para dar algunos ejemplos). Tambien se suele modificar reportes ya existentes para agregar información a los mismos, o modificar su formato.

Dado que las vistas y reportes son esencialmente documentos HTML, por lo general para modificar dichos se extienden esas vistas. Y luego en la nueva vista se suele localizar el nodo que necesita ser modificado para luego reemplazarlo con nuevo contenido, agregarle atributos o agregar nuevos nodos en esa posición. 

Esa es la lógica que existe detras de cada modificación a una vista. Se extiende la vista existente y se le agregan, remueven o modifican nodos existentes. Nodos que luego se renderizan en reportes, vistas tree o formularios.

Por ejemplo, supongamos que tenemos un clásico formulario de transacciones que tiene la siguiente estructura

<form>
​<sheet>
​<group>
​<field name="number" />
​<field name="date" />
​<notebook>
​<page string="Lineas">
​<field name="order_line">
​<tree>
​<field name="product_id" />
​<field name="qty" />
​</tree>
​<form>
​<group>
​<field name="product_id" />
​<field name="qty" />
​​ ​</group>
​</form>
​</field>
​</page>
​</notebook>
​</group>
​</sheet>
</form

Este documento xml presenta la estructura habitual de las transacciones en Odoo, donde tenemos una cabecera y un conjunto de líneas. Modificar dicho documento en una vista heredada es bastante directo en un principio. Primero creamos una nueva vista extendiendo la vista existente. Y luego hacemos las modificaciones a los nodos. Supongamos que queremos hacer el campo date readonly, podemos hacer lo siguiente

<field name="date" position="attributes">
​<attribute name="readonly">1</attribute>
</field>

Entonces cuando se renderiza el documento XML final, obtenemos lo siguiente

<field name="date" readonly="1" />

O si queremos agregar un nuevo campo llamado code, solo tenemos que hacer

<field name="date" position="after">
​<field name="code" />
</field>

Notemos que tenemos el atributo position, el cual indica la ubicación del nuevo nodo en relación al nodo que estamos modificando. Puede tener al menos los siguientes valores (son los que más uso)

  • before: el nuevo nodo va a aparecer antes del nodo con el que estamos trabajando
  • after: el nuevo nodo aparecerá despues del nodo con el que estamos trabajando
  • replace: reemplazará el nodo ya existente (el nodo entero, no sus nodos hijos)
  • attributes: permite agregar atributos al nodo existente
  • inside: agrega nodos dentro del nodo con el que estamos trabajando

Ahora esto es muy lindo, pero tiene sus limitaciones. Por ejemplo que sucede si queremos agregar nodos (por ejemplo un botón) al header de un formulario? O agregar un tab al notebook? O queremos agregar un campo en la vista tree dentro de un campo many2one (y no dentro del formulario). Para ello tenemos el xpath.

Que es xpath?

xpath es una herramienta que permite navegar los diferentes nodos y atributos en un documento xml. XPath utiliza expresiones similares a las utilizadas para navegar un filesystem, con el fin de seleccionar nodos o conjuntos de nodos en un documento XML (en este caso una vista de Odoo).

Me atrevería a decir que xpath es un conocimiento mandatorio para cualquier desarrollador de Odoo, por el grado de flexibilidad que brinda para modificar reportes y vistas (sobre todo las vistas de formulario, las vistas tree son bastante sencillas de modificar).

Ahora, vamos a los ejemplos. Supongamos que queremos agregar un nuevo tab al notebook de la vista que mostramos líneas arriba. En dicho caso utilizaremos una expresión xpath como la siguiente:

<xpath expr="//notebook" position="inside">
​<page string="Comments">
​<group>
​<field name="comments" />
​</group>
​</page>
</xpath>

O supongamos que queremos agregar un header con un boton. Solo tenemos que agregar un nodo header antes del nodo sheet

<xpath expr="//sheet" position="before">
​<header>
​<button name="btn_confirm" string="Confirmar" type="object" />
​</header>
</xpath>

O (algo bastante común) queremos agregar dos campos (price_unit y total_amount) dentro de la vista tree que muestra un campo many2one en un formulario. Debemos mostrar el camino de como se navega a dicho campo

<xpath expr="//field[@name='order_line']/tree/field[@name='qty']" position="after">
​<field name="price_unit" />
​<field name="total_amount" />
</xpath>

Como podrán ver, aca navegamos primero al campo order_line dentro del documento, y luego al documento tree para luego pasar al campo qty. No se modifica el form contenido dentro del campo order_line. 

Mi recomendación con xpath, es que lo practiquen y lo aprendan rápido. No solo es muy util para la modificación de las vistas tipo formulario sino es la única opción viable para modificar los reportes q-web que se imprimen.


Gustavo Orrillo 16 de junio de 2023
Compartir
Archivar
Identificarse dejar un comentario