Actualizando external IDs con scripts de XMLRPC

13 de abril de 2024 por
Gustavo Orrillo
| Sin comentarios aún
 

Los external IDs en Odoo son identificadores que podemos asignarles a cada registro en Odoo de forma manual. Cada fila en Odoo tiene su clave primaria (un ID) que mantiene la base de datos. De eso no nos tenemos que preocupar. Ahora si queremos asignarle un identificador manual al registro, podemos hacerlo utilizando los external IDs (los cuales son persistidos en el model ir.model.data)


Ya hablamos de como utilizar los external IDs en post anterior. Ahora vamos a hablar de como podemos actualizar los external IDs de forma masiva debido a que podemos llegar a necesitarlos con otros fines (por ejemplo cargar datos con el método load).

Bien, como decíamos, para crear un external ID de cualquier registro de un modelo solo debemos crear una fila en el modelo ir.model.data, actualizando los siguientes campos:

  • model: nombre del modelo
  • name: nombre del módulo que queremos asignarle. Puede ser cualquier cosa, por ejemplo batman. Pero mejor que sea descriptivo
  • res_id: con el ID del registro al cual queremos asignarle un external_id

Bien, ahora vamos al ejemplo del script de xmlrpc. Supongamos que querramos crear un external ID para cada categoría de producto. El external ID como ya sabemos consta de dos partes: nombre del módulo (este será josefina) y nombre del registro (no debe contener espacios, en este caso será el nombre de la categoría)

#!/usr/bin/python3

# import xmlrpc and openpyxl modules
from xmlrpc import client
from datetime import datetime

url = 'http://localhost:10069'
common = client.ServerProxy('{}/xmlrpc/2/common'.format(url))
res = common.version()

dbname = 'josefina-v1'
user = 'admin'
pwd = 'admin'
uid = common.authenticate(dbname, user, pwd, {})
models = client.ServerProxy('{}/xmlrpc/2/object'.format(url))

# prints Odoo version and UID to make sure we are connected
print(res)
print(uid)

categ_ids = models.execute_kw(dbname,uid,pwd,'product.category','search',[[]])
for i,categ_id in enumerate(categ_ids):
print(i,categ_id)
categ_data = models.execute_kw(dbname,uid,pwd,'product.category','read',[categ_id,['name']])
print(categ_data)
external_id = models.execute_kw(dbname,uid,pwd,'ir.model.data','search',[[['res_id','=',categ_id],['model','=','product.category']]])
if not external_id:
vals = {
'name': categ_data[0].get('name').replace(' ','_'),
'model': 'product.category',
'module': 'josefina',
'res_id': categ_id,
}
return_id = models.execute_kw(dbname,uid,pwd,'ir.model.data','create',[vals])
print(return_id)

Como podemos ver; busca cada categoría, la lee, chequea que no tenga external ID, y luego crea el registro correspondiente. Ahora si vemos los metadatos de una categoría, podemos observar que ya tiene el external ID que acabamos de asignarle


Comprendan como funcionan los external IDs, son un recurso muy util para el desarrollador de Odoo.

Gustavo Orrillo 13 de abril de 2024
Compartir
Categorías
Archivar
Identificarse dejar un comentario