Personalización de la Lógica de Negocio y Wizards
La personalización de la lógica de negocio en Odoo se realiza combinando métodos en los modelos, decoradores reactivos de la API y asistentes interactivos (Wizards).
1. Automatizaciones y Acciones del Servidor #
En Odoo contemporáneo, las transiciones de estado y automatizaciones se gestionan mediante:
- Métodos de Estado: Funciones disparadas por botones en la interfaz (
action_confirm,action_cancel,action_done) que validan condiciones y cambian el campostate. - Acciones del Servidor (Server Actions): Registros de
ir.actions.serverque ejecutan código Python o envían correos automáticos. - Tareas Programadas (Crons -
ir.cron): Procesos en segundo plano que se ejecutan periódicamente (ej. cada noche) para sincronizar datos, enviar recordatorios o archivar registros caducados.
2. Decoradores Fundamentales de la API #
| Decorador | Propósito | Cuándo se Ejecuta |
|---|---|---|
@api.depends('campo1', ...) | Recalcula campos computados | Cuando los campos indicados cambian en la BDD o en memoria |
@api.onchange('campo1', ...) | Modifica la interfaz web en vivo | En el navegador del cliente antes de guardar |
@api.constrains('campo1', ...) | Valida restricciones de negocio | Al guardar (create / write), lanzando ValidationError |
@api.model | Métodos estáticos de clase | Llamadas globales sin un ID o recordset específico |
@api.model_create_multi | Creación optimizada en lote | Al invocar create(vals_list) recibiendo una lista de diccionarios |
3. Asistentes Modales (Wizards con TransientModel) #
Un Wizard es una ventana modal emergente que permite al usuario introducir parámetros antes de ejecutar una acción compleja (por ejemplo, seleccionar un rango de fechas para generar un informe masivo):
Definición del Modelo Transitorio (models.TransientModel): #
1from odoo import models, fields, api, _ 2from odoo.exceptions import UserError 3 4class LibraryLoanWizard(models.TransientModel): 5 _name = 'library.loan.wizard' 6 _description = 'Asistente de Préstamo Rápido' 7 8 partner_id = fields.Many2one('res.partner', string='Socio', required=True) 9 return_date = fields.Date(string='Fecha Límite de Devolución', required=True) 10 11 def action_apply(self): 12 self.ensure_one() 13 active_ids = self.env.context.get('active_ids', []) 14 books = self.env['library.book'].browse(active_ids) 15 16 for book in books: 17 if not book.is_available: 18 raise UserError(_("El libro '%s' no está disponible para préstamo.") % book.name) 19 book.write({ 20 'is_available': False, 21 'state': 'borrowed' 22 }) 23 return {'type': 'ir.actions.act_window_close'}
Vista de Formulario con Botones en <footer>: #
1<record id="view_library_loan_wizard_form" model="ir.ui.view"> 2 <field name="name">library.loan.wizard.form</field> 3 <field name="model">library.loan.wizard</field> 4 <field name="arch" type="xml"> 5 <form string="Asistente de Préstamo"> 6 <group> 7 <field name="partner_id"/> 8 <field name="return_date"/> 9 </group> 10 <footer> 11 <button string="Confirmar Préstamo" type="object" name="action_apply" class="btn-primary"/> 12 <button string="Cancelar" class="btn-secondary" special="cancel"/> 13 </footer> 14 </form> 15 </field> 16</record>
Resumen del tema
Conceptos clave #
- Acciones y Automatizaciones: Server Actions (código Python disparado por eventos o menús) y Acciones Automatizadas/Crons para tareas desatendidas.
- Decoradores Esenciales de la API Odoo:
@api.depends: cálculo automático reactivo de campos computados.@api.onchange: actualización de campos en la interfaz en tiempo real sin guardar en base de datos.@api.constrains: validación estricta de integridad de datos en operacionescreate/write(lanzandoValidationError).@api.model_create_multi: creación masiva eficiente en lote.
- Asistentes Transitorios (Wizards -
models.TransientModel): ventanas modales emergentes (target='new') para recoger datos temporales, ejecutar procesos complejos o solicitar confirmación.
Qué debes recordar #
Usa decoradores @api para controlar la reactividad y validación en tus modelos, y TransientModel para crear asistentes modales interactivos.