Una necesidad común en proyectos Odoo es exponer ciertos datos o acciones a sistemas externos mediante APIs. Esto nos permite que otras herramientas puedan integrarse de forma sencilla en Odoo. Hasta ahora, las opciones más comunes eran:
- Usar los controladores estándar jsonrpc.
- Implementar endpoints manualmente con controladores http.Controller.
- O montar un servicio intermedio externo con Flask o FastAPI.
Pero gracias al módulo fastapi de la OCA, ahora podemos crear una API RESTful moderna directamente dentro de Odoo, con validación automática, documentación OpenAPI y desacoplada del core.
En este post explicamos cómo usamos este módulo para exponer recursos de Odoo de forma robusta y mantenible.
¿Qué es el módulo fastapi de la OCA?
El módulo fastapi (disponible en el repositorio OCA/rest-framework) permite definir una interfaz RESTful usando la librería FastAPI, integrada directamente con el entorno de Odoo. Algunas de sus ventajas son:
- Valida automáticamente la entrada y la salida de datos con Pydantic.
- Genera la documentación Swagger automáticamente
- Permite definir las funciones de forma específica
- Soporta varias formas de autentificación
Ejemplo real: Exponer productos
Para ver su funcionalidad, vamos a hacer un pequeño ejemplo que nos permitirá exponer los productos de nuestra instancia.
Primero definiremos el enrutador para recibir las llamadas. Lo recomendable en este caso es poner esta información en un fichero router.py dentro de nuestro módulo.
from fastapi import APIRouter
router = APIRouter()
El siguiente paso es crear un nuevo tipo de aplicación endpoint para usar. En este caso, lo recomendable es crear un fichero llamado models/fastapi_endpoint.py.
from odoo import fields, models
from ..router import router
class FastapiEndpoint(models.Model):
_inherit = "fastapi.endpoint"
app: str = fields.Selection(
selection_add=[("my_router", "My new router")],
ondelete={"my_router": "cascade"}
)
def _get_fastapi_routers(self):
if self.app == "my_router":
return [router]
return super()._get_fastapi_routers()
A nivel de código, el último paso será definir todas las rutas a usar. Esto lo podemos poner en un fichero del módulo llamado services/products.py.
from odoo.addons.fastapi.dependencies import odoo_env
from odoo.api import Environment
from typing import Annotated
from fastapi import Depends
from ..router import router
from pydantic import BaseModel
class ProductDTO(BaseModel):
id: int
name: str
list_price: float
@router.get("/products")
async def products(
env: Annotated[Environment, Depends(odoo_env)]
) -> list[ProductDTO]:
products = env["product.product"].sudo().search([])
return [
ProductDTO(
id=p.id,
name=p.name,
list_price=p.list_price
)
for p in products
]
Por último, en la interfaz gráfica podremos hacer ya la creación de nuestro endpoint y podremos configurarlo. Para acceder podemos usar el menú FastAPI de nuestro Odoo.
Además, podemos ver la documentación e incluso probar el código realizado.
Autentificación y permisos
El módulo soporta varios métodos de autentificación, pero en el ejemplo mostrado no hemos puesto ninguna configuración para mantenerlo simple. Es importante revisar esta parte antes de llevar nuestro código a producción.
¿Cuando usar y cuando no usar este módulo?
El módulo FastAPI es muy útil pero antes de realizar este tipo de integraciones siempre hemos de plantearnos si realmente necesitamos esta integración. La experiencia nos dice que muchas veces no son necesarias y cuanto más simple dejemos nuestra sistema, más sencillo será gestionarlo a futuro.
Conclusión
El módulo fastapi de la OCA nos permite exponer APIs modernas dentro de Odoo sin complicaciones, sin duplicar lógica de negocio, y siguiendo buenas prácticas.
Es especialmente útil en entornos donde queremos ofrecer integraciones estándar, bien documentadas, y con validaciones de datos robustas, sin depender de código spaghetti en controladores http.Controller.
Una solución muy recomendable si trabajas con integraciones entre Odoo y aplicaciones móviles, frontends hechos en React/Vue, u otros sistemas de terceros.