Skip to content

Commit bfc52a3

Browse files
committed
Add storage of context in jobs recordsets
1 parent e43fba5 commit bfc52a3

5 files changed

Lines changed: 49 additions & 6 deletions

File tree

queue_job/fields.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,9 @@ def convert_to_record(self, value, record):
6969
class JobEncoder(json.JSONEncoder):
7070
"""Encode Odoo recordsets so that we can later recompose them"""
7171

72+
def _get_record_context(self, obj):
73+
return obj._job_prepare_context_before_enqueue()
74+
7275
def default(self, obj):
7376
if isinstance(obj, models.BaseModel):
7477
return {
@@ -77,6 +80,7 @@ def default(self, obj):
7780
"ids": obj.ids,
7881
"uid": obj.env.uid,
7982
"su": obj.env.su,
83+
"context": self._get_record_context(obj),
8084
}
8185
elif isinstance(obj, datetime):
8286
return {"_type": "datetime_isoformat", "value": obj.isoformat()}

queue_job/job.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -423,8 +423,6 @@ def __init__(
423423
:param identity_key: A hash to uniquely identify a job, or a function
424424
that returns this hash (the function takes the job
425425
as argument)
426-
:param env: Odoo Environment
427-
:type env: :class:`odoo.api.Environment`
428426
"""
429427
if args is None:
430428
args = ()

queue_job/models/base.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -216,3 +216,28 @@ def _job_store_values(self, job):
216216
:return: dictionary for setting job values.
217217
"""
218218
return {}
219+
220+
@api.model
221+
def _job_prepare_context_before_enqueue_keys(self):
222+
"""Keys to keep in context of stored jobs
223+
224+
Empty by default for backward compatibility.
225+
"""
226+
return (
227+
"tz",
228+
"lang",
229+
"allowed_company_ids",
230+
"force_company",
231+
"active_test",
232+
)
233+
234+
def _job_prepare_context_before_enqueue(self):
235+
"""Return the context to store in the jobs
236+
237+
Can be used to keep only safe keys.
238+
"""
239+
return {
240+
key: value
241+
for key, value in self.env.context.items()
242+
if key in self._job_prepare_context_before_enqueue_keys()
243+
}

queue_job/readme/USAGE.rst

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,12 @@ Based on this configuration, we can tell that:
118118
* retries 10 to 15 postponed 30 seconds later
119119
* all subsequent retries postponed 5 minutes later
120120

121+
**Job Context**
122+
123+
The context of the recordset of the job, or any recordset passed in arguments of
124+
a job, is transferred to the job according to an allow-list. The allow-list can
125+
be customized in ``Base._job_prepare_context_before_enqueue_keys``.
126+
121127
**Bypass jobs on running Odoo**
122128

123129
When you are developing (ie: connector modules) you might want

queue_job/tests/test_json_field.py

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,8 @@
1616
class TestJson(common.TransactionCase):
1717
def test_encoder_recordset(self):
1818
demo_user = self.env.ref("base.user_demo")
19-
partner = self.env(user=demo_user).ref("base.main_partner")
19+
context = demo_user.context_get()
20+
partner = self.env(user=demo_user, context=context).ref("base.main_partner")
2021
value = partner
2122
value_json = json.dumps(value, cls=JobEncoder)
2223
expected = {
@@ -25,12 +26,14 @@ def test_encoder_recordset(self):
2526
"model": "res.partner",
2627
"ids": [partner.id],
2728
"su": False,
29+
"context": context,
2830
}
2931
self.assertEqual(json.loads(value_json), expected)
3032

3133
def test_encoder_recordset_list(self):
3234
demo_user = self.env.ref("base.user_demo")
33-
partner = self.env(user=demo_user).ref("base.main_partner")
35+
context = demo_user.context_get()
36+
partner = self.env(user=demo_user, context=context).ref("base.main_partner")
3437
value = ["a", 1, partner]
3538
value_json = json.dumps(value, cls=JobEncoder)
3639
expected = [
@@ -42,18 +45,22 @@ def test_encoder_recordset_list(self):
4245
"model": "res.partner",
4346
"ids": [partner.id],
4447
"su": False,
48+
"context": context,
4549
},
4650
]
4751
self.assertEqual(json.loads(value_json), expected)
4852

4953
def test_decoder_recordset(self):
5054
demo_user = self.env.ref("base.user_demo")
55+
context = demo_user.context_get()
5156
partner = self.env(user=demo_user).ref("base.main_partner")
5257
value_json = (
5358
'{"_type": "odoo_recordset",'
5459
'"model": "res.partner",'
5560
'"su": false,'
56-
'"ids": [%s],"uid": %s}' % (partner.id, demo_user.id)
61+
'"ids": [%s],"uid": %s, '
62+
'"context": {"tz": "%s", "lang": "%s"}}'
63+
% (partner.id, demo_user.id, context["tz"], context["lang"])
5764
)
5865
expected = partner
5966
value = json.loads(value_json, cls=JobDecoder, env=self.env)
@@ -62,13 +69,16 @@ def test_decoder_recordset(self):
6269

6370
def test_decoder_recordset_list(self):
6471
demo_user = self.env.ref("base.user_demo")
72+
context = demo_user.context_get()
6573
partner = self.env(user=demo_user).ref("base.main_partner")
6674
value_json = (
6775
'["a", 1, '
6876
'{"_type": "odoo_recordset",'
6977
'"model": "res.partner",'
7078
'"su": false,'
71-
'"ids": [%s],"uid": %s}]' % (partner.id, demo_user.id)
79+
'"ids": [%s],"uid": %s, '
80+
'"context": {"tz": "%s", "lang": "%s"}}]'
81+
% (partner.id, demo_user.id, context["tz"], context["lang"])
7282
)
7383
expected = ["a", 1, partner]
7484
value = json.loads(value_json, cls=JobDecoder, env=self.env)

0 commit comments

Comments
 (0)