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.
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: registroir.ui.viewasociado.
_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.
_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:

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:


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”:

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

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

Pasos:
- Validamos si la vista es
formy si el usuario no tiene el permiso. - Buscamos el nodo del header con XPath.
- Si lo encontramos, le añadimos
invisible="1".
4
Resultado
Sin el permiso, la vista no muestra los botones ni la barra de estado:

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

5
Variante: ocultar solo un botón específico
Si solo queremos ocultar el botón “Enviar por correo electrónico”, modificamos el XPath:


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:

Resultado:

7
Consejos rápidos
string, readonly, invisible o añade nodos sin duplicar la vista._get_view para cambios dinámicos que no puedes resolver con herencias XML normales.company_id o user_has_groups únicamente si tu lógica los usa.📌 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