Este post contiene la segunda parte de la guía Filtros avanzados en Odoo. En la primera parte hemos visto como se define un filtro, qué es el modo desarrollador y cómo utilizarlo, los campos que podemos utilizar en un dominio y los tipos de operadores disponibles en Odoo.
En esta segunda parte, contemplamos los siguientes temas:
- Filtros con dominios complejos
- Filtros con fechas dinámicas
- Filtros con contexto
Filtros con dominios complejos
En algunos casos es necesario utilizar mas de una condición para filtrar los datos. Odoo permite definir dominios con múltiples condiciones enlazadas entre ellas con operadores lógicos.
Operador Lógico | Descripción |
---|---|
& | AND lógico – verdadero si ambos operandos son verdaderos (por defecto en dominios sin operador especificado) |
| | OR lógico – verdadero si cualquier operando es verdadero |
! | NOT lógico – invierte el valor del operando |
Los dominios con múltiples operandos se definen utilizando una forma de notación lógica llamada notación de prefijo. Su característica distintiva es que los operadores se colocan a la izquierda de sus operandos.
Por ejemplo, un filtro que mostraría todas las ventas con un importe entre 1000€ y 5000€ tendrá el siguiente dominio:
['&', ('amount_total', '>=', 1500), ('amount_total', '<=', 5000)]
Otro ejemplo sería, consultar todos los productos de la categoría 5 con una cantidad en stock menor que 20 o una cantidad prevista menor que 10.
['&', ('categ_id', '=', 5), '|', ('qty_available', '<', 20), ('virtual_available', '<', 10)]
Filtros con fechas dinámicas
Muchas veces necesitamos crear filtros con fechas que dependen de la fecha actual. Estos filtros tienen unos dominios mas complejos con expresiones de manipulación de fechas de Python.
Por ejemplo, para obtener las ventas de los últimos 10 días, creamos un filtro nuevo para el modelo “Sale Order” con el siguiente dominio:
[('date_order', '>=', ((context_today()-datetime.timedelta(days=10)).strftime('%Y-%m-%d')))]
Otro ejemplo sería listar todas las ventas de este mes, utilizando el siguiente dominio:
[('date_order', '>=', (context_today().strftime('%Y-%m-1')))]
Filtros con contexto
El contexto es un diccionario de Python que se utiliza para pasar cierta información a diferentes objetos en Odoo (vistas, métodos, informes, etc.).
En los filtros, el contexto se utiliza para pasar agrupaciones a las vistas y tiene la siguiente estructura: {'group_by': ['campo1', 'campo2', ...]}
Por ejemplo, para obtener las ventas de este año agrupadas por cliente, podríamos definir el siguiente filtro:
El contexto se puede utilizar también en informes dinámicos (vista gráfico) para pasar medidas y agrupaciones de filas o columnas.