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
- Creas un archivo Python (por ejemplo,
controllers.py) en la carpeta de tu módulo. - Definirás una clase que hereda de
http.Controller. - Dentro de la clase, decoras métodos con
@http.routepara indicar la URL, métodos HTTP permitidos, autenticación, etc.
- Creas un archivo Python (por ejemplo,
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 seruserpara requerir sesión iniciada, ononepara 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).
- Dentro del método, puedes acceder a datos del sistema usando
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.
-
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íajsonrpclibo cualquier cliente JSON-RPC para conectarte.
-
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_readen el modelolibrary.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
- 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.
- Integraciones con APIs externas: Puedes usar librerías de Python (como
requests) para consumir servicios de terceros (REST, SOAP, etc.). - 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...