Odoo. Añadir una nueva acción al menú “Actions”

¿Que deseamos hacer?

Trabajando con un modulo de OCA para el bloqueo de números de series o lotes para evitar su venta, comprobamos que era algo incomodo de trabajar cuando el producto poseía muchos lotes o números de serie. La idea era poder seleccionar un número de registros y poder cambiar su estado con tan solo una acción.

La decisión fue crear una nueva “Acción” que nos permita realizar este proceso, vamos a ello.

Creando el nuevo menuitem.

Odoo posee un menú de Acciones para realizar distintas operaciones sobre los registros seleccionados, a este le vamos a incorporar las nueva acción que necesitamos. Lo primero por tanto es localizar donde se encuentra ese menú.

Dentro del nuestro modulo y entrando en modo desarrollador podremos editar la vista : Lista

Image for post

En esta vista obtenemos los datos fundamentales para insertar una nueva acción. En nuestro xml insertamos el siguiente elemento.

<record id="action_lock_stock_lot" model="ir.actions.server">
<field name="name">Lock Lot</field>
<field name="model_id" ref="stock.model_stock_production_lot"/>
<field name="binding_model_id" ref="stock.model_stock_production_lot"/>
<field name="state">code</field>
<field name="code">
if records:
records.action_lock_stock_lot()
</field>
</record>

Vamos a describirlo por partes, creamos un “record” cuyo identificador es único “action_lock_stock_lot” que pertenece al modelo “ir.actions.server”, con lo que estamos indicando a odoo que deseamos crear una acción de tipo “server”, para ejecutar código python al seleccionar esta opción de menú.

Le asignamos un nombre a la opción de menú “Lock Lot” para indicar claramente que al ejecutar esta nueva opción se bloquearan todos los lotes que estén seleccionados.

Tanto “model_id” como “binding_model_id” apuntan al mismo modelo en este caso, “stock.model_stock_production_lot”.

En el campo “state” indicamos que su valor va a ser “code”, asi señalamos que al realizar esta acción se ejecutara el código que esta en el apartado “code”.

En este caso llamamos al método “action_lock_stock” si hay registros seleccionados.

Ya dentro del modelo describimos el método, que lo único que hace es colocar el valor “locked” a verdadero sobre la colección de registros.

def action_lock_stock_lot(self):
for product in self:
product.locked = True

Os ruego que leáis el enlace que os dejo a continuación sobre las Server Actions, donde podréis descubrir más sobre esta potente herramienta que incorpora odoo.

Image for post

Links

Modulo original.

Módulo modificado con las nuevas opciones.

Documentación de odoo.

Impresión con Odoo y CUPS