from odoo import models, fields, api from odoo.exceptions import UserError import traceback class QueueJob(models.Model): _name = 'queue.job' _description = 'Queueing Job Runner' _order = 'create_date desc' name = fields.Char(required=True) model_name = fields.Char(required=True) method_name = fields.Char(required=True) res_id = fields.Integer(string='Record ID') state = fields.Selection([ ('draft', 'Draft'), ('running', 'Running'), ('done', 'Done'), ('error', 'Error'), ], default='draft') error_message = fields.Text() def action_run_selected(self): for job in self: job.action_run() def action_run(self, limit=10): jobs = self.search([('state', '=', 'draft')], order='create_date desc', limit=limit) for job in jobs: job.state = 'running' try: record = self.env[job.model_name].browse(job.res_id) if not record.exists(): raise UserError('Target record not found') method = getattr(record, job.method_name, None) if not method: raise UserError('Method not found') method() # 🔥 EXECUTE job.state = 'done' except Exception as e: job.state = 'error' job.error_message = traceback.format_exc()