{"id":400,"date":"2025-10-07T08:49:20","date_gmt":"2025-10-07T08:49:20","guid":{"rendered":"https:\/\/sienna-manatee-218967.hostingersite.com\/blogs\/mixins-mailthread-2\/"},"modified":"2026-05-01T18:54:29","modified_gmt":"2026-05-01T18:54:29","slug":"mixins-mailthread","status":"publish","type":"post","link":"https:\/\/exdoo.mx\/blogs\/mixins-mailthread\/","title":{"rendered":"Mixins: mail.thread"},"content":{"rendered":"<p dir=\"auto\" class=\"body\"><span><em><u>\u00bfQu\u00e9 son los mixins?<\/u><\/em><\/span><\/p>\n<div style=\"background:linear-gradient(135deg,#0A7099 0%,#0d8db8 100%);color:#fff;padding:28px 26px;border-radius:16px;margin:0 0 28px;box-shadow:0 4px 16px rgba(10,112,153,.2);\">\n<div style=\"display:inline-block;background:rgba(255,255,255,.18);padding:6px 14px;border-radius:20px;font-size:12px;font-weight:700;letter-spacing:.5px;margin-bottom:12px;color:#fff;\">\ud83d\udcd8 ART\u00cdCULO T\u00c9CNICO<\/div>\n<p style=\"font-size:16px;line-height:1.6;margin:0;color:#fff;opacity:.95;\">En Odoo, un mixin es una clase auxiliar que no representa un modelo por s\u00ed misma (no suele tener una tabla dedicada en la base de datos), sino que se utiliza para a\u00f1adir funcionalidades comunes a otros modelos.<\/p>\n<\/div>\n<p dir=\"auto\" class=\"body\">Una forma de interpretar los mixins es como piezas de c\u00f3digo reutilizables que puedes &#8220;mezclar&#8221; (traducci\u00f3n de &#8220;mixin&#8221;) con diferentes modelos para extender sus capacidades sin tener que duplicar c\u00f3digo.<\/p>\n<p dir=\"auto\" class=\"body\"><span><em><u>Caracter\u00edsticas principales de los mixins en Odoo<\/u><\/em><\/span><\/p>\n<p dir=\"auto\" class=\"body\">Por mencionar algunas:<\/p>\n<ul style=\"padding-left:22px;line-height:1.9;\">\n<li>No son modelos dentro de la base de datos. Sus declaraciones contienen el par\u00e1metro <em>name = &#8220;&#8230;&#8221; Pero tambi\u00e9n llevan abstract = True<\/em>, lo que significa que no se instancian solos.<\/li>\n<li>Agregan c\u00f3digo que puede aplicarse a muchos modelos (por ejemplo, seguimiento de cambios, actividades programadas, etc.).<\/li>\n<li>Para heredarlos, basta con a\u00f1adir la clase mixin a la herencia de nuestro modelo.<\/li>\n<\/ul>\n<p dir=\"auto\" class=\"body\"><span><em><u>Ejemplos comunes de mixins en Odoo<\/u><\/em><\/span><\/p>\n<ul style=\"padding-left:22px;line-height:1.9;\">\n<li><strong>mail.thread:<\/strong> Permite que un modelo tenga un \u201cchatter\u201d (seguimiento de mensajes, notas internas, notificaciones, etc.).<\/li>\n<li><strong>mail.activity.mixin:<\/strong> A\u00f1ade soporte para actividades programadas (tareas pendientes, recordatorios).<\/li>\n<li><strong>portal.mixin:<\/strong> Da la capacidad de exponer un modelo en el portal web de Odoo.<\/li>\n<li><strong>website.published.mixin:<\/strong> Permite publicar o despublicar registros en un sitio web.<\/li>\n<li><strong>pos.load.mixin:<\/strong> Permite a\u00f1adir campos y registros dentro de la informaci\u00f3n del punto de venta.<\/li>\n<\/ul>\n<h3 style=\"color:#0A7099;margin-top:22px;font-size:16px;\">Ejemplo de uso del mixin mail.thread<\/h3>\n<p class=\"body\" dir=\"auto\">Se utilizar\u00e1 un m\u00f3dulo personalizado dentro de Odoo, el cual heredar\u00e1 el mixin mail.thread.<\/p>\n<p class=\"body\" dir=\"auto\">Dentro del m\u00f3dulo personalizado, creamos un modelo sencillo que tendr\u00e1 de momento 2 campos: nombre y c\u00f3digo. A\u00f1adimos su vista lista y formulario, as\u00ed como una acci\u00f3n para llamar al modelo desde un men\u00fa ra\u00edz. El nuevo modelo se llamar\u00e1 blog.test. El c\u00f3digo de la definici\u00f3n del modelo en Python es el siguiente:<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/exdoo.mx\/blogs\/wp-content\/uploads\/2026\/05\/captura-de-pantalla-2025-10-07-a-la-s-9.02.01a-a.m.-Aq2GbQMqK3Fl0REO-2.png\" alt=\"\"  style=\"max-width:100%;height:auto;border-radius:10px;box-shadow:0 2px 8px rgba(0,0,0,0.12);display:block;margin:14px auto;\" \/><\/p>\n<p class=\"body\" dir=\"auto\">Y el c\u00f3digo de su vista formulario es el siguiente:<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/exdoo.mx\/blogs\/wp-content\/uploads\/2026\/05\/captura-de-pantalla-2025-10-07-a-la-s-9.04.40a-a.m.-mnl4bEgkNwHEkPNw-2.png\" alt=\"\"  style=\"max-width:100%;height:auto;border-radius:10px;box-shadow:0 2px 8px rgba(0,0,0,0.12);display:block;margin:14px auto;\" \/><\/p>\n<p dir=\"auto\" class=\"body\">Por lo que visualizamos un registro desde la vista formulario de la siguiente manera:<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/exdoo.mx\/blogs\/wp-content\/uploads\/2026\/05\/captura-de-pantalla-2025-10-07-a-la-s-9.07.16a-a.m.-mjE4bxKMgRiVBzjq-2.png\" alt=\"\"  style=\"max-width:100%;height:auto;border-radius:10px;box-shadow:0 2px 8px rgba(0,0,0,0.12);display:block;margin:14px auto;\" \/><\/p>\n<p dir=\"auto\" class=\"body\">Para a\u00f1adir las funcionalidades del mixin mail.thread dentro de este modelo personalizado, lo a\u00f1adimos dentro de sus herencias, en su definici\u00f3n dentro de la clase Python. El m\u00f3dulo personalizado debe tener como dependencia al m\u00f3dulo \u201cmail\u201d; si no se tiene, al actualizar el m\u00f3dulo se presenta un error en la terminal y no permite a\u00f1adir la herencia, ya que no la encuentra.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/exdoo.mx\/blogs\/wp-content\/uploads\/2026\/05\/captura-de-pantalla-2025-10-07-a-la-s-9.09.58a-a.m.-AMqDWwB5x5f4GklZ-2.png\" alt=\"\"  style=\"max-width:100%;height:auto;border-radius:10px;box-shadow:0 2px 8px rgba(0,0,0,0.12);display:block;margin:14px auto;\" \/><\/p>\n<h3 style=\"color:#0A7099;margin-top:24px;\"><span>Al actualizar el m\u00f3dulo personalizado, no notamos ning\u00fan cambio, al menos desde las vistas del modelo, pero internamente nuestro modelo ya contiene muchas funcionalidades que fueron a\u00f1adidas por el mixin. La funcionalidad m\u00e1s importante de este mixin es el \u201cchatter\u201d (o tablero), mismo que se agrega haciendo el siguiente cambio a nuestra vista formulario:<\/span><\/h3>\n<p><img decoding=\"async\" src=\"https:\/\/exdoo.mx\/blogs\/wp-content\/uploads\/2026\/05\/captura-de-pantalla-2025-10-07-a-la-s-9.12.38a-a.m.-Yan0QZv5KyHK2Drw-2.png\" alt=\"\"  style=\"max-width:100%;height:auto;border-radius:10px;box-shadow:0 2px 8px rgba(0,0,0,0.12);display:block;margin:14px auto;\" \/><\/p>\n<p dir=\"auto\" class=\"body\">Una vez que se haya a\u00f1adido la compatibilidad del chatter con nuestro modelo, los usuarios podr\u00e1n a\u00f1adir f\u00e1cilmente mensajes o notas internas a cualquier registro de este modelo. Cada uno de estos enviar\u00e1 una notificaci\u00f3n, y si se tienen ciertas configuraciones, estas notificaciones se pueden enviar por correo electr\u00f3nico, adem\u00e1s de responderse directamente desde su correo. Visualizamos el chatter actualizando el m\u00f3dulo y recargando la vista formulario del registro anterior.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/exdoo.mx\/blogs\/wp-content\/uploads\/2026\/05\/captura-de-pantalla-2025-10-07-a-la-s-9.15.37a-a.m.-A85M9lnW1xSwwPQJ-2.png\" alt=\"\"  style=\"max-width:100%;height:auto;border-radius:10px;box-shadow:0 2px 8px rgba(0,0,0,0.12);display:block;margin:14px auto;\" \/><\/p>\n<h3 style=\"color:#0A7099;margin-top:24px;\"><span>El mixin mail.thread a\u00f1ade un potente sistema de seguimiento de campos, que permite registrar cambios en campos espec\u00edficos en el chatter del registro. Para a\u00f1adir seguimiento a un campo, simplemente se a\u00f1ade el atributo de seguimiento (tracking) establecido como verdadero. Por ejemplo:<\/span><\/h3>\n<p><img decoding=\"async\" src=\"https:\/\/exdoo.mx\/blogs\/wp-content\/uploads\/2026\/05\/captura-de-pantalla-2025-10-07-a-la-s-9.18.04a-a.m.-m7VD9Z10p2TQxwZv-2.png\" alt=\"\"  style=\"max-width:100%;height:auto;border-radius:10px;box-shadow:0 2px 8px rgba(0,0,0,0.12);display:block;margin:14px auto;\" \/><\/p>\n<p dir=\"auto\" class=\"body\">A partir de que se actualice el m\u00f3dulo con el cambio anterior, cada cambio que se haga sobre el campo \u2018name\u2019 se mostrar\u00e1 en el chatter. Por ejemplo, se actualiza el campo del registro anterior y se coloca \u2018Registro actualizado\u2019, lo cual se registra en el chatter:<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/exdoo.mx\/blogs\/wp-content\/uploads\/2026\/05\/captura-de-pantalla-2025-10-07-a-la-s-9.21.01a-a.m.-mP43W5a0p4c3bL6z-2.png\" alt=\"\"  style=\"max-width:100%;height:auto;border-radius:10px;box-shadow:0 2px 8px rgba(0,0,0,0.12);display:block;margin:14px auto;\" \/><\/p>\n<p class=\"body\" dir=\"auto\">Del lado del backend, se a\u00f1adieron distintas funciones que ayudan a enviar mensajes o administrar seguidores dentro del registro de forma sencilla. Algunas de las funciones m\u00e1s importantes que a\u00f1ade este mixin son:<\/p>\n<ul style=\"padding-left:22px;line-height:1.9;\">\n<li><strong>message_post:<\/strong> Publica un nuevo mensaje en un hilo existente. El m\u00e9todo m\u00e1s utilizado por este mixin.<\/li>\n<li><strong>message_post_with_view:<\/strong> Env\u00eda un correo o publica un mensaje usando un view_id para renderizarlo con el motor ir.qweb.<\/li>\n<li><strong>message_post_with_template:<\/strong> Env\u00eda un correo con una plantilla.<\/li>\n<li><strong>message_new:<\/strong> Crea un nuevo registro del modelo correspondiente basado en informaci\u00f3n b\u00e1sica extra\u00edda del mensaje.<\/li>\n<li><strong>message_update: <\/strong>Se llama cuando se recibe un nuevo mensaje desde un hilo existente. Actualiza un registro mediante los valores de un par\u00e1metro entrante (update_vals).&nbsp;<\/li>\n<\/ul>\n<p class=\"body\" dir=\"auto\">Entre otras funciones. Considerar que las funciones anteriores tienen par\u00e1metros distintos, por lo que se debe revisar su definici\u00f3n antes de llamarlas en un modelo personalizado.<\/p>\n<p class=\"body\" dir=\"auto\">Para ejemplificar el uso de una de las funciones anteriores, se a\u00f1ade un bot\u00f3n dentro de la vista formulario del registro anterior, el cual llama a un m\u00e9todo que hace uso de la funci\u00f3n <strong>message_post<\/strong> que fue a\u00f1adida por el mixin. El bot\u00f3n es el siguiente:<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/exdoo.mx\/blogs\/wp-content\/uploads\/2026\/05\/captura-de-pantalla-2025-10-07-a-la-s-9.26.21a-a.m.-mk34GxagBxtE6ggl-2.png\" alt=\"\"  style=\"max-width:100%;height:auto;border-radius:10px;box-shadow:0 2px 8px rgba(0,0,0,0.12);display:block;margin:14px auto;\" \/><\/p>\n<p class=\"body\" dir=\"auto\">Y el m\u00e9todo que utiliza el bot\u00f3n anterior es el siguiente:<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/exdoo.mx\/blogs\/wp-content\/uploads\/2026\/05\/captura-de-pantalla-2025-10-07-a-la-s-9.29.28a-a.m.-YyvD45wMPluVL4P4-2.png\" alt=\"\"  style=\"max-width:100%;height:auto;border-radius:10px;box-shadow:0 2px 8px rgba(0,0,0,0.12);display:block;margin:14px auto;\" \/><\/p>\n<h3 style=\"color:#0A7099;margin-top:24px;\"><span>Por lo que, al presionar el bot\u00f3n, se visualiza el mensaje en el chatter.<\/span><\/h3>\n<p><img decoding=\"async\" src=\"https:\/\/exdoo.mx\/blogs\/wp-content\/uploads\/2026\/05\/captura-de-pantalla-2025-10-07-a-la-s-9.32.12a-a.m.-YrD4bok8R5UP2VKy-2.png\" alt=\"\"  style=\"max-width:100%;height:auto;border-radius:10px;box-shadow:0 2px 8px rgba(0,0,0,0.12);display:block;margin:14px auto;\" \/><\/p>\n<h3 style=\"color:#0A7099;margin-top:22px;font-size:16px;\">Consejos r\u00e1pidos:<\/h3>\n<ul style=\"padding-left:22px;line-height:1.9;\">\n<li>Muchos comportamientos comunes (seguimiento, ordenaci\u00f3n jer\u00e1rquica, chatters) ya est\u00e1n a\u00f1adidos con mixins nativos de Odoo, por lo que puedes utilizarlos antes de programar un m\u00f3dulo desde cero.<\/li>\n<li>Puedes combinarlos con herencia de modelos, ya que la complementan para agregar funciones reutilizables.<\/li>\n<li>Si tu modelo solo necesita un campo o un m\u00e9todo puntual que a\u00f1ade un mixin, no es necesario incluir el mixin completo. Puedes buscar la definici\u00f3n del mixin y a\u00f1adir las cosas puntuales que necesitas dentro de tu modelo personalizado, as\u00ed evitas a\u00f1adir campos o m\u00e9todos innecesarios.<\/li>\n<li>Si dos mixins redefinen el mismo m\u00e9todo, respeta el orden de herencia y usa super() correctamente.<\/li>\n<li>Algunos mixins agregan campos y relaciones autom\u00e1ticamente, lo cual puede influir en rendimiento y migraciones.<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>\u00bfQu\u00e9 son los mixins? \ud83d\udcd8 ART\u00cdCULO T\u00c9CNICO En Odoo, un mixin es una clase auxiliar que no representa un modelo por s\u00ed misma (no suele tener una tabla\u2026<\/p>\n","protected":false},"author":1,"featured_media":387,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[10],"tags":[],"class_list":["post-400","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized"],"_links":{"self":[{"href":"https:\/\/exdoo.mx\/blogs\/wp-json\/wp\/v2\/posts\/400","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/exdoo.mx\/blogs\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/exdoo.mx\/blogs\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/exdoo.mx\/blogs\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/exdoo.mx\/blogs\/wp-json\/wp\/v2\/comments?post=400"}],"version-history":[{"count":3,"href":"https:\/\/exdoo.mx\/blogs\/wp-json\/wp\/v2\/posts\/400\/revisions"}],"predecessor-version":[{"id":1955,"href":"https:\/\/exdoo.mx\/blogs\/wp-json\/wp\/v2\/posts\/400\/revisions\/1955"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/exdoo.mx\/blogs\/wp-json\/wp\/v2\/media\/387"}],"wp:attachment":[{"href":"https:\/\/exdoo.mx\/blogs\/wp-json\/wp\/v2\/media?parent=400"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/exdoo.mx\/blogs\/wp-json\/wp\/v2\/categories?post=400"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/exdoo.mx\/blogs\/wp-json\/wp\/v2\/tags?post=400"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}