Importación masiva de imágenes entre dos Odoo

Ignacio Buioli
- 02/13/2020 - 1 min. de lectura

Lo hemos dicho muchas veces, de las mejores herramientas de Odoo para migrar entre versiones es XMLRPC (a pesar de no ser su funcionalidad principal). Es más rápida que con un CSV y permite debuguear. No obstante, a veces hay situaciones donde ni así conseguimos una migración limpia.

Caso reciente, un Odoo 8 alojado en Odoo.com que debía ser migrado parcialmente a un Odoo 13 en un server linode. El problema es que en Odoo.com se utiliza una cuenta Odoo para loguearse y el password está cifrado con oauth2. En mi caso podía valerme de utilizar un archivo CSV extraído del Odoo 8 y recorrerlo mediante un script de Python para crear los registros con XMLRPC. Pero eso es viable para data sencilla como ID y Nombre, cuando hay que traer imágenes en base64 el server de Odoo 8 se frenará antes de crear el archivo CSV. Y en este caso eran casi 10 mil registros, muchos con imágenes en calidad HD. Para esto la solución consiste en valerse un poco del sistema de links de Odoo. Un link hacia una imagen pública de Odoo tiene esta estructura:

http://<server>/web/image/<model>/<id>/image

Por ejemplo, para obtener la imagen del ID 15 del modelo product.template podemos hacer eso:

http://<server>/web/image/product.template/15/image

Siempre teniendo en cuenta que el registro debe ser público (por ejemplo, productos o contactos publicados en el website). En las versiones más viejas de Odoo en lugar de /web era /website, es un detalle a tener en cuenta. Utilizando esto como base, el script que ideé para traer imágenes es algo así:

import base64
import request

def get_as_base64(url):
        return base64.b64encode(requests.get(url).content)

Es sumamente sencillo, y se usa en conjunción con XMLRPC y un archivo CSV que traiga solo los ID y los nombres, quedando algo así:

with open('product.template.csv') as csv_file:
        csv_reader = csv.DictReader(csv_file, delimiter=',')
        for row in csv_reader:
                image = get_as_base64(server+'/website/image/product.template/'+ row['id'] +'/image')
Una vez que se obtiene el request en la variable image quedará un base64 de la imagen, que podremos utilizar para escribir el campo image de un registro preexistente, o crear uno nuevo con la imagen. Recordar que en Odoo 13 el campo image ya no existe, y deberemos escribir sobre image_1920.

Acerca de:

Ignacio Buioli

Degree on Multimedia Arts. He has developed numerous Multimedia projects as well as written articles and translated texts of the mentioned subject. In Moldeo Interactive, He is a Partner and Programmer; also taking care of a large part of the online networks and courses.