Como crear SmartButtons en Odoo

Los SmartButtons nos permiten convertir los formularios de Odoo en auténticos cuadros de mando. A través de estos botones de formulario, podemos dar acceso a los usuarios desde un registro de un modelo concreto, a todos los registros relacionados con éste de otro modelo diferente. Por ejemplo, ver todas las compras de cliente, sus ventas, facturas… y todo lo que podamos imaginar.

Un SmartButton se crea principalmente en 2 pasos:

1.- Creando una acción de ventana (act_windows)

2.- Creando un botón en el formulario (oe_stat_button) enlazado a la acción de ventana

Veamos un sencillo ejemplo, en la que crearemos un botón en el formulario de contratos, para ver todas las ventas relacionadas con ese contrato:

1.- Creación del action

El action.act_window es el encargado de enlazar nuestro formulario de contrato, con el listado de ventas relacionado. Para esto, creamos la acción dándole un id propio, el model siempre será “ir.actions.act_window” para indicarle que estamos creando una acción de ventana, y a continuación 3 lineas: name: nombre de la acción a nuestro antojo, res_model: modelo al que queremos que nos lleve la acción, en este caso las ventas (sale.order), y domain: un regla que define que registros del modelo (sale.order) debe mostrar, en este caso, todos los que tengan el campo project_id igual al id del contrato que esta activo en el momento en el que se llame a la acción (para esto usamos la variable active_id)

<record id="sale_order_action_project_id" model="ir.actions.act_window">
        	<field name="name">Sales</field>
                <field name="res_model">sale.order</field>
	    	<field name="domain">[('project_id', '=',active_id)]</field>
</record>

2.- Creación del botón 

Ahora que ya tenemos el action preparado, debemos crear un botón que llamará a este actión dentro del formulario de contratos. Para esto vamos a crear una vista xml que hereda y amplia la vista de formulario del contrato añadiéndole este botón. El código que realmente inserta el botón, es el que vemos precedido por la etiqueta button, donde se le indica el tipo de botón (oe_stat_button), el icono que mostrara (fa-…) -siempre se pueden probar los iconos de http://fontawesome.io/icons/-, el nombre de la acción (entre paréntesis, precedidos de un % y con el sufijo d), string será el nombre mostrado en el botón y help la ayuda mostrada al poner el puntero encima del mismo.

El resto del código es el correspondiente a crear una vista, con su id, nombre, modelo, herencia (para heredar de la vista formulario de contrato, y la expresión xpath que se encarga de buscar en la vista original la parte donde meter el código (en este caso la etiqueta div con el nombre buttons) y la posición donde debe meter el código que sigue al xpath (en este caso, dentro del propio div -inside-).

<record id="view_account_analytic_account_form" model="ir.ui.view">
            <field name="name">account.analytic.account.button.sales</field>
            <field name="model">account.analytic.account</field>
            <field name="inherit_id" ref="analytic.view_account_analytic_account_form" />
            <field name="arch" type="xml">
                <xpath expr='//div[@name="buttons"]' position='inside'>
                    <button class="oe_stat_button" type="action" icon="fa-strikethrough"
                        name="%(nombremodulo.act_analytic_sales)d"
                        string="Sales" help="Sales related with this contract">
                    </button>
                </xpath>
            </field>
 </record>

Cargando esto en nuestro módulo, tendremos un útil botón en los contratos que nos llevará a un listado de todas las ventas relacionadas con este contrato. Atención a sustituir “nombremodulo” por el nombre de nuestro módulo.

Este SmartButton puede tener multitud de opciones más, como por ejemplo un contador que te muestre el número de ventas asociadas al contrato en el propio botón, o un valor de contexto para que cuando cargue la vista de ventas puedas tener valores por defecto (en el caso por ejemplo de darle a crear una venta desde esa vista), puedes especificar una vista concreta a cargar (un id de vista), incluso que te cargue las ventas pero con unos filtros y agrupaciones (vista de búsqueda, search_view) concreta, en vez de la genérica… Como puedes ver, las opciones son demasiado numerosas para explicarlas todas en un solo post, si necesitas algo más concreto, no dudes en preguntarnos 😉

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *