From 47b8c48015a62db65c0b6205f669558587c8baa5 Mon Sep 17 00:00:00 2001 From: Eric Antones Date: Thu, 2 Jul 2026 23:26:09 +0200 Subject: [PATCH 1/3] [FIX] queue_job: rebind args/kwargs lazily to the job's current cursor --- queue_job/job.py | 41 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 40 insertions(+), 1 deletion(-) diff --git a/queue_job/job.py b/queue_job/job.py index b2d64c6d3..961051192 100644 --- a/queue_job/job.py +++ b/queue_job/job.py @@ -13,9 +13,30 @@ from random import randint import odoo +from odoo.models import BaseModel from .exception import FailedJobError, NoSuchJobError, RetryableJobError + +def _rebind_to_cr(value, cr): + """Rebind any BaseModel inside ``value`` to the cursor ``cr``. + + Recurses into lists, tuples and dicts. Preserves uid/su/context of each + inner env - only the cursor is swapped. Recordsets already bound to + ``cr`` and non-recordset values pass through untouched. Containers are + rebuilt, so in-place changes to the result are lost. + """ + if isinstance(value, BaseModel): + if value.env.cr is cr: + return value + return value.with_env(value.env(cr=cr)) + if isinstance(value, (list, tuple)): + return type(value)(_rebind_to_cr(v, cr) for v in value) + if isinstance(value, dict): + return {k: _rebind_to_cr(v, cr) for k, v in value.items()} + return value + + WAIT_DEPENDENCIES = "wait_dependencies" PENDING = "pending" ENQUEUED = "enqueued" @@ -533,8 +554,8 @@ def perform(self): def in_temporary_env(self): with self.env.registry.cursor() as new_cr: env = self.env - self._env = env(cr=new_cr) try: + self._env = env(cr=new_cr) yield finally: self._env = env @@ -705,6 +726,24 @@ def env(self): def _env(self, env): self.recordset = self.recordset.with_env(env) + @property + def args(self): + """Positional arguments, rebound to the job's current cursor.""" + return _rebind_to_cr(self._args, self.env.cr) + + @args.setter + def args(self, value): + self._args = value + + @property + def kwargs(self): + """Keyword arguments, rebound to the job's current cursor.""" + return _rebind_to_cr(self._kwargs, self.env.cr) + + @kwargs.setter + def kwargs(self, value): + self._kwargs = value + @property def func(self): recordset = self.recordset.with_context(job_uuid=self.uuid) From 8b16a588a63a56c28c5dae564360fc7f8a85ce04 Mon Sep 17 00:00:00 2001 From: ??? Date: Wed, 29 Apr 2026 12:59:11 +0200 Subject: [PATCH 2/3] [IMP] test_queue_job: add regression test for args/kwargs rebind in in_temporary_env --- test_queue_job/data/queue_job_function_data.xml | 8 ++++++++ test_queue_job/models/test_models.py | 13 +++++++++++++ test_queue_job/tests/test_job.py | 12 ++++++++++++ 3 files changed, 33 insertions(+) diff --git a/test_queue_job/data/queue_job_function_data.xml b/test_queue_job/data/queue_job_function_data.xml index 833804514..c01903b0f 100644 --- a/test_queue_job/data/queue_job_function_data.xml +++ b/test_queue_job/data/queue_job_function_data.xml @@ -20,6 +20,14 @@ job_with_retry_pattern__no_zero + + + job_commit_with_arg_records + + Date: Fri, 21 Aug 2026 08:51:17 +0000 Subject: [PATCH 3/3] [BOT] post-merge updates --- README.md | 4 ++-- queue_job/README.rst | 2 +- queue_job/__manifest__.py | 2 +- queue_job/static/description/index.html | 2 +- test_queue_job/__manifest__.py | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 0c224f3b9..3f1ad5835 100644 --- a/README.md +++ b/README.md @@ -24,13 +24,13 @@ addon | version | maintainers | summary --- | --- | --- | --- [base_export_async](base_export_async/) | 16.0.1.2.0 | | Asynchronous export with job queue [base_import_async](base_import_async/) | 16.0.1.2.1 | | Import CSV files in the background -[queue_job](queue_job/) | 16.0.3.0.1 | guewen sbidoul | Job Queue +[queue_job](queue_job/) | 16.0.3.0.2 | guewen sbidoul | Job Queue [queue_job_batch](queue_job_batch/) | 16.0.1.0.1 | | Job Queue Batch [queue_job_cron](queue_job_cron/) | 16.0.2.1.0 | | Scheduled Actions as Queue Jobs [queue_job_cron_jobrunner](queue_job_cron_jobrunner/) | 16.0.1.1.0 | ivantodorovich | Run jobs without a dedicated JobRunner [queue_job_subscribe](queue_job_subscribe/) | 16.0.1.1.0 | | Control which users are subscribed to queue job notifications [queue_job_web_notify](queue_job_web_notify/) | 16.0.1.0.0 | | This module allows to display a notification to the related user of a failed job. It uses the web_notify notification feature. -[test_queue_job](test_queue_job/) | 16.0.2.5.0 | sbidoul | Queue Job Tests +[test_queue_job](test_queue_job/) | 16.0.2.5.1 | sbidoul | Queue Job Tests [test_queue_job_batch](test_queue_job_batch/) | 16.0.1.0.0 | | Test Job Queue Batch diff --git a/queue_job/README.rst b/queue_job/README.rst index a37109a86..d26a7bd27 100644 --- a/queue_job/README.rst +++ b/queue_job/README.rst @@ -11,7 +11,7 @@ Job Queue !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !! source digest: sha256:078ff84f658e3a8953ba800728b7b57d5effbaa0083ff7ab9c1b8134b77bb885 + !! source digest: sha256:7387273e60279f8c69c8b3052a07d6fed49d33f14949cbfd7a41f41852ccbb4d !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Mature-brightgreen.png diff --git a/queue_job/__manifest__.py b/queue_job/__manifest__.py index a5d362681..60cff1e25 100644 --- a/queue_job/__manifest__.py +++ b/queue_job/__manifest__.py @@ -2,7 +2,7 @@ { "name": "Job Queue", - "version": "16.0.3.0.1", + "version": "16.0.3.0.2", "author": "Camptocamp,ACSONE SA/NV,Odoo Community Association (OCA)", "website": "https://github.com/OCA/queue", "license": "LGPL-3", diff --git a/queue_job/static/description/index.html b/queue_job/static/description/index.html index 4d9d62b9c..89ea6306a 100644 --- a/queue_job/static/description/index.html +++ b/queue_job/static/description/index.html @@ -372,7 +372,7 @@

Job Queue

!! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!! source digest: sha256:078ff84f658e3a8953ba800728b7b57d5effbaa0083ff7ab9c1b8134b77bb885 +!! source digest: sha256:7387273e60279f8c69c8b3052a07d6fed49d33f14949cbfd7a41f41852ccbb4d !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->

Mature License: LGPL-3 OCA/queue Translate me on Weblate Try me on Runboat

This addon adds an integrated Job Queue to Odoo.

diff --git a/test_queue_job/__manifest__.py b/test_queue_job/__manifest__.py index 42c5851db..1a19acff5 100644 --- a/test_queue_job/__manifest__.py +++ b/test_queue_job/__manifest__.py @@ -3,7 +3,7 @@ { "name": "Queue Job Tests", - "version": "16.0.2.5.0", + "version": "16.0.2.5.1", "author": "Camptocamp,Odoo Community Association (OCA)", "license": "LGPL-3", "category": "Generic Modules",