Agregando columnas Many2many a productos

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

Para caracterizar (o categorizar) a un objeto en Odoo hay al menos dos enfoques: el que vemos con la columna de las categorías (que implementa un campo many2one) o agregar un campo many2many para agregar múltiples características al producto (u otro objeto, por ejemplo puede ser un partner o puede ser una oportunidad)

Lo que vamos a hacer en este post es implementar esta clasificación (o caracterización) creando un modelo llamado product.characteristics (no se me ocurrió mejor nombre) y agregarlo al producto. Este módulo lo pueden descargar de nuestro repositorio

Primero creamos un módulo con su archivo __manifest__.py

{
'name': "Product Characteristics",
'category': 'Sales',
'version': '0.1',
'depends': ['product'],
'data': [
'security/ir.model.access.csv',
'views/characteristics_view.xml',
'views/product_view.xml',
],
'assets': {},
}

Paso seguido, creamos un archivo de Python (characteristics.py) donde definimos el nuevo modelo

from odoo import fields, models, api, _

class ProductCharacteristic(models.Model):
_name = "product.characteristic"
_description = "product.characteristic"

name = fields.Char('Nombre')

Y agregamos sus reglas de acceso por medio del archivo ir.model.access.csv que encontramos en el directorio security (muy importante, si no hacemos esto no podemos ver los menúes que nos permiten administrar el modelo creado)

id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_product_characteristic,product.characteristic,model_product_characteristic,base.group_user,1,1,1,1

Bien, ahora vamos a agregar un archivo xml donde definimos el menú (el cual lo agregamos a la aplicación de Inventarios... quiza algún día podríamos definir un menú de Master Data pero va a ser complicado controlar los permisos de acceso a ese menú), la acción que invoca la vista tipo lista, y la vista tipo lista.

<?xml version="1.0" encoding="utf-8"?>
<odoo>

<record id="product_characteristic_tree" model="ir.ui.view">
<field name="name">product.characteristic.tree</field>
<field name="model">product.characteristic</field>
<field name="arch" type="xml">
<tree string="Caracteristicas" editable="bottom">
<field name="name" />
</tree>
</field>
</record>

<record id="action_product_characteristics" model="ir.actions.act_window">
<field name="name">Caracteristicas</field>
<field name="res_model">product.characteristic</field>
<field name="view_mode">tree,form</field>
</record>

<menuitem id="menu_product_characteristics"
name="Caracteristicas"
parent="stock.menu_stock_inventory_control"
action="action_product_characteristics"
sequence="100"
/>

</odoo>

Lo que podemos ver en este menú


Y en esta lista


La cual se puede editar como una planilla de cálculo (gracias al atributo editable="bottom" en el elemento tree de la vista).

Ahora vamos a agregar el campo de las características al modelo product.template. Eso lo hacemos agregando un archivo product.py donde extendemos el modelo product.template y agregamos la columna:

from odoo import fields, models, api, _

class ProductTemplate(models.Model):
_inherit = "product.template"

characteristic_ids = fields.Many2many(
comodel_name='product.characteristic',
relname='characteristic_rel',
col1='tmpl_id',
col2='char_id',
string='Caracteristicas')

Y en la definición del campo definimos no solo el modelo con el que nos vamos a relacionar, sino ademas la tabla de la base de datos donde se almacenará la relación y las columnas para cada una de las tablas relacionadas.

Por último, agregamos el campo a la vista del producto. Al agregar el campo definimos su widget, el cual permite agregar la relación como si fuesen tags (muy simpático) 

    <record id="chaacteritic_product_search" model="ir.ui.view">
<field name="name">characteristic.product.search.form</field>
<field name="model">product.template</field>
<field name="inherit_id" ref="product.product_template_search_view" ></field>
<field name="arch" type="xml">
<field name="categ_id" position="after">
<field name="characteristic_ids" />
</field>
</field>
</record>

Esto nos permite ver el producto de la siguiente manera


Gustavo Orrillo 20 de marzo de 2024
Compartir
Categorías
Archivar
Identificarse dejar un comentario