Saltar al contenido

Edición de vistas con Python

🐍 DESARROLLO · ODOO · VISTAS DINÁMICAS

Edición de vistas con Python en Odoo

Las vistas en Odoo son XML — pero hay casos donde necesitas modificarlas dinámicamente desde Python: dependiendo del usuario, la compañía activa, o un valor calculado. Para eso existen _get_view y _get_view_cache_key.

DINÁMICO
Vistas que cambian en runtime

🔍
XPATH
Localizar nodos específicos

🗝️
CACHÉ POR CONTEXTO
Vista distinta por usuario/empresa

🎯
SIN DUPLICAR XML
Una vista, comportamientos múltiples

1
¿Cómo se editan vistas con Python?

Hay dos funciones clave que reemplazan al antiguo método fields_view_get (usado hasta Odoo 15):

_get_view

Se desencadena cada vez que se carga una vista (formulario, lista, kanban…). Retorna una tupla (arch, view) donde:

  • arch: XML analizado (nodo etree con XPath).
  • view: registro ir.ui.view asociado.

_get_view_cache_key

Vinculada al sistema de caché. Construye una clave única por combinación vista + contexto — diferentes usuarios o situaciones tienen vistas personalizadas sin reutilización cruzada.

💡 IMPORTANTE
Cuando sobreescribes _get_view según contexto (empresa, grupo), conviene también redefinir _get_view_cache_key para que el caché considere esas condiciones. Sin esto, el caché te puede mostrar la vista “vieja” tras el cambio.

2
Ejemplo en módulos base: monedas

El ejemplo más conocido está en monedas — hay una columna “Unidad por X”, donde X es el nombre de la moneda de la compañía:

Columna Unidad por X en la vista de monedas

Si cambias el nombre de la moneda de MXN a MX, no podrías cambiar la columna dinámicamente con XML. Pero con _get_view sí — y el nuevo nombre aparece automáticamente:

Nombre de moneda cambiado a MX
Columna ahora muestra MX dinámicamente

3
Caso práctico: ocultar header según permiso

Vamos a editar la vista formulario de cotizaciones según si el usuario tiene el permiso “Ventas / Administrador”:

Permiso Ventas / Administrador en grupos del módulo de ventas

Si tiene el permiso, ve todos los botones del <header>. Si no, no ve botones ni el widget de estado.

3.1 — Override de _get_view_cache_key

Override de _get_view_cache_key añadiendo el grupo al cache

Lo que hace: al resultado original de _get_view_cache_key le agregamos la condición de si el usuario tiene sales_team.group_sale_manager. Si el usuario gana o pierde ese permiso, la clave del caché cambia y se regenera la vista.

3.2 — Override de _get_view

Override de _get_view aplicando invisible al header con XPath

Pasos:

  1. Validamos si la vista es form y si el usuario no tiene el permiso.
  2. Buscamos el nodo del header con XPath.
  3. Si lo encontramos, le añadimos invisible="1".

4
Resultado

Sin el permiso, la vista no muestra los botones ni la barra de estado:

Vista sin botones ni barra de estado para usuario sin permiso

Al volver a darle el permiso, todo aparece con normalidad:

Vista completa con botones y barra de estado

5
Variante: ocultar solo un botón específico

Si solo queremos ocultar el botón “Enviar por correo electrónico”, modificamos el XPath:

Override modificado para ocultar solo el botón Enviar por correo
Vista con solo ese botón oculto

6
Modificar texto y atributos, no solo ocultar

No solo se trata de ocultar partes — también puedes agregar/quitar parámetros, nuevos nodos o cambiar valores. Por ejemplo: si tiene el permiso, el botón se visualiza con texto diferente:

Override que cambia el texto del botón según el permiso

Resultado:

Vista con texto del botón modificado dinámicamente

7
Consejos rápidos

✅ Para ajustes ligeros
Cambia string, readonly, invisible o añade nodos sin duplicar la vista.

✅ Usa XPath
Localiza nodos específicos con expresiones XPath para mantener el código limpio y preciso.

💡 Solo cuando XML no alcanza
Reserva _get_view para cambios dinámicos que no puedes resolver con herencias XML normales.

⚠️ Redefine cache_key
Si tus cambios dependen del contexto, asegúrate de actualizar el cache key — sino el cliente verá la vista vieja.

✅ Solo lo relevante al cache
Añade company_id o user_has_groups únicamente si tu lógica los usa.

🧪 Prueba al cambiar contexto
Cambia de compañía, grupo o rol y verifica que la personalización se aplica correctamente.

📌 En resumen

La edición de vistas con Python es la herramienta para casos donde XML estático no alcanza: cambios dinámicos según usuario, grupo, compañía o lógica de negocio. Con _get_view + _get_view_cache_key resuelves cosas que antes obligaban a duplicar vistas.

Es una técnica avanzada — úsala cuando realmente lo necesites. Antes, intenta resolver con herencias XML, atributos groups y attrs. En Exdoo aplicamos este patrón en módulos a medida con lógica de negocio compleja.

Deja un comentario

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

¿Te gustaría implementar Odoo en tu empresa?

12 años de experiencia · +60 implementaciones exitosas · Partner Gold de Odoo en México

Hablemos por WhatsApp