From 070ab3e61859a0d81619ed306ffd0042dae94c4b Mon Sep 17 00:00:00 2001 From: ??? Date: Wed, 29 Apr 2026 11:58:53 +0200 Subject: [PATCH 1/2] [FIX] queue_job: rebind args/kwargs to inner cursor in in_temporary_env --- queue_job/job.py | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/queue_job/job.py b/queue_job/job.py index b2d64c6d3..b303c66ad 100644 --- a/queue_job/job.py +++ b/queue_job/job.py @@ -13,9 +13,27 @@ from random import randint import odoo +from odoo.models import BaseModel from .exception import FailedJobError, NoSuchJobError, RetryableJobError + +def _rebind_to_env(value, new_env): + """Rebind any BaseModel inside `value` to ``new_env``'s cursor. + + Recurses into lists, tuples and dicts. Preserves uid/su/context of each + inner env - only the cursor is swapped. Non-recordset values pass through + untouched. + """ + if isinstance(value, BaseModel): + return value.with_env(value.env(cr=new_env.cr)) + if isinstance(value, (list, tuple)): + return type(value)(_rebind_to_env(v, new_env) for v in value) + if isinstance(value, dict): + return {k: _rebind_to_env(v, new_env) for k, v in value.items()} + return value + + WAIT_DEPENDENCIES = "wait_dependencies" PENDING = "pending" ENQUEUED = "enqueued" @@ -533,11 +551,19 @@ 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) + original_args = self.args + original_kwargs = self.kwargs try: + self._env = env(cr=new_cr) + self.args = tuple(_rebind_to_env(a, self.env) for a in self.args) + self.kwargs = { + k: _rebind_to_env(v, self.env) for k, v in self.kwargs.items() + } yield finally: self._env = env + self.args = original_args + self.kwargs = original_kwargs def _get_common_dependent_jobs_query(self): return """ From 1360a1277b674da6307fce815edd4e9458217a6f Mon Sep 17 00:00:00 2001 From: ??? Date: Wed, 29 Apr 2026 12:59:11 +0200 Subject: [PATCH 2/2] [ADD] test_queue_job: 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 | 9 +++++++++ test_queue_job/tests/test_job.py | 11 +++++++++++ 3 files changed, 28 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 + +