Crear nuevos Filtros y Agrupaciones en Odoo v8.0

Una de las claves para un uso ágil del ERP, es encontrar la información relevante en el mínimo número de pasos posibles. Para ello en Odoo contamos con un cuadro de mandos de filtros y agrupaciones que nos permite discriminar rápidamente los registros a mostrar en pantalla.

Odoo nos proporciona en cada modelo (clientes, productos, facturas, etc…) unos filtros por defecto, los más generalmente utilizados, pero es habitual que cada organización necesite algunos otros que no están incluidos en el ERP.

Los filtros y agrupaciones en Odoo se definen en una vista xml de tipo search. Que son las que Odoo carga en las vistas multiregistro (lista, kanban…) del modelo al que se refiere la vista. Si creamos una vista search sobre un modelo nuevo crearemos un vista desde 0, pero si, como es muy habitual, queremos añadir filtros o agrupaciones a un modelo que ya existe, debemos heredar y ampliar la vista a través xpath.

Podemos coger como referencia la vista search creada para presupuestos/pedidos (sale.order) que podemos ver en el módulo de ventas de Odoo.

 

Como se puede observar en el código, la definición de los filtros se hace con los típicos campos de una vista normal, utilizando la etiqueta <search> para encerrar todos los campos por lo que podremos filtrar. Dentro de esta etiqueta, podremos usar:

a) campos <field>, para hacer búsquedas por texto (cuando empiezas a escribir aparecerán estos campos para seleccionar)

<field name="user_id"/>

b) campos <filter>, para el cuadro de mandos. Se activan y desactivan sin posibilidad de usar cadenas de texto (solo consultas de V/F)

<filter string="My" domain="[('user_id','=',uid)]" name="my_sale_orders_filter"/>

c) campos <filter> con parametro context usando group_by. Que se usan para las agrupaciones

<filter string="Salesperson" domain="[]" context="{'group_by':'user_id'}"/>

 

Visto esto, veremos ahora como añadir nuestros filtros personalizados a cualquier modelo.

Los pasos serán:

1.- Localizar el modelo y vista search asociada. Para esto lo más sencillo será activar el modo desarrollador, y situándonos en la vista en la cual queremos  añadir los filtros, seleccionar la opción editar SearchView del desplegable superior. En el formulario que se abre podremos ver el id externo de la vista search que debemos sobrescribir, así como el Objeto (modelo de datos) asociado y la estructura de la vista.

2.- Decidimos dónde queremos colocar nuestros nuevos filtros. Podríamos hacerlo directamente desde aquí,  y sería funcional, pero con el grave inconveniente de que una actualización de los módulos reiniciaría la vista y perderíamos todos los cambios. Por ello lo recomendable es crear un módulo propio que amplíe la vista search a través de xpath.

3.- Ya con nuestra vista creada podemos meter dentro della todos los filtros y agrupaciones que queramos situándolos mediante xpath en la posición que queramos.

Un pequeño ejemplo en el que metemos un filtro por almacén de tipo texto, y una agrupación por contrato en la vista de ventas:

<record id="view_sale_order_inherit_search" model="ir.ui.view">
	        <field name="model">sale.order</field>
	        <field name="inherit_id" ref="sale.view_sales_order_filter" /> 
	        <field name="arch" type="xml">
                        <xpath expr="//field[@name='user_id']" position="after">
	        		<field name="warehouse_id"/>
	        	</xpath>
	        	<xpath expr="//filter[@string='Order Month']" position="after">
	        		<filter string="Contract" domain="[]" context="{'group_by':'project_id'}"/>
	        	</xpath>
	        </field>	
</record>

Como puedes observar tenemos un xpath para cada elemento que incorporamos, para situarlos donde deseamos (en el caso del almacén justo después del filtro por usuario, y en el caso de la agrupación por contrato justo después de la del Mes de Pedido).

Y para terminar algunos apuntes interesantes para utilizar en los filtros:

1.- Las búsquedas directas (aquellas que se hacen escribiendo un texto en el cuadro de búsqueda y pulsando directamente enter), se hacen sobre el campo name del modelo, pero podemos añadir campos en el dominio de este campo de la vista search, de tal modo que la búsqueda directa se haga utilizando varios campos:

<field name="name" string="Sales Order" filter_domain="['|',('name','ilike',self),('client_order_ref','ilike',self)]"/>

En este ejemplo (vista search de sale.order) podemos observar que la búsqueda directa se hará sobre los campos name (nombre del pedido), y client_order_ref (referencia del cliente). Podríamos sobrescribir este campo (con el position=’attributes’ de xpath) y añadir por ejemplo, el contrato asociado al pedido en el dominio del name:

<xpath expr="//field[@name='name']" position="attributes">
             <attribute name="filter_domain">"['|',('name','ilike',self),('client_order_ref','ilike',self),('project_id','ilike',self)]"</attribute>
</xpath>

2.- Todos los campos filter (utilizados en el cuadro de mandos como botones de activado/desactivado llevan el parámetro domain para establecer la condición de activación:

<filter string="Done" domain="[('state','=','done')]" help="Sales Order done"/>

En este caso podemos ver el filtro “Realizado”, que mostrará aquellos pedidos que tenga el ‘state’ = ‘Done’

3.- Podemos crear filtros y agrupaciones por cualquiera de los campos del modelo, simplemente añadiendolo a la vista searchview.

4.- El parámetro “String” se utiliza para la etiqueta que se mostrará en el filtro, el parámetro “Help” es la ayuda al situar encima el cursor, y también existe entre otros el parámetro groups, que nos permite introducir el id externo del grupo de usuarios con permisos para ver y usar el filtro o la agrupación.

5.- Para hacer búsquedas o agrupaciones en campos relacionados indirectamente con el modelo (por ejemplo, buscar por el producto de las líneas de un presupuesto), debemos añadir al modelo un campo “related” que nos permita enganchar directamente ese campo en el modelo principal, véase el ejemplo usado por el módulo de compras para buscar por el producto de las líneas:

'product_id': fields.related('order_line', 'product_id', type='many2one', relation='product.product', string='Product')

Teniendo este campo en el modelo de purchase_order (pedidos de compra), ya podemos insertar directamente el campo product_id en la vista search para buscar todos los pedidos cuyas líneas incluyan el producto escrito, solo necesitamos meter el siguiente código en la searchview:

  <field name="product_id"/>

*Para los campos filter (tipo V/F) sí podemos atajar usando en el domain campos relacionales encadenadolos con puntos (p.e. partner_id.email),  lo cual nos evita tener que añadir campos related al módelo, pero estas expresiones nos darán errores tanto en los campos field (para buscar por cadenas de texto) de la vista, como en los de agrupación.

Pues lo dicho, un buen cuadro de mandos es fundamental para que los usuarios tengan la agilidad necesaria a la hora de recuperar la información en el momento preciso. Analizar y crear aquellos filtros necesarios (y evitar inundar el panel de filtros innecesarios) es un punto muy importante en una implantación.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *