Mixins: mail.thread

En el desarrollo de módulos de Odoo, los mixins juegan un papel importante para extender funcionalidades sin necesidad de duplicar código. Estos pequeños “bloques de lógica” permiten añadir comportamientos comunes a distintos modelos. En este blog explicaremos qué son los mixins en Odoo, cómo funcionan, algunos ejemplos de mixins que añade Odoo y un ejemplo de su uso.

Daniel Sánchez

10/7/20255 min read

¿Qué son los mixins?

En Odoo, un mixin es una clase auxiliar que no representa un modelo por sí misma (no suele tener una tabla dedicada en la base de datos), sino que se utiliza para añadir funcionalidades comunes a otros modelos.

Una forma de interpretar los mixins es como piezas de código reutilizables que puedes "mezclar" (traducción de "mixin") con diferentes modelos para extender sus capacidades sin tener que duplicar código.

Características principales de los mixins en Odoo

Por mencionar algunas:

  • No son modelos dentro de la base de datos. Sus declaraciones contienen el parámetro name = "..." Pero también llevan abstract = True, lo que significa que no se instancian solos.

  • Agregan código que puede aplicarse a muchos modelos (por ejemplo, seguimiento de cambios, actividades programadas, etc.).

  • Para heredarlos, basta con añadir la clase mixin a la herencia de nuestro modelo.

Ejemplos comunes de mixins en Odoo

  • mail.thread: Permite que un modelo tenga un “chatter” (seguimiento de mensajes, notas internas, notificaciones, etc.).

  • mail.activity.mixin: Añade soporte para actividades programadas (tareas pendientes, recordatorios).

  • portal.mixin: Da la capacidad de exponer un modelo en el portal web de Odoo.

  • website.published.mixin: Permite publicar o despublicar registros en un sitio web.

  • pos.load.mixin: Permite añadir campos y registros dentro de la información del punto de venta.

Ejemplo de uso del mixin mail.thread

Se utilizará un módulo personalizado dentro de Odoo, el cual heredará el mixin mail.thread.

Dentro del módulo personalizado, creamos un modelo sencillo que tendrá de momento 2 campos: nombre y código. Añadimos su vista lista y formulario, así como una acción para llamar al modelo desde un menú raíz. El nuevo modelo se llamará blog.test. El código de la definición del modelo en Python es el siguiente:

Y el código de su vista formulario es el siguiente:

Por lo que visualizamos un registro desde la vista formulario de la siguiente manera:

Para añadir las funcionalidades del mixin mail.thread dentro de este modelo personalizado, lo añadimos dentro de sus herencias, en su definición dentro de la clase Python. El módulo personalizado debe tener como dependencia al módulo “mail”; si no se tiene, al actualizar el módulo se presenta un error en la terminal y no permite añadir la herencia, ya que no la encuentra.

Al actualizar el módulo personalizado, no notamos ningún cambio, al menos desde las vistas del modelo, pero internamente nuestro modelo ya contiene muchas funcionalidades que fueron añadidas por el mixin. La funcionalidad más importante de este mixin es el “chatter” (o tablero), mismo que se agrega haciendo el siguiente cambio a nuestra vista formulario:

Una vez que se haya añadido la compatibilidad del chatter con nuestro modelo, los usuarios podrán añadir fácilmente mensajes o notas internas a cualquier registro de este modelo. Cada uno de estos enviará una notificación, y si se tienen ciertas configuraciones, estas notificaciones se pueden enviar por correo electrónico, además de responderse directamente desde su correo. Visualizamos el chatter actualizando el módulo y recargando la vista formulario del registro anterior.

El mixin mail.thread añade un potente sistema de seguimiento de campos, que permite registrar cambios en campos específicos en el chatter del registro. Para añadir seguimiento a un campo, simplemente se añade el atributo de seguimiento (tracking) establecido como verdadero. Por ejemplo:

A partir de que se actualice el módulo con el cambio anterior, cada cambio que se haga sobre el campo ‘name’ se mostrará en el chatter. Por ejemplo, se actualiza el campo del registro anterior y se coloca ‘Registro actualizado’, lo cual se registra en el chatter:

Del lado del backend, se añadieron distintas funciones que ayudan a enviar mensajes o administrar seguidores dentro del registro de forma sencilla. Algunas de las funciones más importantes que añade este mixin son:

  • message_post: Publica un nuevo mensaje en un hilo existente. El método más utilizado por este mixin.

  • message_post_with_view: Envía un correo o publica un mensaje usando un view_id para renderizarlo con el motor ir.qweb.

  • message_post_with_template: Envía un correo con una plantilla.

  • message_new: Crea un nuevo registro del modelo correspondiente basado en información básica extraída del mensaje.

  • message_update: Se llama cuando se recibe un nuevo mensaje desde un hilo existente. Actualiza un registro mediante los valores de un parámetro entrante (update_vals). 

Entre otras funciones. Considerar que las funciones anteriores tienen parámetros distintos, por lo que se debe revisar su definición antes de llamarlas en un modelo personalizado.

Para ejemplificar el uso de una de las funciones anteriores, se añade un botón dentro de la vista formulario del registro anterior, el cual llama a un método que hace uso de la función message_post que fue añadida por el mixin. El botón es el siguiente:

Y el método que utiliza el botón anterior es el siguiente:

Por lo que, al presionar el botón, se visualiza el mensaje en el chatter.

Consejos rápidos:

  • Muchos comportamientos comunes (seguimiento, ordenación jerárquica, chatters) ya están añadidos con mixins nativos de Odoo, por lo que puedes utilizarlos antes de programar un módulo desde cero.

  • Puedes combinarlos con herencia de modelos, ya que la complementan para agregar funciones reutilizables.

  • Si tu modelo solo necesita un campo o un método puntual que añade un mixin, no es necesario incluir el mixin completo. Puedes buscar la definición del mixin y añadir las cosas puntuales que necesitas dentro de tu modelo personalizado, así evitas añadir campos o métodos innecesarios.

  • Si dos mixins redefinen el mismo método, respeta el orden de herencia y usa super() correctamente.

  • Algunos mixins agregan campos y relaciones automáticamente, lo cual puede influir en rendimiento y migraciones.

En Exdoo podemos desarrollar cualquier módulo para Odoo en México, implementamos tu ERP con consultores experimentados no solo en Odoo, sino en procesos de negocios; tenemos 10 años trabajando solamente con Odoo en México y otros países.