From 942da80b9cf9d9a6d4ec99baa7b5c43a433576c5 Mon Sep 17 00:00:00 2001 From: git_admin Date: Mon, 27 Apr 2026 08:46:24 +0000 Subject: [PATCH] Tower: upload queue_job 16.0.2.12.0 (via marketplace) --- addons/queue_job/models/queue_job_channel.py | 94 ++++++++++++++++++++ 1 file changed, 94 insertions(+) create mode 100644 addons/queue_job/models/queue_job_channel.py diff --git a/addons/queue_job/models/queue_job_channel.py b/addons/queue_job/models/queue_job_channel.py new file mode 100644 index 0000000..920b021 --- /dev/null +++ b/addons/queue_job/models/queue_job_channel.py @@ -0,0 +1,94 @@ +# Copyright 2013-2020 Camptocamp SA +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl.html) + + +from odoo import _, api, exceptions, fields, models + + +class QueueJobChannel(models.Model): + _name = "queue.job.channel" + _description = "Job Channels" + + name = fields.Char() + complete_name = fields.Char( + compute="_compute_complete_name", store=True, readonly=True, recursive=True + ) + parent_id = fields.Many2one( + comodel_name="queue.job.channel", string="Parent Channel", ondelete="restrict" + ) + job_function_ids = fields.One2many( + comodel_name="queue.job.function", + inverse_name="channel_id", + string="Job Functions", + ) + removal_interval = fields.Integer( + default=lambda self: self.env["queue.job"]._removal_interval, required=True + ) + + _sql_constraints = [ + ("name_uniq", "unique(complete_name)", "Channel complete name must be unique") + ] + + @api.depends("name", "parent_id.complete_name") + def _compute_complete_name(self): + for record in self: + if not record.name: + complete_name = "" # new record + elif record.parent_id: + complete_name = ".".join([record.parent_id.complete_name, record.name]) + else: + complete_name = record.name + record.complete_name = complete_name + + @api.constrains("parent_id", "name") + def parent_required(self): + for record in self: + if record.name != "root" and not record.parent_id: + raise exceptions.ValidationError(_("Parent channel required.")) + + @api.model_create_multi + def create(self, vals_list): + records = self.browse() + if self.env.context.get("install_mode"): + # installing a module that creates a channel: rebinds the channel + # to an existing one (likely we already had the channel created by + # the @job decorator previously) + new_vals_list = [] + for vals in vals_list: + name = vals.get("name") + parent_id = vals.get("parent_id") + if name and parent_id: + existing = self.search( + [("name", "=", name), ("parent_id", "=", parent_id)] + ) + if existing: + if not existing.get_metadata()[0].get("noupdate"): + existing.write(vals) + records |= existing + continue + new_vals_list.append(vals) + vals_list = new_vals_list + records |= super().create(vals_list) + return records + + def write(self, values): + for channel in self: + if ( + not self.env.context.get("install_mode") + and channel.name == "root" + and ("name" in values or "parent_id" in values) + ): + raise exceptions.UserError(_("Cannot change the root channel")) + return super().write(values) + + def unlink(self): + for channel in self: + if channel.name == "root": + raise exceptions.UserError(_("Cannot remove the root channel")) + return super().unlink() + + def name_get(self): + result = [] + for record in self: + result.append((record.id, record.complete_name)) + return result