1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
|
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()
|