95 lines
3.3 KiB
Python
95 lines
3.3 KiB
Python
# 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
|