Modificando el campo state en Odoo

16 de enero de 2024 por
Gustavo Orrillo
| Sin comentarios aún
 

Muchas veces nos piden que modifiquemos el campo state (Status) en Odoo. Lo piden por diferentes motivos; principalmente reflejar la información del status del documento más el status de otro documento relacionado (por ejemplo en las facturas con los pagos, piden agregar un nuevo estado llamado "Facturas Pagadas")

Como lo soluciona Odoo?

Odoo para estas situaciones no modifica el campo state en si mismo. En Odoo se agregan campos adicionales que reflejan el status del document relacionado, Por ejemplo con el campo payment_state del modelo account.move. Con este campo muestran el status de los pagos relacionados (en lugar de embarrar los contenidos del campo state). 

Lo hacen así por dos motivos. El primer motivo es que no quieren embarrar los contenidos del campo state con otros valores (podriamos tener mas de diez valores diferentes para el campo state). No solo es más prolijo sino ademas complica muchísimo las búsquedas.

El otro motivo es que modificar el campo state significa modificar cada uno de los lugares donde se actualiza dicho campo. Y no es que sean cambio fáciles, pero si son cambios sensibles y que se deben hacer en muchos lugares. Es un cambio riesgoso en otras palabras.

Es por ello que la solución ideal es crear otro campo computado con el status de los documentos relacionados. No es complicado. El problema es explicarselo al usuario y convencerlo, lo cual no todas las veces es posible.

Que hacer si no nos queda otra que modificar el campo state?

Ahora hay veces que no podemos convencer al usuario de agregar un campo extra y nos vemos obligados a cambiar el campo state. Que podemos hacer?

Lo que solemos hacer es crear otro campo computado que calcule el nuevo valor del campo state y que dicho campo reemplace en las vistas al campo state. Supongamos que llamamos al nuevo campo display_state.

DISPLAY_STATE_VALUES = [
​('draft','Borrador'),
​('new_state','Nuevo Estado'),
​('done','Finalizado'),
​]

def _compute_display_state(self):
​for rec in self:
​res = #logica que calcula el nuevo valor del campo
​rec.display_state = res
display_state = fields.Selection(selection = DISPLAY_STATE_VALUES, 
​strig='Status',
​compute=_compute_display_state)

Como hacemos con las vistas? Ocultamos el campo state (por las dudas que existan otros campos que dependan de su presencia). Por ejemplo en las vistas tipo tree:

<field name="state" position="attributes">
​<attribute name="invisible">1</attribute>
</field>
<field name="state" position="after">
​<field name="display_state"></field>
</field>

Y en las vistas tipo formulario hacemos algo parecido, solo le agregamos el widget statusbar al campo display_state:

<field name="state" position="attributes">
​<attribute name="invisible">1</attribute>
</field>
<field name="state" position="after">
​<field name="display_state" widget="statusbar"></field>
</field>

Es una solución no del todo convencional, pero cumple su cometido. Y nos ahorra mucho tiempo de desarrollo.

Gustavo Orrillo 16 de enero de 2024
Compartir
Categorías
Archivar
Identificarse dejar un comentario