62 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
			
		
		
	
	
			62 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
| # Copyright 2019 ACSONE SA/NV (<http://acsone.eu>)
 | |
| # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html)
 | |
| import logging
 | |
| 
 | |
| from odoo import api, fields, models
 | |
| 
 | |
| _logger = logging.getLogger(__name__)
 | |
| 
 | |
| 
 | |
| class IrCron(models.Model):
 | |
|     _inherit = "ir.cron"
 | |
| 
 | |
|     run_as_queue_job = fields.Boolean(
 | |
|         help="Specify if this cron should be ran as a queue job"
 | |
|     )
 | |
|     channel_id = fields.Many2one(
 | |
|         comodel_name="queue.job.channel",
 | |
|         compute="_compute_run_as_queue_job",
 | |
|         readonly=False,
 | |
|         string="Channel",
 | |
|     )
 | |
| 
 | |
|     @api.depends("run_as_queue_job")
 | |
|     def _compute_run_as_queue_job(self):
 | |
|         for cron in self:
 | |
|             if cron.run_as_queue_job and not cron.channel_id:
 | |
|                 cron.channel_id = self.env.ref("queue_job_cron.channel_root_ir_cron").id
 | |
|             else:
 | |
|                 cron.channel_id = False
 | |
| 
 | |
|     def _run_job_as_queue_job(self, server_action):
 | |
|         return server_action.run()
 | |
| 
 | |
|     def method_direct_trigger(self):
 | |
|         for cron in self:
 | |
|             if not cron.run_as_queue_job:
 | |
|                 super(IrCron, cron).method_direct_trigger()
 | |
|             else:
 | |
|                 _cron = cron.with_user(cron.user_id).with_context(
 | |
|                     lastcall=cron.lastcall
 | |
|                 )
 | |
|                 _cron.with_delay(
 | |
|                     priority=_cron.priority,
 | |
|                     description=_cron.name,
 | |
|                     channel=_cron.channel_id.complete_name,
 | |
|                 )._run_job_as_queue_job(server_action=_cron.ir_actions_server_id)
 | |
|         return True
 | |
| 
 | |
|     def _callback(self, cron_name, server_action_id, job_id):
 | |
|         cron = self.env["ir.cron"].sudo().browse(job_id)
 | |
|         if cron.run_as_queue_job:
 | |
|             server_action = self.env["ir.actions.server"].browse(server_action_id)
 | |
|             return self.with_delay(
 | |
|                 priority=cron.priority,
 | |
|                 description=cron.name,
 | |
|                 channel=cron.channel_id.complete_name,
 | |
|             )._run_job_as_queue_job(server_action=server_action)
 | |
|         else:
 | |
|             return super()._callback(
 | |
|                 cron_name=cron_name, server_action_id=server_action_id, job_id=job_id
 | |
|             )
 |