Curso odoo (Módulos)

9.1. Creación de controladores web

En Odoo, los controladores web se crean para procesar peticiones HTTP y devolver respuestas en distintos formatos (HTML, JSON, etc.). Estos controladores son especialmente útiles si quieres exponer funcionalidades de Odoo a otras aplicaciones o necesitas desarrollar páginas web personalizadas dentro de la plataforma.

  • Estructura básica
    1. Creas un archivo Python (por ejemplo, controllers.py) en la carpeta de tu módulo.
    2. Definirás una clase que hereda de http.Controller.
    3. Dentro de la clase, decoras métodos con @http.route para indicar la URL, métodos HTTP permitidos, autenticación, etc.
1# Ejemplo de controlador web básico
2from odoo import http
3from odoo.http import request
4
5class MyModuleController(http.Controller):
6
7    @http.route('/my_module/hello', auth='public', type='http', methods=['GET'], website=True)
8    def hello_world(self, **kw):
9        return "Hello, Odoo World!"
  • @http.route('/my_module/hello', ...)

    • '/my_module/hello': la ruta en la URL para acceder a este método.
    • auth='public': significa que no requiere autenticación para acceder (también puede ser user para requerir sesión iniciada, o none para llamadas anónimas con ciertas limitaciones).
    • type='http': define que la respuesta será texto/html.
    • methods=['GET']: acepta únicamente peticiones GET.
    • website=True: indica que se renderiza como una página web (se pueden usar plantillas si lo deseas).
  • Procesamiento de datos

    • Dentro del método, puedes acceder a datos del sistema usando request.env['modelo'], o recopilar parámetros de la URL mediante **kw.
    • Para renderizar plantillas QWeb, utilizas request.render('module.template_id', context).
1@http.route('/my_module/render_page', auth='public', website=True)
2def render_page(self, **kw):
3    # Por ejemplo, obtener registros de un modelo
4    books = request.env['library.book'].search([])
5    return request.render('my_module.template_books_page', {'books': books})

9.2. Integraciones con servicios externos

Odoo te permite consumir APIs de terceros y también exponer tus propios servicios. Para consumir APIs externas, se emplean librerías estándar de Python (por ejemplo, requests).

Ejemplo: consumo de una API REST externa

1import requests
2from odoo import models, fields, api
3
4class WeatherIntegration(models.Model):
5    _name = 'weather.integration'
6
7    city = fields.Char(string='City')
8    temperature = fields.Float(string='Temperature')
9
10    def get_weather(self):
11        # Ejemplo de uso de la API de OpenWeatherMap
12        url = "http://api.openweathermap.org/data/2.5/weather"
13        params = {
14            'q': self.city,
15            'appid': 'TU_API_KEY',
16            'units': 'metric'
17        }
18        response = requests.get(url, params=params)
19        if response.status_code == 200:
20            data = response.json()
21            self.temperature = data['main']['temp']
22        else:
23            raise Warning("Error al obtener los datos del clima")
  • requests.get(...): Ejecuta la llamada HTTP a la URL y recibe la respuesta.
  • response.json(): Convierte la respuesta en un diccionario de Python.
  • Puedes manejar autenticaciones, headers, tokens, etc., según los requerimientos de la API externa.

9.3. Odoo RPC/JSON-RPC: Exponer servicios de Odoo

Para que otros sistemas consuman datos de Odoo, existe la interfaz JSON-RPC nativa. Por defecto, Odoo expone endpoints como /jsonrpc y /xmlrpc. A través de ellos, se pueden realizar operaciones en los modelos (crear, buscar, actualizar) siempre que se cuente con las credenciales apropiadas.

  1. Autenticación

    • Se hace mediante los parámetros de usuario, contraseña, base de datos y la URL del servidor.
    • Por ejemplo, si tu servidor está en http://localhost:8069, usarías la librería jsonrpclib o cualquier cliente JSON-RPC para conectarte.
  2. Ejemplo de conexión externa a Odoo (usando Python):

1import json
2import requests
3
4url = 'http://localhost:8069/jsonrpc'
5db = 'nombre_de_tu_bd'
6username = 'admin'
7password = 'admin'
8
9# 1. Autenticación: obtener user_id
10payload = {
11    "jsonrpc": "2.0",
12    "method": "call",
13    "params": {
14        "db": db,
15        "login": username,
16        "password": password
17    },
18    "id": 1
19}
20response = requests.post(url + '/common', json=payload).json()
21user_id = response['result']
22
23# 2. Ejemplo de llamada a un método: search en library.book
24payload = {
25    "jsonrpc": "2.0",
26    "method": "call",
27    "params": {
28        "model": "library.book",
29        "method": "search_read",
30        "args": [[]],  # dominio vacío para traer todos
31        "kwargs": {"fields": ["name", "author"]},
32        "db": db,
33        "uid": user_id,
34        "password": password
35    },
36    "id": 2
37}
38response = requests.post(url + '/object', json=payload).json()
39books = response['result']
40print(books)
  • Aquí se realiza una llamada a search_read en el modelo library.book, trayendo todos los registros y retornando los campos “name” y “author”.
  • Security note: Siempre debes asegurarte de que tu servidor Odoo esté protegido (por ejemplo, SSL si es tráfico público), y de controlar los permisos para que usuarios externos no accedan a datos sensibles.

Conclusión de la Parte 9

  1. Web Controllers: Permiten manejar peticiones HTTP y generar respuestas personalizadas (HTML, JSON, etc.), ideales para crear páginas web específicas o endpoints personalizados dentro de Odoo.
  2. Integraciones con APIs externas: Puedes usar librerías de Python (como requests) para consumir servicios de terceros (REST, SOAP, etc.).
  3. Odoo RPC/JSON-RPC: Facilita exponer la funcionalidad de Odoo y que otras aplicaciones puedan interactuar con tus modelos y datos, respetando la autenticación y permisos definidos.

Con esto, podrás convertir tu instancia de Odoo en un hub de integración, conectando diversos sistemas y ampliando el alcance de tus funcionalidades. En la siguiente parte, abordaremos las pruebas y calidad de código, un tema clave para garantizar la solidez y mantenimiento de tus desarrollos en Odoo. ¡Continuemos!

  • Loading...