Que es el ORM? Y que son los módulos de Odoo?

12 de noviembre de 2023 por
Gustavo Orrillo
| Sin comentarios aún
 

Los desarrolladores a menudo escuchamos que debemos interactuar con el ORM de Odoo para lo que sea (consultar información, crear registros, actualizarlos, etc.). Ahora, que es el ORM? Por que debemos utilizarlo? En el evento Odoo Experience 2023 hubo una muy buena charla sobre porque el ORM de Odoo era diferente a otros ORMs, entonces me parece que es una buena oportunidad para hablar sobre el ORM de Odoo.


Y también quiero dejar claro que el ORM es uno de los heroes poco conocidos (junto con PostgreSQL y Python) de la popularidad de Odoo. De eso tambien quiero hablar en estas líneas. Odoo es muy popular para el desarrollo gracias a la facilidad y productividad que obtiene el programador gracias al ORM. 

Dicha productividad (junto con las herramientas para hacer via web formularios, listas y reportes) le generó una popularidad en la comunidad de desarrolladores que es similar a la popularidad de Clipper a fines de los 80s y principios de los 90s (el que escribe se inició en la programación gracias al Clipper), Oracle Forms e Informix 4GL (el cual sigue vigente 20 años despues que IBM comprase Informix). Es por eso que quiero hablar un poco del ORM. 

Que es Odoo?

Como muy bien se explica en el video anteriormente indicado, Odoo es 

  • Un conjunto integrado de aplicaciones (módulos, por ejemplo Contabilidad y MercadoLibre)
  • Cuenta con un core abierto, open source
  • Una aplicación abierta a la extensión por parte de terceros
  • Una aplicación capaz de soportar múltiples bases de datos
  • Un framework que cuenta con el ORM que facilita el desarrollo de aplicaciones

A nivel tecnológico Odoo se basa en los siguientes componentes a nivel infraestructura:

  • Lenguage Python (para el backend)
  • Lenguaje Javascript (para el front-end)
  • PostgreSQL (para la base de datos)

Como pueden ver, estos tres componentes (algunos los pueden tildar de tecnologías aburridas) son muy estables y cuentan con más de veinticinco años en el mercado.

Que es lo que se incluye en Odoo?

  • Cliente web (desarrollado con Javascript)
  • Infraestructura de seguridad para usuarios y permisos (utilizada por el ORM)
  • Soporte multicompañía (utilizado por el ORM)
  • Posibilidad de crear y extender modelos y campos (utilizado por el ORM)
  • Tareas sincrónicas y asincrónicas

Que es el ORM de Odoo?

El ORM de Odoo es el componente del backend de Odoo que principalmente abstrae al programador del acceso a la base de datos. Este componente se situa entre los diferentes módulos de negocios (por ejemplo Contabilidad, Ventas, Stock) y la base de datos, gestionando el flujo de información entre ellos.

El ORM le brinda al programador un API mediante la cual se puede actualizar o leer la base de datos como si fuesen objetos de Python. Y eso le simplifica enormemente la vida al programador abstrayendolo del acceso a los datos. Si bien uno puede acceder a la base de datos directamente mediante SQL, uno corre varios riesgos. 

El primer riesgo es de seguridad, ya que no tendríamos control sobre la autorización de las actualizaciones o lecturas de los datos. El segundo riesgo es la integridad de los datos, cada actualización de los datos mediante el ORM deja los datos de Odoo en forma integra y no corrupta. En cambio haciendolo mediante SQL uno puede corromper los datos (como le sucedió al autor en una de sus primeras experiencias con Odoo, antes llamado OpenERP).

La gran desventaja del ORM es a nivel performance. A veces el overhead que brinda el ORM puede ser inaceptable y por ello nos vemos obligados a actualizar o leer los datos mediante SQL (por ejemplo si tenemos que crear miles de números de serie en forma instantanea, o sino revisen el código del módulo account para ver la cantidad de lugares donde se utiliza SQL).

A que se debe este over-head agregado? Cada vez que Odoo actualiza un campo lo hace (a modo de ejemplo) de la siguiente manera:

mi_campo = 'Hola mundo'

Y el ORM no hace solo un update, hace (entro otras cosas) lo siguiente:

  • Chequear los permisos del usuario para actualizar el campo
  • Asegurarse que este campo cumple con reglas multi-compañía
  • Actualiza el campo mediante SQL
  • Y ademas (y no es menor esto) recomputa los valores de los campos computados que dependen del campo siendo actualizado.

 Que son los módulos de Odoo?

La vida de un desarrollador de Odoo gira alrededor de los módulos customizados. Y no los módulos del core, sino modulos custom que uno desarrollo para mantener o agregar nuevas funcionalidades para la empresa con la que uno está trabajando. El 95% de los módulos que están dando vuelta son módulos de backend, los cuales mediante el ORM extienden la funcionalidad de los módulos del core de Odoo.

Que es un módulo? Es un módulo de Python empaquetado que facilita la modularización del desarrollo en Odoo. Esto se lo hace mediante archivos __init__.py y el archivo de manifiesto __manifest__.py (más sobre eso en otros posts)

Que hace un módulo? Toma un objeto definido en el core y le agrega nuevas funcionalidades. Eso lo realiza con el ORM y lo hace de la siguiente manera:

class AccountMove(models.Model):
​ _inherit = 'account.move'
    referencia = fields.Char('Referencia')
    def unlink(self):
​raise ValidationError('No se puede borrar el registro')

Lo que acaba de hacer es extender el modelo (o tabla) de facturas agregandole un nuevo campo (en este campo referencia) y deshabilitando el borrado de registros.

De esta manera uno puede definir tambien nuevos modelos, o extender modelos existentes. Esto es tan poderoso que hay proyectos enteros de la comunidad que se basan en este mecanismo (por ejemplo el proyecto de contract de OCA o del conector de MercadoLibre).

Tambien con los módulos uno puede definir o modificar vistas y menues, por ejemplo con el siguiente código del ejemplo de a2_query_sales


<record id="a2_sales_view_tree" model="ir.ui.view">
<field name="name">a2.sales.view.tree</field>
<field name="model">a2.sales</field>
<field name="arch" type="xml">
<tree string="A2 Sales">
<field name="partner_id" />
<field name="state_id" />
<field name="city" />
<field name="product_id" />
<field name="product_uom_qty" />
</tree>
</field>
</record>

<record id="action_a2_sales" model="ir.actions.act_window">
<field name="name">A2 Sales</field>
<field name="res_model">a2.sales</field>
<field name="view_mode">tree,pivot</field>
</record>

<menuitem id="menu_a2_sales"
name="A2 Sales"
parent="sale.menu_sale_report"
action="action_a2_sales"
sequence="10"
groups="sales_team.group_sale_salesman"/>

En el cual se define un nuevo menú y una vista lista. Un mecanismo similar se utiliza para crear y modificar reportes existentes, y extender la interface de usuario.


Gustavo Orrillo 12 de noviembre de 2023
Compartir
Categorías
Archivar
Identificarse dejar un comentario