Creación de Modelos en Odoo

En Odoo un modelo es el encargado de interactuar con los datos. Estos modelos no son mas que archivos Python que están almacenados en la carpeta models.

Esta publicación es la segunda parte del desarrollo de un módulo desde cero.

# -*- coding: utf-8 -*-
from odoo import models, fields


class PurchaseRequest(models.Model):
_name='purchase.request'
_description = 'Solicitudes de compras'

name = fields.Char('Nombre')
state = fields.Selection(selection=[
('draft', 'Borrador'), ('post', 'Publicada')
], string='Estado', default='draft')
partner_id = fields.Many2one(comodel_name='res.partner', string='Colaborador')
purchase_lines = fields.One2many(
comodel_name='purchase.request.line',
inverse_name='purchase_id',
string='Detalle'
)
message = fields.Text(string='Motivo')

def action_post(self):
self.state = 'post'

Empezamos primero creando la clase PurchaseRequest la cual hereda de models.Model.  Con la variable _name le asignamos al modelo un nombre y con la variable _description un título.

la creación de campos en nuestro modelo corre a cargo de fields. En nuestro ejemplo estaremos trabajando con cinco tipos de campos diferentes:

Con la clase fields.Char declararemos nuestra campo name, en ella almacenaremos el nombre de la solicitud. El único parámetro que enviamos, string=' Nombre' es utilizado por el sistema para ser mostrado en el apartado visual. Al ser el primer parámetro que reciben todas las clases en fields, podemos ignorar el nombre del parámetro y enviar directamente el valor.

Nuestra segunda variable es state y es de tipo selección. Con este campo le indicaremos al sistema el estado de la solicitud. Los valores enviados en este tipo de campo son tuplas almacenadas en un lista. Estas tuplas contienen dos valores: el primer sera el valor a guardar en la base de datos y el segundo el valor a mostrar en la interfaz. Como declaramos primero el parámetro selection, deberemos utilizar forzadamente el parámetro string con su correspondiente nombre, el último parámetro declarado corresponde al valor que tendrá nuestra campo cuando se este creando un nuevo registro.

partner_id y purchase_lines son campos relacionados. El primero enlaza nuestro modelo actual con el modelo res.partner siendo la relación de muchos a uno, el atributo string indica que nuestra columna tendrá como título Colaborador y este sera el texto visualizado en las vistas. El campo purchase_lines es un poco mas compleja y en este caso enlaza al modelo purchase.request.line. Estas relaciones son llevadas a cabo por el parámetro comodel_name

En Odoo cuando trabajamos con campos One2many debemos indicar al sistema el campo de relación en el otro modelo, propiedad realizar con inverse_name.

Finalizamos nuestro modelo con el método action_post, este método sera llamado en nuestra vista. En Odoo debemos tener cuidado cuando trabajamos con los métodos que estén dentro de un modelo, esto debido a la forma en que se consulte los registros, en este caso como el botón se disparara desde un formulario, conocemos que es un solo registro pero si dicho botón fuera ejecutado en modo multi registro provocaría un error. De ejecutarse en modo multi registro se debería ver de la siguiente forma:

def action_pos(self):
for record in self:
record.state = 'post'

Ahora continuaremos con el código encargado de guardar el detalle de los productos que estamos solicitando.

class PurchaseRequestLine(models.Model):
_name='purchase.request.line'
_description='Detalle de la solicitud de compras'

purchase_id = fields.Many2one(comodel_name='purchase.request', string='Solicitud')
product_id = fields.Many2one(comodel_name='product.product', string='Producto')
quantity = fields.Integer(string='Cantidad')

Al igual que el código anterior definimos el nombre y descripción del modelo, asignamos un campo de relación con el modelo anterior, un campo de enlace con los productos  y por último un campo donde se almacenara la cantidad que se esta solicitando.

Como se indicaba anteriormente, los campos One2many requieren definir cual es el campo de enlace, este campo debe existir en el modelo enlazado y esto lo vemos cuando creamos el campo purchase_id.

Antes de finalizar con la sección de modelos debemos validar que nuestro archivo __init__.py este llamando al archivo python donde hemos declarado nuestro código

# -*- coding: utf-8 -*-
from . import purchase_request

De igual forma validar que el __init__.py principal este llamando a la carpeta models

# -*- coding: utf-8 -*-
from . import models

Por el momento no es posible hacer uso del módulo en Odoo, esto por motivo que se requieren algunos componentes importantes: las vistas, menús y permisos de acceso, propiedades que sera explicadas en las siguientes publicaciones.