summaryrefslogtreecommitdiff
path: root/fixco_custom/models/queue_job.py
blob: 56926e37f03a05e6e47457a75aa372e749906a95 (plain)
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
47
48
49
50
51
52
53
54
55
56
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'), ('method_name', '=', 'get_order_id_and_create_detail_order')], order='create_date desc', limit=limit)
        if not jobs:
            jobs = self.search([('state', '=', 'draft'), ('method_name', '!=', 'get_order_id_and_create_detail_order')], order='create_date desc', limit=limit)
        for job in jobs:
            try:
                job.write({'state': 'running'})
                self.env.cr.commit()

                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')

                with self.env.cr.savepoint():
                    method()

                job.write({'state': 'done'})
                self.env.cr.commit()

            except Exception:
                job.write({
                    'state': 'error',
                    'error_message': traceback.format_exc()
                })
                self.env.cr.commit()