Respuesta corta: un módulo de Odoo es un directorio con un manifiesto, modelos, vistas y permisos de acceso. Esta guía recorre el flujo mínimo para crear el primero en Odoo 19: estructura, modelo, seguridad y una pantalla funcionando.
El síntoma
Odoo no cubre un proceso de tu negocio y no sabes por dónde empezar a extenderlo.
La causa raíz
Primero se configura lo estándar; el módulo a la medida es para lo que el estándar no cubre. Cuando el proceso lo exige, la solución no es cambiar de sistema ni modificar el código base, sino agregar un módulo: una pieza de software que agrega o modifica funcionalidades dentro del sistema.
Un módulo a la medida se justifica cuando el estándar no cubre el proceso, no antes.
Cómo se resuelve
¿Qué es un módulo en Odoo 19 y para qué sirve?
Un módulo en Odoo es una pieza de software que agrega o modifica funcionalidades dentro del sistema. Puede ser tan simple como un nuevo modelo de datos o tan complejo como una aplicación completa de contabilidad o inventario.
Con un módulo puedes:
Crear nuevas pantallas y menús.
Añadir lógica de negocio.
Integrar servicios externos (SAT, bancos, APIs, etc.).
Personalizar vistas y reportes.
Adaptar procesos al marco fiscal mexicano.
Esto permite que las empresas utilicen Odoo totalmente alineado con sus propias necesidades, sin depender de funcionalidades genéricas.
Estructura básica de un módulo
Un módulo reside en un directorio del sistema de archivos que tiene la siguiente estructura
mymodule/
├── __init__.py
├── __manifest__.py
├── models/
│ ├── __init__.py
│ └── Mymodel.py
├── views/
│ └── menu.xml
│ └── actions.xml
└── security/
└── ir.model.access.csv
Crear un directorio para el módulo.
Vamos a crear un directorio dentro del directorio de addons. El directorio de addons puede ser establecido utilizando la bandera --addons-path
mkdir mymodule
Crear archivos clave
Debemos incluir el manifiesto del módulo y el archivo init dentro del directorio de nuestro módulo. El manifiesto debe contener las siguientes llaves:
- - name: Nombre que aparece en pantalla
- - license: Tipo de licencia del módulo
- - description: Breve descripción que aparece en pantall del módulo
- - depends: Arreglo de dependencias, indispensable poner 'base' como primera dependencia
- - application: Booleano que define el módulo como aplicación, más que nada para filtrado en Odoo apps
- - data: Arreglo con los paths de los archivos de datos, el sistema reconoce de manera automática que hace cada uno, solo es importante seguir la convención de nombres establecida por Odoo
Ejemplo de archivo:
{
'name': 'Test Module',
'license': 'AGPL-3',
'description': 'Hello odoo modules',
'depends': ['base'],
'application': True,
'data':['views/menu.xml', 'views/actions.xml']
}
A partir de que ponemos el manifiesto, nuestro módulo va a ser reconocido por el sistema, ojo también debe de estar el archivo __init__.py aunque este vacio para que sea un módulo valido
Tip: Para probar que funciona podemos poner el módulo en un directorio de addons independiente, si el servidor no marca errores entonces el módulo es valido y vamos a poder encontrarlo en el catalogo de apps
Activar el modo de depuración
Agregar el siguiente parámetro en la URL de nuestro navegador
?debug=1
Actualizar la lista de apps
Desde la interfaz de usuario debemos de actualizar la lista de apps para que nuestra app sea mostrada.
Apps > Actualizar lista de aplicaciones
Crear modelos
Vamos a crear un modelo en el directorio de models, un modelo corresponde con una clase que hereda el modelo models.Model, el modelo puede tener campos utilizando fields
from odoo import models,fields
class MyModel(models.Model):
_name: 'mymodel.mymodel'
name = fields.Char()
Nota: para que se refleje en la base de datos debemos asegurar que el modelo sea importado en el __init__ del módulo, ahi podemos utilizar cualquier estrategia de importación, si no llega a importarse o a existir en ese espacio de nombres entonces no va a realizar la migración de la base de datos.
(Opcional) Migrar la base de datos desde la consola
Cuando hacemos un cambio en el modelo debemos reflejarlo con una migración en la base de datos, desde la interfaz de usuario.
Apps > Modulo > Actualizar
Para realizarlo desde la consola vamos a utilizar -d <database> recordando que hay múltiples bases de datos, podemos seleccionar solo una para realizar la migración, luego vamos a utilizar la bandera -u <module> con esto vamos a seleccionar el módulo que se va a actualizar y esto va a generar una migración de la tabla original a la tabla actual
Crear permisos de acceso
Crear el archivo de acceso ir.module.access.csv dentro del subdirectorio security. Agregar el archivo creado en el manifiesto.
'data': ['security/ir.module.access.csv']
Es imperativo crear el archivo porque Odoo por defecto utiliza una white list por lo que el acceso por defecto es restringido, si no se declara no vamos a tener acceso a los modelos.
- - id: Puede tener cualquier valor
- - name: Puede tener cualquier valor pero normalmente tiene el mismo valor que id, por ejemplo access_model_mymodel, o access_id_1, etc.
- - model_id/id: debe tener siempre el prefijo model_ y debe tener el mismo nombre que el modelo, si el model tiene el caracter '.' se debe reemplazar por '_'
- - group_id/id: se puede dejar vacio para hacer alusión a todos los usuarios, o se puede seleccionar un grupo que normalmente se ven asi base.group_user, todos los usuarios tienen un grupo o varios definidos
- - perm_read: 1 para permitir 0 para negar
- - perm_write: 1 para permitir 0 para negar
- - perm_create: 1 para permitir 0 para negar
- - perm_unlink: 1 para permitir 0 para negar
Ejemplo básico
id,name,model_id/id,group_id/id,perm_read,perm_write,perm_create,perm_unlink
access_model_mymodel,access_model_mymodel,model_mymodel_mymodel,,1,1,1,1
Crear flujo básico de interfaz de usuario
El flujo más simple de interfaz de usuario es dar clic en un elemento del menu de modelos que activa la acción de renderizar el modelo en una vista (Menu -> Acción -> Vista). Para implementar este flujo debemos realizar los siguientes pasos:
- Definir la acción
- Definir el elemento del menu
- Agregar los archivos al manifiesto
1. En el archivo actions.xml vamos a utilizar la acción act_window
<odoo>
<data>
<record model="ir.actions.act_window" id="action1">
<field name="name">Action 1</field>
<field name="res_model">mymodel.mymodel</field>
<field name="view_mode">list,form</field>
</record>
</data>
</odoo>
2. En el archivo menu.xml
<odoo>
<menuitem id="mymodel_root_menu" name="Root menu" sequence="-100">
<menuitem id="mymodel_menu" name="My model" action="action1"><menuitem>
</menuitem>
</odoo>
3. Agregar los archivos al manifiesto
'data': [
'security/ir.module.access.csv',
'views/actions.xml',
'views/menu.xml'
]
Buenas prácticas para módulos en Odoo 19
- Usa nombres coherentes y en inglés si planeas distribuirlo.
- Documenta tu código.
- Sigue las convenciones del Odoo Community Association (OCA).
- Evita modificar vistas o modelos del core sin herencia XML.
- Mantén el módulo simple y modular.
Estas prácticas te ayudarán a mantener tu código entendible y fácil de actualizar cuando Odoo lance nuevas versiones.
Lo que ya sabes hacer
Con esta guía ya tienes las bases para:
Entender la estructura de un módulo
Definir modelos, vistas y seguridad
Instalar y probar el módulo
Seguir buenas prácticas
Tres preguntas para empezar tu propio diagnóstico
- ¿La configuración estándar de Odoo ya cubre este proceso, sin desarrollar nada?
- ¿Tu proceso necesita una pantalla, una regla o una integración que Odoo no trae?
- ¿Tienes quién mantenga y revise el módulo cada vez que actualices de versión?
Antes de programar, confirma que Odoo no lo resuelve con configuración. Un módulo que no hacía falta también hay que mantenerlo en cada actualización.