From 1e5dbfaf23bb1ce5709cae72572c7d633c739ab5 Mon Sep 17 00:00:00 2001 From: Quentin Groulard Date: Mon, 26 Oct 2026 15:20:57 +0100 Subject: [PATCH 1/2] [IMP] queue_job: Channel default parent_id The parent is still enforced on every channels except root, but instead of throwing an error when empty, set it to 'root' by default. --- queue_job/models/queue_job_channel.py | 14 ++++++++++++-- queue_job/readme/USAGE.md | 1 - queue_job/tests/test_model_job_channel.py | 12 ++++++++++++ test_queue_job/tests/test_job_channels.py | 4 +++- 4 files changed, 27 insertions(+), 4 deletions(-) diff --git a/queue_job/models/queue_job_channel.py b/queue_job/models/queue_job_channel.py index c5495ecacd..b91791b196 100644 --- a/queue_job/models/queue_job_channel.py +++ b/queue_job/models/queue_job_channel.py @@ -32,7 +32,10 @@ class QueueJobChannel(models.Model): compute="_compute_complete_name", store=True, readonly=True, recursive=True ) parent_id = fields.Many2one( - comodel_name="queue.job.channel", string="Parent Channel", ondelete="restrict" + comodel_name="queue.job.channel", + string="Parent Channel", + ondelete="restrict", + default=lambda self: self._default_parent_id(), ) job_function_ids = fields.One2many( comodel_name="queue.job.function", @@ -153,6 +156,13 @@ def _root_max_capacity(self): self.env.cr.dbname, rules, default=runner._max_capacity() ) + def _default_parent_id(self): + # empty while the root channel itself is being created at install + return ( + self.env.ref("queue_job.channel_root", raise_if_not_found=False) + or self.browse() + ) + @api.constrains("parent_id", "name") def parent_required(self): for record in self: @@ -169,7 +179,7 @@ def create(self, vals_list): new_vals_list = [] for vals in vals_list: name = vals.get("name") - parent_id = vals.get("parent_id") + parent_id = vals.get("parent_id", self._default_parent_id().id) if name and parent_id: existing = self.search( [("name", "=", name), ("parent_id", "=", parent_id)] diff --git a/queue_job/readme/USAGE.md b/queue_job/readme/USAGE.md index deb6fe2aca..3cbdc1df28 100644 --- a/queue_job/readme/USAGE.md +++ b/queue_job/readme/USAGE.md @@ -168,7 +168,6 @@ Example of channel: ``` XML sale - ``` diff --git a/queue_job/tests/test_model_job_channel.py b/queue_job/tests/test_model_job_channel.py index 19eaf320be..4f4c3b58ba 100644 --- a/queue_job/tests/test_model_job_channel.py +++ b/queue_job/tests/test_model_job_channel.py @@ -33,6 +33,18 @@ def test_channel_create(self): self.assertEqual(channel2.name, "test") self.assertEqual(channel2.complete_name, "root.test.test") + def test_channel_create_default_parent(self): + channel = self.Channel.create({"name": "test"}) + self.assertEqual(channel.parent_id, self.root_channel) + self.assertEqual(channel.complete_name, "root.test") + + def test_channel_write_empty_parent(self): + channel = self.Channel.create({"name": "test"}) + with self.assertRaisesRegex( + exceptions.ValidationError, "Parent channel required." + ): + channel.parent_id = False + @odoo.tools.mute_logger("odoo.sql_db") def test_channel_complete_name_uniq(self): channel = self.Channel.create( diff --git a/test_queue_job/tests/test_job_channels.py b/test_queue_job/tests/test_job_channels.py index aff250d252..d83191e836 100644 --- a/test_queue_job/tests/test_job_channels.py +++ b/test_queue_job/tests/test_job_channels.py @@ -28,7 +28,9 @@ def test_channel_complete_name(self): def test_channel_tree(self): with self.assertRaises(exceptions.ValidationError): - self.channel_model.create({"name": "sub"}) + self.channel_model.create({"name": "sub", "parent_id": False}) + channel = self.channel_model.create({"name": "sub"}) + self.assertEqual(channel.parent_id, self.root_channel) def test_channel_root(self): with self.assertRaises(exceptions.UserError): From dff164faed11134e00f718baa6638c2846986b6c Mon Sep 17 00:00:00 2001 From: Quentin Groulard Date: Tue, 27 Oct 2026 13:13:02 +0100 Subject: [PATCH 2/2] [IMP] Remove channel parent from xml data No need to force this in the data anymore, 'root' is the default value and it should stay editable in the DB. --- queue_job_batch/data/queue_job_channel_data.xml | 1 - queue_job_cron/data/data.xml | 1 - 2 files changed, 2 deletions(-) diff --git a/queue_job_batch/data/queue_job_channel_data.xml b/queue_job_batch/data/queue_job_channel_data.xml index 04dd328c59..12ac98ff61 100644 --- a/queue_job_batch/data/queue_job_channel_data.xml +++ b/queue_job_batch/data/queue_job_channel_data.xml @@ -1,6 +1,5 @@ queue.job.batch - diff --git a/queue_job_cron/data/data.xml b/queue_job_cron/data/data.xml index 0a56d9df32..94195e9ea8 100644 --- a/queue_job_cron/data/data.xml +++ b/queue_job_cron/data/data.xml @@ -2,7 +2,6 @@ ir_cron -