{"id":632,"date":"2025-08-06T13:53:24","date_gmt":"2025-08-06T13:53:24","guid":{"rendered":"https:\/\/sienna-manatee-218967.hostingersite.com\/blogs\/servicios-servicio-de-notificaciones-2\/"},"modified":"2026-05-03T23:46:26","modified_gmt":"2026-05-03T23:46:26","slug":"servicios-servicio-de-notificaciones","status":"publish","type":"post","link":"https:\/\/exdoo.mx\/blogs\/servicios-servicio-de-notificaciones\/","title":{"rendered":"Servicios: Servicio de Notificaciones"},"content":{"rendered":"<p><img decoding=\"async\" src=\"https:\/\/exdoo.mx\/blogs\/wp-content\/uploads\/2026\/05\/servicios-b-YZ9jJrpbqWH2r7V1-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\"><span><em>\u00bfQu\u00e9 son los servicios en Odoo? <\/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;\">Son fragmentos de c\u00f3digo de larga duraci\u00f3n que proporcionan una funcionalidad. Pueden ser importados por componentes (mediante useService) o por otros servicios. Adem\u00e1s, pueden declarar un conjunto de dependencias. En ese sentido, los servicios son b\u00e1sicamente un sistema de inyecci\u00f3n de dependencias (DI, por sus siglas en ingl\u00e9s).<\/p>\n<\/div>\n<p dir=\"auto\" class=\"body\"><span> Por ejemplo, el servicio de notificaciones proporciona una forma de mostrar una notificaci\u00f3n, o el servicio rpc es la manera adecuada de realizar una solicitud al servidor de Odoo desde c\u00f3digo JavaScript.<\/span><span> <\/span><\/p>\n<h3 style=\"color:#0A7099;margin-top:24px;\"><span><em>\u00bfQu\u00e9 servicios existen en Odoo?<\/em> <\/span><\/h3>\n<p dir=\"auto\" class=\"body\"><span>A continuaci\u00f3n se muestra un listado de los servicios que incluye Odoo y una descripci\u00f3n corta: <\/span><\/p>\n<ul style=\"padding-left:22px;line-height:1.9;\">\n<li><span><strong>cookie:<\/strong> leer y modificar cookies <\/span><\/li>\n<\/ul>\n<ul style=\"padding-left:22px;line-height:1.9;\">\n<li><span><strong>effect:<\/strong> mostrar efectos gr\u00e1ficos <\/span><\/li>\n<\/ul>\n<ul style=\"padding-left:22px;line-height:1.9;\">\n<li><span><strong>http:<\/strong> realizar llamadas http de bajo nivel <\/span><\/li>\n<\/ul>\n<ul style=\"padding-left:22px;line-height:1.9;\">\n<li><span><strong>notification:<\/strong> mostrar notificaciones <\/span><\/li>\n<\/ul>\n<ul style=\"padding-left:22px;line-height:1.9;\">\n<li><span><strong>router:<\/strong> administrar la URL del navegador. <\/span><\/li>\n<\/ul>\n<ul style=\"padding-left:22px;line-height:1.9;\">\n<li><span><strong>rpc:<\/strong> enviar solicitudes al servidor <\/span><\/li>\n<\/ul>\n<ul style=\"padding-left:22px;line-height:1.9;\">\n<li><span><strong>scroller:<\/strong> manejar clics en elementos de anclaje. <\/span><\/li>\n<\/ul>\n<ul style=\"padding-left:22px;line-height:1.9;\">\n<li><span><strong>title:<\/strong> leer o modificar el t\u00edtulo de la ventana <\/span><\/li>\n<\/ul>\n<ul style=\"padding-left:22px;line-height:1.9;\">\n<li><span><strong>user:<\/strong> proporciona informaci\u00f3n relacionada con el usuario actual.<\/span><span> <\/span><\/li>\n<\/ul>\n<h3 style=\"color:#0A7099;margin-top:24px;\"><span><em>\u00bfC\u00f3mo se utiliza un servicio?<\/em><\/span><\/h3>\n<p dir=\"auto\" class=\"body\"><span>Un servicio que depende de otros servicios y que ha declarado correctamente sus dependencias simplemente recibe una referencia a los servicios correspondientes en el segundo argumento del m\u00e9todo <em>start<\/em>.<\/span><\/p>\n<p dir=\"auto\" class=\"body\"><span>El hook <em>useService<\/em> es la forma adecuada de usar un servicio dentro de un componente. Simplemente devuelve una referencia al valor del servicio, que luego puede ser utilizado por el componente. Por ejemplo:<\/span><\/p>\n<p><img decoding=\"async\" src=\"https:\/\/exdoo.mx\/blogs\/wp-content\/uploads\/2026\/05\/1-m5KnN3p077C0k61O-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>En ese caso, nos enfocaremos en el servicio de notificaciones. <\/span><\/h3>\n<p class=\"body\" dir=\"auto\"><span> <strong><u>Servicio de notificaciones<\/u><\/strong> <\/span><\/p>\n<p class=\"body\" dir=\"auto\"><span>El framework de Odoo tiene una forma est\u00e1ndar de comunicar diversa informaci\u00f3n al usuario: las notificaciones, que se muestran en la parte superior derecha de la interfaz de usuario. Los tipos de notificaci\u00f3n siguen el estilo de los <em>toasts<\/em> de Bootstrap: <\/span><\/p>\n<ul style=\"padding-left:22px;line-height:1.9;\">\n<li><span><strong>info:<\/strong> \u00fatil para mostrar informaci\u00f3n como retroalimentaci\u00f3n de una acci\u00f3n que no puede fallar. <\/span><\/li>\n<\/ul>\n<ul style=\"padding-left:22px;line-height:1.9;\">\n<li><span><strong>success:<\/strong> el usuario realiz\u00f3 una acci\u00f3n que a veces puede fallar, pero esta vez no fall\u00f3. <\/span><\/li>\n<\/ul>\n<ul style=\"padding-left:22px;line-height:1.9;\">\n<li><span><strong>warning:<\/strong> el usuario realiz\u00f3 una acci\u00f3n que solo pudo completarse parcialmente. Tambi\u00e9n es \u00fatil si algo sali\u00f3 mal, pero no fue causado directamente por el usuario, o si no se puede hacer mucho al respecto. <\/span><\/li>\n<\/ul>\n<ul style=\"padding-left:22px;line-height:1.9;\">\n<li><span><strong>danger:<\/strong> el usuario intent\u00f3 realizar una acci\u00f3n, pero no se pudo completar. <\/span><\/li>\n<\/ul>\n<p class=\"body\" dir=\"auto\"><span> <em>Mostrar notificaciones<\/em> <\/span><\/p>\n<p class=\"body\" dir=\"auto\"><span>Hay dos formas de mostrar notificaciones en Odoo: <\/span><\/p>\n<ul style=\"padding-left:22px;line-height:1.9;\">\n<li><span>El servicio <em>notification<\/em> permite a los componentes mostrar notificaciones desde c\u00f3digo JavaScript llamando al m\u00e9todo add. <\/span><\/li>\n<\/ul>\n<ul style=\"padding-left:22px;line-height:1.9;\">\n<li><span>La acci\u00f3n de cliente <em>display_notification<\/em> permite activar la visualizaci\u00f3n de una notificaci\u00f3n desde Python (por ejemplo, en el m\u00e9todo que se ejecuta cuando el usuario hace clic en un bot\u00f3n de tipo <em>object<\/em>).<\/span><\/li>\n<\/ul>\n<p class=\"body\" dir=\"auto\"><span>  <\/span><\/p>\n<p class=\"body\" dir=\"auto\"><span> <em>Ejemplo de notificaciones en JavaScript<\/em> <\/span><\/p>\n<p class=\"body\" dir=\"auto\"><span>Utilizamos el componente WebClient del archivo <u><a href=\"http:\/\/webclient.js\/\" class=\"Hyperlink SCXW20066643 BCX0 qbe-widget\" rel=\"noreferrer noopener\" target=\"_blank\">webclient.js<\/a><\/u>, mismo que se ejecuta cuando cargamos una nueva ventana de Odoo o la recargamos. El c\u00f3digo es el siguiente (mismo que mapeamos dentro de web.assets_backend del archivo <strong>manifest<\/strong> del m\u00f3dulo):<\/span><span> <\/span><\/p>\n<p><img decoding=\"async\" src=\"https:\/\/exdoo.mx\/blogs\/wp-content\/uploads\/2026\/05\/2-m7Vbn18190IqorBg-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 recargar la p\u00e1gina o entrar por primera vez, vemos ambas notificaciones:<\/span><span> <\/span><\/h3>\n<p><img decoding=\"async\" src=\"https:\/\/exdoo.mx\/blogs\/wp-content\/uploads\/2026\/05\/3-AGBbZJG4l0SWMOoG-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><em>Ejemplo de notificaciones en Python<\/em> <\/span><\/h3>\n<p dir=\"auto\" class=\"body\"><span>Dentro del modelo de ventas (sale.order) declaramos un nuevo bot\u00f3n, el cual crea una nueva venta; \u00fanicamente le a\u00f1adimos el mismo cliente de la venta desde la cual se est\u00e1 presionando el bot\u00f3n con fines de simplicidad. La notificaci\u00f3n mostrar\u00e1 el nombre de la venta, junto con un enlace adjunto que, al presionarlo, nos abrir\u00e1 una nueva ventana del navegador y mostrar\u00e1 la vista formulario de la nueva orden. El c\u00f3digo es el siguiente:<\/span><span> <\/span><\/p>\n<p><img decoding=\"async\" src=\"https:\/\/exdoo.mx\/blogs\/wp-content\/uploads\/2026\/05\/4-Y4LvqZxgDLt2QNx7-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>Esta acci\u00f3n se a\u00f1ade dentro de un bot\u00f3n en la vista formulario de las ventas (se a\u00f1ade el bot\u00f3n a trav\u00e9s de una vista heredada).<\/span><\/h3>\n<p><img decoding=\"async\" src=\"https:\/\/exdoo.mx\/blogs\/wp-content\/uploads\/2026\/05\/5-YleQ1rQ0qOsv8QZL-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>Mismo que se ve de la siguiente forma:<\/span><span> <\/span><\/h3>\n<p><img decoding=\"async\" src=\"https:\/\/exdoo.mx\/blogs\/wp-content\/uploads\/2026\/05\/6-mxBXqD2LeXhZlnvb-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 presionarlo, la notificaci\u00f3n se ve de la siguiente manera:<\/span><span> <\/span><\/h3>\n<p><img decoding=\"async\" src=\"https:\/\/exdoo.mx\/blogs\/wp-content\/uploads\/2026\/05\/7-ALpPa9MpD1UVovKG-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;\" \/><br \/>\n<img decoding=\"async\" src=\"https:\/\/exdoo.mx\/blogs\/wp-content\/uploads\/2026\/05\/8-mjEG3rgzRWIoz0zj-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, a trav\u00e9s de la notificaci\u00f3n, creamos un acceso directo al nuevo registro.  <\/span><\/h3>\n<p dir=\"auto\" class=\"body\"><span><strong>Consejos r\u00e1pidos:<\/strong> <\/span><\/p>\n<ul style=\"padding-left:22px;line-height:1.9;\">\n<li><span>No abuses del uso de las notificaciones, ya que un exceso puede afectar la experiencia del usuario. <\/span><\/li>\n<\/ul>\n<ul style=\"padding-left:22px;line-height:1.9;\">\n<li><span>Define el tipo de notificaci\u00f3n correcto seg\u00fan el contexto. Por ejemplo, una notificaci\u00f3n tipo danger sin una raz\u00f3n clara genera ansiedad o confusi\u00f3n al usuario. <\/span><\/li>\n<\/ul>\n<ul style=\"padding-left:22px;line-height:1.9;\">\n<li><span>Evita notificaciones duplicadas: revisa si ya hay una activa con el mismo mensaje antes de mostrar otra. <\/span><\/li>\n<\/ul>\n<ul style=\"padding-left:22px;line-height:1.9;\">\n<li><span>Ajusta el tiempo de visibilidad. Por ejemplo, las notificaciones breves deben desaparecer r\u00e1pido; las informativas importantes pueden durar un poco m\u00e1s. <\/span><\/li>\n<\/ul>\n<ul style=\"padding-left:22px;line-height:1.9;\">\n<li><span>No uses notificaciones para errores silenciosos; si el usuario no puede hacer nada al respecto, considera usar una advertencia sutil o un log interno. <\/span><\/li>\n<\/ul>\n<ul style=\"padding-left:22px;line-height:1.9;\">\n<li><span>S\u00e9 claro y conciso en los mensajes. Evita textos largos o t\u00e9cnicos. Usa un lenguaje comprensible para el usuario final.<\/span><span> <\/span><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>\u00bfQu\u00e9 son los servicios en Odoo? \ud83d\udcd8 ART\u00cdCULO T\u00c9CNICO Son fragmentos de c\u00f3digo de larga duraci\u00f3n que proporcionan una funcionalidad. Pueden ser importados por componentes (mediante useService) o\u2026<\/p>\n","protected":false},"author":4,"featured_media":622,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[10],"tags":[],"class_list":["post-632","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\/632","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\/4"}],"replies":[{"embeddable":true,"href":"https:\/\/exdoo.mx\/blogs\/wp-json\/wp\/v2\/comments?post=632"}],"version-history":[{"count":3,"href":"https:\/\/exdoo.mx\/blogs\/wp-json\/wp\/v2\/posts\/632\/revisions"}],"predecessor-version":[{"id":1973,"href":"https:\/\/exdoo.mx\/blogs\/wp-json\/wp\/v2\/posts\/632\/revisions\/1973"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/exdoo.mx\/blogs\/wp-json\/wp\/v2\/media\/622"}],"wp:attachment":[{"href":"https:\/\/exdoo.mx\/blogs\/wp-json\/wp\/v2\/media?parent=632"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/exdoo.mx\/blogs\/wp-json\/wp\/v2\/categories?post=632"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/exdoo.mx\/blogs\/wp-json\/wp\/v2\/tags?post=632"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}