From 8ee054228022aa93091db54af8405377491a6c3e 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 (cherry picked from commit 47b8c48015a62db65c0b6205f669558587c8baa5) --- 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 86314499b..40e20fbab 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" @@ -513,8 +534,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 @@ -688,6 +709,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 f002049ea5582430da0b9bf4ad93b23b2c85cca7 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 (cherry picked from commit 8b16a588a63a56c28c5dae564360fc7f8a85ce04) [ported to 19.0: reformatted asserts for ruff-format] --- 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: Mon, 24 Aug 2026 11:37:28 +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 76f29bd17..24178df62 100644 --- a/README.md +++ b/README.md @@ -21,8 +21,8 @@ Available addons ---------------- addon | version | maintainers | summary --- | --- | --- | --- -[queue_job](queue_job/) | 19.0.2.0.3 | guewen sbidoul | Job Queue -[test_queue_job](test_queue_job/) | 19.0.2.0.0 | sbidoul | Queue Job Tests +[queue_job](queue_job/) | 19.0.2.0.4 | guewen sbidoul | Job Queue +[test_queue_job](test_queue_job/) | 19.0.2.0.1 | sbidoul | Queue Job Tests Unported addons diff --git a/queue_job/README.rst b/queue_job/README.rst index 35828a1b3..5d8b3e36f 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:3fa70ebecb05fe5e014778d029da704bcc083caf386201d7df82944dc3885c4d + !! source digest: sha256:c2ecb6963b31f1160b50cba7ab4b23b9719a343736f71c3044248ee11fd07db0 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Mature-brightgreen.png diff --git a/queue_job/__manifest__.py b/queue_job/__manifest__.py index d071eba23..e7553ff52 100644 --- a/queue_job/__manifest__.py +++ b/queue_job/__manifest__.py @@ -2,7 +2,7 @@ { "name": "Job Queue", - "version": "19.0.2.0.3", + "version": "19.0.2.0.4", "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 7cdc29df1..db94dfdcc 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:3fa70ebecb05fe5e014778d029da704bcc083caf386201d7df82944dc3885c4d +!! source digest: sha256:c2ecb6963b31f1160b50cba7ab4b23b9719a343736f71c3044248ee11fd07db0 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->

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 c4b227dd9..f68e25142 100644 --- a/test_queue_job/__manifest__.py +++ b/test_queue_job/__manifest__.py @@ -3,7 +3,7 @@ { "name": "Queue Job Tests", - "version": "19.0.2.0.0", + "version": "19.0.2.0.1", "author": "Camptocamp,Odoo Community Association (OCA)", "license": "LGPL-3", "category": "Generic Modules",