Skip to content

Commit 070ab3e

Browse files
committed
[FIX] queue_job: rebind args/kwargs to inner cursor in in_temporary_env
1 parent 17db424 commit 070ab3e

1 file changed

Lines changed: 27 additions & 1 deletion

File tree

queue_job/job.py

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,27 @@
1313
from random import randint
1414

1515
import odoo
16+
from odoo.models import BaseModel
1617

1718
from .exception import FailedJobError, NoSuchJobError, RetryableJobError
1819

20+
21+
def _rebind_to_env(value, new_env):
22+
"""Rebind any BaseModel inside `value` to ``new_env``'s cursor.
23+
24+
Recurses into lists, tuples and dicts. Preserves uid/su/context of each
25+
inner env - only the cursor is swapped. Non-recordset values pass through
26+
untouched.
27+
"""
28+
if isinstance(value, BaseModel):
29+
return value.with_env(value.env(cr=new_env.cr))
30+
if isinstance(value, (list, tuple)):
31+
return type(value)(_rebind_to_env(v, new_env) for v in value)
32+
if isinstance(value, dict):
33+
return {k: _rebind_to_env(v, new_env) for k, v in value.items()}
34+
return value
35+
36+
1937
WAIT_DEPENDENCIES = "wait_dependencies"
2038
PENDING = "pending"
2139
ENQUEUED = "enqueued"
@@ -533,11 +551,19 @@ def perform(self):
533551
def in_temporary_env(self):
534552
with self.env.registry.cursor() as new_cr:
535553
env = self.env
536-
self._env = env(cr=new_cr)
554+
original_args = self.args
555+
original_kwargs = self.kwargs
537556
try:
557+
self._env = env(cr=new_cr)
558+
self.args = tuple(_rebind_to_env(a, self.env) for a in self.args)
559+
self.kwargs = {
560+
k: _rebind_to_env(v, self.env) for k, v in self.kwargs.items()
561+
}
538562
yield
539563
finally:
540564
self._env = env
565+
self.args = original_args
566+
self.kwargs = original_kwargs
541567

542568
def _get_common_dependent_jobs_query(self):
543569
return """

0 commit comments

Comments
 (0)