Odoo y el celulares - El proyecto Beeware

Gustavo Orrillo
- 05/09/2022 - 4 min. de lectura


El día de ayer al mediodía leí un newsletter de realpython.com en el que se hablaba de Python y desarrollo mobile. Y se hablaba del proyecto Beeware, el cual es un framework que permite desarrollar aplicaciones en Python y poder utilizarlas en múltiples plataformas (iOs, Android, Windows, MacOS, Linux, Web, tvOS). Y decidí probarlo. En pocas horas pude instalar el framework y desarrollar una aplicación que se conectaba con Odoo. No hice el deployment a Android (lo que haré en los próximos días); pero me permitió conocer el potencial del framework.

Aplicación Hello Odoo

Siguiendo el tutorial de Beeware, hice una aplicación "Hola mundo" y la ejecuté sin problemas. Revisando el código, me encontré que el mismo era bastante parecido a la experiencia que había tenido muchos años atras con wxWidgets (una librería GUI multi-plataforma). Ahora, lo que buscaba era probar la integración de la aplicación con Odoo (concretamente mediante xmlrpc, que es mi manera favorita para conectarme con Odoo). Entonces decidí hacer una nueva aplicación llamada Hello Odoo que lo hiciese:

briefcase new

briefcase es una aplicación que hace scaffolding de un proyecto de BeeWare. En este proyecto, se crea un módulo helloodoo, el cual contiene una aplicación principal llamada app.py en donde vamos a tener el código que mostrará la ventana principal de la aplicación, agregará los campos en los cuales el usuario podrá ingresar las credenciales de acceso, tendrá un botón para hacer el login y mostrará la versión de Odoo al que se conecta junto con el uid retornado por el login a Odoo. El código del app.py es el siguiente:

import toga
from toga.style import Pack
from toga.style.pack import COLUMN, ROW
import xmlrpc.client
class HelloOdoo(toga.App):

    def startup(self):
        main_box = toga.Box(style=Pack(direction=COLUMN))

        # user
        user_label = toga.Label(
            'User: ',
            style=Pack(padding=(0, 5))
        )
        self.user_input = toga.TextInput(style=Pack(flex=1))
        user_box = toga.Box(style=Pack(direction=ROW, padding=5))
        user_box.add(user_label)
        user_box.add(self.user_input)

        # pwd
        pwd_label = toga.Label(
            'Password: ',
            style=Pack(padding=(0, 5))
            )
        self.pwd_input = toga.PasswordInput(style=Pack(flex=1))
        pwd_box = toga.Box(style=Pack(direction=ROW, padding=5))
        pwd_box.add(pwd_label)
        pwd_box.add(self.pwd_input)

        # url
        url_label = toga.Label(
            'Url: ',
            style=Pack(padding=(0, 5))
        )
        self.url_input = toga.TextInput(style=Pack(flex=1))
        url_box = toga.Box(style=Pack(direction=ROW, padding=5))
        url_box.add(url_label)
        url_box.add(self.url_input)

        # db
        db_label = toga.Label(
            'Db: ',
            style=Pack(padding=(0, 5))
        )
        self.db_input = toga.TextInput(style=Pack(flex=1))
        db_box = toga.Box(style=Pack(direction=ROW, padding=5))
        db_box.add(db_label)
        db_box.add(self.db_input)

        # output
        output_label = toga.Label(
            'Output: ',
            style=Pack(padding=(0, 5))
        )
        self.output_input = toga.TextInput(style=Pack(flex=1))
        output_box = toga.Box(style=Pack(direction=ROW, padding=5))
        output_box.add(output_label)
        output_box.add(self.output_input)

        button = toga.Button(
            'Login',
            on_press=self.do_login,
            style=Pack(padding=5)
        )

        main_box.add(user_box)
        main_box.add(pwd_box)
        main_box.add(url_box)
        main_box.add(db_box)
        main_box.add(output_box)
        main_box.add(button)

        self.main_window = toga.MainWindow(title=self.formal_name)
        self.main_window.content = main_box
        self.main_window.show()

    def do_login(self, widget):
        db = self.db_input.value
        url = self.url_input.value
        username = self.user_input.value
        password = self.pwd_input.value
        common = xmlrpc.client.ServerProxy('{}/xmlrpc/2/common'.format(url))
        res = common.version()
        uid = common.authenticate(db, username, password, {})
        print("DEBUG", str(res), uid)
        self.output_input.value = str(res) + ' - ' + str(uid)

def main():
    return HelloOdoo()

Luego ejecutamos la aplicación por medio del siguiente comando:

briefcase dev

Lo que mostrará la siguiente ventana de diálogo, la cual al ingresarse las credenciales te permite ver la información de conección de Odoo:


En el campo output verán el resultado de la versión de Odoo junto con el UID devuelto por el método authenticate. Para conectarme con Odoo, use xmlrpc porque es lo que mejor conozco desde hace más de diez años. Y fue bastante sencillo hacerlo, solo me llevó un par de horas leer la documentación de Beeware y desarrollar esta aplicación. Si quieren tener acceso al código de la aplicación, la pueden encontrar en nuestro github.

Conclusiones

Odoo siempre tuvo un gran problema para integrarse con el mundo mobile. Y dicha barrera siempre fue el lenguaje de desarrollo de las plataformas móviles. Siempre se requería con mucha suerte que el desarrollador conozca no solo de desarrollo de Odoo (el cual ya tiene una importante curva de aprendizaje) sino además otro lenguaje de programación junto con otro framework (por ejemplo Javascript con Angular). Los cuales de por si tienen una importante curva de aprendizaje. Y seamos sinceros; uno no puede esperar dos o tres años para desarrollar aplicaciones de manera productiva. Tampoco es muy facil encontrar programadores que cumplan con dichos requisitos: Odoo más conocimientos de desarrollo mobile. Un framework como Beeware sería una solución a dicho problema.

En el lado negativo; Beeware aun es un proyecto muy joven y le faltan kilómetros. Su documentación está en progreso y su equipo de desarrolladores de a poco está creciendo. Necesita tiempo, y por sobre todo financiación para que llegue a ser de la envergadura de Ionic que es a lo que debería apuntar. También le falta una mejor integración con los dispositivos móviles; cámaras, GPS, lectores de código de barra para dar algunos ejemplos. Muchos usuarios cuando se acercan a los dispositivos móviles esperan esa integración la cual es muy dificil de de ser brindada por un framework. Tambien sería necesario conocer que opciones hay para acceder a bases de datos de forma off-line.

Igual creo que es prometedora. Estoy muy entusiasmado con este framework. Lo que quiero conocer ahora es el deployment de la aplicación, como hacer para que la misma se ejecute en mi celular. Si pasa esa prueba es un golazo, ya que permitiría empezar a desarrollar aplicaciones que por pronto muestren información de Odoo (lo cual no es poco) en un dispositivo celular (sin necesidad de hacer una aplicación web de la parte de Odoo, que es la opción natural para ello).

Mis próximos pasos serán armar la aplicación y prepararla para ejecutarla en un celular. Luego de ello, estudiaré mejor que opciones brinda el Toga para la interface de usuario. Así que los mantendré al tanto. 

Acerca de:

Gustavo Orrillo

Passionate about programming, he has implemented Odoo for different types of businesses since 2010. In Moldeo Interactive he is a founding Partner and Programmer; In addition to writing on the Blog about different topics related to the developments he makes.