From 0fa4a217fbb5aad6b2e4bb4ab8e47a57a8e9ed33 Mon Sep 17 00:00:00 2001 From: Eugene Molotov Date: Wed, 17 Nov 2021 17:47:14 +0500 Subject: [PATCH 1/2] queue_job: fix typo in USAGE.rst --- queue_job/readme/USAGE.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/queue_job/readme/USAGE.rst b/queue_job/readme/USAGE.rst index 6c472eccf9..c8ff94b793 100644 --- a/queue_job/readme/USAGE.rst +++ b/queue_job/readme/USAGE.rst @@ -25,7 +25,7 @@ Example of job function: .. code-block:: XML - + action_done From 296311e66c714f570c6a092a7844ae4fc8788ec8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Honor=C3=A9?= Date: Mon, 2 Aug 2021 16:12:16 +0200 Subject: [PATCH 2/2] [14.0][IMP] queue_job current company Use the current company to trigger the job (+ add related tests) [14.0][FIX] queu_job: allowed_company_ids => use with_company(...) Fill allowed_company_ids from context with the job's company instead of every allowed companies of the user. Because most of the time, a job is related to only one company. And adding every allowed companies of the user into the context may load some unexpected records (during search for example). Because standards ir.rule use ['|',('company_id','=',False),('company_id', 'in', company_ids)] and this 'company_ids' is filled with every allowed companies from the context. --- queue_job/job.py | 6 +++++ test_queue_job/tests/test_job.py | 43 ++++++++++++++++++++++++++++++++ 2 files changed, 49 insertions(+) diff --git a/queue_job/job.py b/queue_job/job.py index 4ee90390e6..7bf261cb4b 100644 --- a/queue_job/job.py +++ b/queue_job/job.py @@ -586,7 +586,13 @@ def db_record(self): @property def func(self): + # We can fill only one company into allowed_company_ids. + # Because if you have many, you can have unexpected records due to ir.rule. + # ir.rule use allowed_company_ids to load every records in many companies. + # But most of the time, a job should be executed on a single company. recordset = self.recordset.with_context(job_uuid=self.uuid) + if self.company_id: + recordset = recordset.with_company(self.company_id) return getattr(recordset, self.method_name) @property diff --git a/test_queue_job/tests/test_job.py b/test_queue_job/tests/test_job.py index ad9d2b37f5..0edcdd8d9f 100644 --- a/test_queue_job/tests/test_job.py +++ b/test_queue_job/tests/test_job.py @@ -176,6 +176,49 @@ def test_postpone(self): self.assertEqual(job_a.result, "test") self.assertFalse(job_a.exc_info) + def test_company_simple(self): + company = self.env.ref("base.main_company") + eta = datetime.now() + timedelta(hours=5) + test_job = Job( + self.method, + args=("o", "k"), + kwargs={"return_context": 1}, + priority=15, + eta=eta, + description="My description", + ) + test_job.worker_pid = 99999 # normally set on "set_start" + test_job.company_id = company.id + test_job.store() + job_read = Job.load(self.env, test_job.uuid) + self.assertEqual(test_job.func, job_read.func) + result_ctx = test_job.func(*tuple(test_job.args), **test_job.kwargs) + self.assertEqual(result_ctx.get("allowed_company_ids"), company.ids) + + def test_company_complex(self): + company1 = self.env.ref("base.main_company") + company2 = company1.create({"name": "Queue job company"}) + companies = company1 | company2 + self.env.user.write({"company_ids": [(6, False, companies.ids)]}) + # Ensure the main company still the first + self.assertEqual(self.env.user.company_id, company1) + eta = datetime.now() + timedelta(hours=5) + test_job = Job( + self.method, + args=("o", "k"), + kwargs={"return_context": 1}, + priority=15, + eta=eta, + description="My description", + ) + test_job.worker_pid = 99999 # normally set on "set_start" + test_job.company_id = company2.id + test_job.store() + job_read = Job.load(self.env, test_job.uuid) + self.assertEqual(test_job.func, job_read.func) + result_ctx = test_job.func(*tuple(test_job.args), **test_job.kwargs) + self.assertEqual(result_ctx.get("allowed_company_ids"), company2.ids) + def test_store(self): test_job = Job(self.method) test_job.store()