Aprendiendo a programar en Odoo - Agregando atributos a modelos existentes

28 de marzo de 2024 por
Gustavo Orrillo
| Sin comentarios aún
 

Una de las primeras tareas de un programador junior de Odoo es agregar atributos a modelos ya existentes. Es una manera de bajo riesgo para iniciarse en Odoo. Lo mismo vamos a hacer aquí, vamos a desarrollar un módulo que agrega a las oportunidades (modelo crm.lead) un atributo, la moneda de la oportunidad (en muchos países en Latinoamérica la moneda de la empresa es la moneda del país, ahora la moneda de los costos y de los precios de venta es en USD).

El módulo que vamos a desarrollar lo pueden descargar de nuestro repositorio, y se llama lead_currency.

Bien, después de crear el directorio donde tendremos el módulo (en un directorio disponibilizado en el archivo de configuración de Odoo) creamos un archivo de manifiesto (llamado __manifest__.py) con los siguientes contenidos

{
"name": "Laad Currency",
"version": "17.0.1.0.1",
"category": "CRM",
"installable": True,
"application": False,
"summary": "Lead Currency",
"depends": ["crm"],
"data": [
"views/lead_view.xml",
],
}

Aca los puntos a tener en cuenta son dos. Primero declaramos como dependencia el módulo crm, que es donde se define el modelo a extender (crm.lead) y además está definida la vista que vamos a extender para agregar el nuevo campo. Luego creamos un nuevo archivo __init__.py donde le indicamos a Python que vamos a importar un directorio llamado models (se llama así por convención)

from . import models

Luego en el directorio models, tenemos un nuevo archivo __init__.py donde le indicamos a Python que debe importar un módulo llamado lead.

from . import lead

Y luego creamos un archivo lead.py donde primero importamos las librerías de Odoo que nos permiten interactuar con el ORM

from odoo import fields, models, _, api

Y luego creamos el nuevo campo llamado currency_id, el cual es de tipo many2one debido a que estamos referenciando otro modelo (en este caso res.currency, que es el modelo de las monedas)

currency_id = fields.Many2one('res.currency',string='Moneda')

Paso siguiente, debemos crear un directorio llamado views donde crearemos un archivo llamado lead_view.xml donde extenderemos la vista tipo formulario ya existente de las oportunidades (podemos obtener su external ID utilizando el Developer Mode). 


Y en la extensión de la vista, agregamos el campo currency_id luego de los campos con las etiquetas

<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<record id="crm_lead_currency_view_form" model="ir.ui.view">
<field name="name">crm.lead.currency.view.form</field>
<field name="model">crm.lead</field>
<field name="inherit_id" ref="crm.crm_lead_view_form" />
<field name="arch" type="xml">
<field name="tag_ids" position="after" >
<field name="currency_id" />
</field>
</field>
</record>
</odoo><

Bien, una vez agregada la vista, solo debemos reiniciar Odoo, actualizar la lista de aplicaciones e instalar el nuevo módulo. Luego iremos a la oportunidad y veremos algo así.


Un par de mejoras

La primer mejora que se me ocurre agregarle es quitarle al campo many2one la posibilidad de crear y editar registros (lo cual permite a los usuarios ensuciar y tornar incontrolable los datos maestros). Para ello se agrega la opción no_quick_create y no_edit al campo

<field name="currency_id" 
options="{'no_quick_create': True, 'no_create_edit' : True}" />

Por último, vamos a hacer que campo currency_id tenga un valor default. Dicho valor va a ser el dolar y lo definimos agregando el parámetro default al campo. Dicho parámetro hará la llamada a una función que devolverá el ID del registro del USD.

def _default_currency(self):
return self.env.ref('base.USD').id

currency_id = fields.Many2one(
​'res.currency',
​string='Moneda oportunidad',default=_default_currency)
Gustavo Orrillo 28 de marzo de 2024
Compartir
Categorías
Archivar
Identificarse dejar un comentario