Hay veces que necesitamos copiar módulos entre diferentes proyectos de odoo.sh. Por lo general esto sucede cuando un cliente se lleva a las patadas con el partner que le implementó Odoo y la cuenta de github del proyecto de odoo.sh es de este último partner. Mas alla de este enfoque bastante primitivo de lock-in del partner (la verdad es una estrategia de lock-in bastante picapiedra), lo ideal es que el cliente tenga su proyecto de odoo.sh en su repositorio de github.
Bueno, para lograr ello más alla de necesitar un nuevo proyecto de odoo.sh (lo cual se puede arreglar con su account manager de Odoo) se necesitan pasar todos los módulos de un proyecto a otro. Y como se hace para obtener los fuentes del proyecto de odoo.sh? Se lo puede hacer de la siguiente manera.
Primero desde el shell de odoo.sh se deben copiar los contenidos del directorio /home/odoo/src al directorio /tmp. Y una vez que se copiaron dichos contenidos, zipearlos con su herramienta de compresión favorita (y permitida por odoo.sh). Supongamos que el archivo comprimido que creamos es
/tmp/user.tar.gz
Ahora, una vez que se hizo eso se debe crear un nuevo módulo con un controller. La idea es descargar los contenidos del archivo del directorio tmp. Para ello cuando el usuario navega a una URL determinada (por ejemplo /tmp/download) se descargará un objeto werkzeug binario (werkzeug es una de las librerías que Odoo usa desde hace décadas para su web)
from odoo import http
from odoo.http import request
import os
class TmpDownloadController(http.Controller):
@http.route('/tmp/download/<string:token>', type='http', auth='public', csrf=False)
def download_tmp_file(self, token):
SECRET = os.environ.get("TMP_DOWNLOAD_TOKEN", "changeme")
if token != SECRET:
return request.not_found()
path = "/tmp/user.tar.gz"
return request.make_response(
open(path, 'rb'),
headers=[
('Content-Type', 'application/gzip'),
('Content-Disposition', 'attachment; filename="user.tar.gz"'),
]
)
En este caso le pedimos tambien al usuario que pase un token (por si queremos darle una mínima seguridad al tema). Y listo, cuando el usuario navegue a dicha URL el browser descargará los contenidos del archivo zipeado con los fuentes. Luego de hacerlo, no se olvide de desinstalar el módulo.