Conectividad con Odoo

Más allá de XMLRPC y de API Rest

Ignacio Buioli
- 05/01/2020 - 2 min. de lectura

Si hay algo que me gusta de Odoo es su versatilidad a la hora de conectarse con otras plataformas. Si no te sirve XMLRPC, siempre estará el API Rest; y si API Rest te resulta muy enroscado para tu necesidad, hay múltiples probabilidades para crear tu propio servicio de conexión. Y la solución está en la mejor documentación de Odoo: su propio Código.

¿Controllers para conectarse?

La solución se basa un poco en el concepto de API y en la forma natural que tiene Odoo de comunicarse internamente consigo mismo. No voy a dar muchas vueltas, esta entrada es para quien tiene un conocimiento profundo en la arquitectura de Odoo, puede que algún día hagamos un video pero no será pronto. En XMLRPC requerimos loguearnos antes de solicitar información. Lo positivo con este tipo de conectividad es que no va a ser obligatorio generar una sesión (logueo) para empezar a hacer un read o un write, eso podremos manejarlo desde un controller en específico. La estructura general del mismo será algo así:

@http.route('/ruta/conec', type="json", auth='none', cors='*')
def ruta_conec(self, **kw):

Como podrán apreciar, es simplemente un request de tipo JSON sin ningún tipo de autorización. Desconozco si el cors='*' cumple su función, en algunos manuales de Odoo figura como necesario (pero podría ser en versiones viejas). El punto es que no tendrán problemas con los CORS usando este tipo de controllers (punto a favor sobre API Rest y sobre XMLRPC). A partir de aqui se pueden crear llamadas utilizando request.env[] de Odoo y sudo() en caso de ser una operación protegida (sobre esto, mucho cuidado igualmente).

Iniciar Sesión

Si bien dije que no era necesario, es probable que necesitemos el UID del usuario para realizar muchas operaciónes (campo de vendedor, campo de cliente, campo usuario, etc). Y para esto vamos a tener que iniciar una sesión dentro de Odoo, esto nos da dos ventajas iniciales: que vamos a tener más seguridad sobre las operaciones, y que vamos a tener un registro en el archivo del log sobre quien está iniciando sesión en Odoo (ya que ahora tendremos un nuevo request activo que lo permite). La solución para esto llegó a mi leyendo, como siempre, todo el código del website_sale de Odoo. Podemos resumir el inicio de sesión en solo una línea de código:

uid = request.session.authenticate(kw['db'], kw['login'], kw['password'])

Solución bella y elegante, con un try-except terminamos la magia y tendremos el UID del usuario que inicia sesión en una App externa a Odoo, pero con los datos de Odoo. Como podrán notar, además, me valgo de los parámetros kw de Odoo para el envio de datos, así evitamos hacer cosas extrañas con la URL.

Haciendo request

Cualquier que trabaje con Controllers y Modelos lo sabe. Por ejemplo, si necesitamos información del usuario, teniendo el UID, hacemos esto:

user = request.env['res.users'].search([('id', '=', uid)])

Donde el uid es el ID del usuario. Luego simplemente hacemos un return con un objeto que contenga los campos que queramos. Todo lo que ganamos en velocidad y sencillez lo perdemos en esto, vamos a necesitar construir cada tipo de request que queramos. Lo bueno está a la vista: velocidad y mucho control de accesos.

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.