|
13 | 13 | from random import randint |
14 | 14 |
|
15 | 15 | import odoo |
| 16 | +from odoo.models import BaseModel |
16 | 17 |
|
17 | 18 | from .exception import FailedJobError, NoSuchJobError, RetryableJobError |
18 | 19 |
|
| 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 | + |
19 | 37 | WAIT_DEPENDENCIES = "wait_dependencies" |
20 | 38 | PENDING = "pending" |
21 | 39 | ENQUEUED = "enqueued" |
@@ -533,11 +551,19 @@ def perform(self): |
533 | 551 | def in_temporary_env(self): |
534 | 552 | with self.env.registry.cursor() as new_cr: |
535 | 553 | env = self.env |
536 | | - self._env = env(cr=new_cr) |
| 554 | + original_args = self.args |
| 555 | + original_kwargs = self.kwargs |
537 | 556 | 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 | + } |
538 | 562 | yield |
539 | 563 | finally: |
540 | 564 | self._env = env |
| 565 | + self.args = original_args |
| 566 | + self.kwargs = original_kwargs |
541 | 567 |
|
542 | 568 | def _get_common_dependent_jobs_query(self): |
543 | 569 | return """ |
|
0 commit comments