From 70c7cf653391238c2e27baf5811562a8c71f5c3a Mon Sep 17 00:00:00 2001 From: Florent Xicluna Date: Fri, 17 Jan 2025 18:40:27 +0100 Subject: [PATCH 1/2] [IMP] queue_job: perform_enqueued_jobs should filter the context --- queue_job/tests/common.py | 8 ++++++++ test_queue_job/tests/test_delay_mocks.py | 16 ++++++++++++++++ 2 files changed, 24 insertions(+) diff --git a/queue_job/tests/common.py b/queue_job/tests/common.py index 5a35e18af3..ec036bd639 100644 --- a/queue_job/tests/common.py +++ b/queue_job/tests/common.py @@ -255,6 +255,7 @@ def _add_job(self, *args, **kwargs): if not job.identity_key or all( j.identity_key != job.identity_key for j in self.enqueued_jobs ): + self._prepare_context(job) self.enqueued_jobs.append(job) patcher = mock.patch.object(job, "store") @@ -273,6 +274,13 @@ def _add_job(self, *args, **kwargs): ) return job + def _prepare_context(self, job): + # pylint: disable=context-overridden + job_model = job.job_model.with_context({}) + field_records = job_model._fields["records"] + # Filter the context to simulate store/load of the job + job.recordset = field_records.convert_to_write(job.recordset, job_model) + def __enter__(self): return self diff --git a/test_queue_job/tests/test_delay_mocks.py b/test_queue_job/tests/test_delay_mocks.py index 9bd3760168..6109c813d7 100644 --- a/test_queue_job/tests/test_delay_mocks.py +++ b/test_queue_job/tests/test_delay_mocks.py @@ -270,6 +270,22 @@ def test_trap_jobs_perform(self): self.assertEqual(logs[2].message, "test_trap_jobs_perform graph 3") self.assertEqual(logs[3].message, "test_trap_jobs_perform graph 1") + def test_trap_jobs_prepare_context(self): + # pylint: disable=context-overridden + with trap_jobs() as trap: + model1 = self.env["test.queue.job"].with_context({"config_key": 42}) + model2 = self.env["test.queue.job"].with_context( + {"config_key": 42, "lang": "it_IT"} + ) + model1.with_delay().testing_method("0", "K", return_context=1) + model2.with_delay().testing_method("0", "K", return_context=1) + + [job1, job2] = trap.enqueued_jobs + trap.perform_enqueued_jobs() + + self.assertEqual(job1.result, {"job_uuid": mock.ANY}) + self.assertEqual(job2.result, {"job_uuid": mock.ANY, "lang": "it_IT"}) + def test_mock_with_delay(self): with mock_with_delay() as (delayable_cls, delayable): self.env["test.queue.job"].button_that_uses_with_delay() From 6243869a640886baf7140ff0b32b443592b2e586 Mon Sep 17 00:00:00 2001 From: Florent Xicluna Date: Tue, 4 Feb 2025 22:12:28 +0100 Subject: [PATCH 2/2] [IMP] queue_job: explain context in docstring --- queue_job/README.rst | 5 +++-- test_queue_job/tests/test_delay_mocks.py | 6 ++++++ 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/queue_job/README.rst b/queue_job/README.rst index 88319dddc1..c83fec58a2 100644 --- a/queue_job/README.rst +++ b/queue_job/README.rst @@ -428,8 +428,9 @@ allow-list. The default allow-list is ("tz", "lang", "allowed_company_ids", "force_company", "active_test"). It can be customized in -``Base._job_prepare_context_before_enqueue_keys``. **Bypass jobs on -running Odoo** +``Base._job_prepare_context_before_enqueue_keys``. + +**Bypass jobs on running Odoo** When you are developing (ie: connector modules) you might want to bypass the queue job and run your code immediately. diff --git a/test_queue_job/tests/test_delay_mocks.py b/test_queue_job/tests/test_delay_mocks.py index 6109c813d7..16b87ebb80 100644 --- a/test_queue_job/tests/test_delay_mocks.py +++ b/test_queue_job/tests/test_delay_mocks.py @@ -271,6 +271,12 @@ def test_trap_jobs_perform(self): self.assertEqual(logs[3].message, "test_trap_jobs_perform graph 1") def test_trap_jobs_prepare_context(self): + """Context is transferred to the job according to an allow-list. + + Default allow-list is: + ("tz", "lang", "allowed_company_ids", "force_company", "active_test") + It can be customized in ``Base._job_prepare_context_before_enqueue_keys``. + """ # pylint: disable=context-overridden with trap_jobs() as trap: model1 = self.env["test.queue.job"].with_context({"config_key": 42})