From 1dcdc23fbfc1449920143f9a00d97fd80f21568e Mon Sep 17 00:00:00 2001 From: Quentin Groulard Date: Fri, 27 Feb 2026 12:15:27 +0100 Subject: [PATCH 01/27] [FIX] queue_job_batch: multi company rule Adapt to the new multi company system. --- queue_job_batch/security/security.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/queue_job_batch/security/security.xml b/queue_job_batch/security/security.xml index 9443708ae0..a033a049c7 100644 --- a/queue_job_batch/security/security.xml +++ b/queue_job_batch/security/security.xml @@ -20,7 +20,7 @@ ['|',('company_id','=',False),('company_id','child_of',[user.company_id.id])] + >[('company_id', 'in', company_ids + [False])] From 4038ecb0dde1dd0fcc2cea6af5572f3fbf9ce892 Mon Sep 17 00:00:00 2001 From: Simone Orsi Date: Wed, 11 Feb 2026 18:40:20 +0100 Subject: [PATCH 02/27] Add queue_job_profiler --- queue_job_profiler/README.rst | 96 ++++ queue_job_profiler/__init__.py | 2 + queue_job_profiler/__manifest__.py | 19 + queue_job_profiler/controllers/__init__.py | 1 + queue_job_profiler/controllers/main.py | 28 ++ queue_job_profiler/models/__init__.py | 2 + queue_job_profiler/models/queue_job.py | 44 ++ .../models/queue_job_function.py | 48 ++ queue_job_profiler/pyproject.toml | 3 + queue_job_profiler/readme/CONTRIBUTORS.md | 2 + queue_job_profiler/readme/DESCRIPTION.md | 7 + queue_job_profiler/readme/USAGE.md | 8 + .../static/description/index.html | 445 ++++++++++++++++++ queue_job_profiler/tests/__init__.py | 1 + queue_job_profiler/tests/test_job_profiler.py | 134 ++++++ .../views/queue_job_function_views.xml | 25 + queue_job_profiler/views/queue_job_views.xml | 25 + 17 files changed, 890 insertions(+) create mode 100644 queue_job_profiler/README.rst create mode 100644 queue_job_profiler/__init__.py create mode 100644 queue_job_profiler/__manifest__.py create mode 100644 queue_job_profiler/controllers/__init__.py create mode 100644 queue_job_profiler/controllers/main.py create mode 100644 queue_job_profiler/models/__init__.py create mode 100644 queue_job_profiler/models/queue_job.py create mode 100644 queue_job_profiler/models/queue_job_function.py create mode 100644 queue_job_profiler/pyproject.toml create mode 100644 queue_job_profiler/readme/CONTRIBUTORS.md create mode 100644 queue_job_profiler/readme/DESCRIPTION.md create mode 100644 queue_job_profiler/readme/USAGE.md create mode 100644 queue_job_profiler/static/description/index.html create mode 100644 queue_job_profiler/tests/__init__.py create mode 100644 queue_job_profiler/tests/test_job_profiler.py create mode 100644 queue_job_profiler/views/queue_job_function_views.xml create mode 100644 queue_job_profiler/views/queue_job_views.xml diff --git a/queue_job_profiler/README.rst b/queue_job_profiler/README.rst new file mode 100644 index 0000000000..9765639adc --- /dev/null +++ b/queue_job_profiler/README.rst @@ -0,0 +1,96 @@ +================== +Job Queue Profiler +================== + +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:b6e605728ea05be0bf98dbe6e94c197bab21882e965286ef214f719e252b444e + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png + :target: https://odoo-community.org/page/development-status + :alt: Beta +.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fqueue-lightgray.png?logo=github + :target: https://github.com/OCA/queue/tree/18.0/queue_job_profiler + :alt: OCA/queue +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/queue-18-0/queue-18-0-queue_job_profiler + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png + :target: https://runboat.odoo-community.org/builds?repo=OCA/queue&target_branch=18.0 + :alt: Try me on Runboat + +|badge1| |badge2| |badge3| |badge4| |badge5| + +This addon adds profiling controls to queue job functions and wraps +queue job execution in an Odoo profiler session when enabled. + +When profiling is enabled for a job function and the executing user +matches the configured profiling user, the queue job runner records SQL +and async stack traces via ``odoo.tools.profiler.Profiler`` and saves +the results into ``ir_profile``. + +**Table of contents** + +.. contents:: + :local: + +Usage +===== + +1. Open the Queue Job Functions menu. +2. Open the job function you want to profile. +3. In the Profiler group, enable Profiling and set the Profiling user + and Profiling until. +4. Run the job with the selected user (the queue job runner usually + executes as the superuser). +5. Inspect the generated entries in ``ir_profile`` to review the + captured profiling data. + +Bug Tracker +=========== + +Bugs are tracked on `GitHub Issues `_. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us to smash it by providing a detailed and welcomed +`feedback `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +------- + +* Camptocamp + +Contributors +------------ + +- `Camptocamp `__: + + - Simone Orsi + +Maintainers +----------- + +This module is maintained by the OCA. + +.. image:: https://odoo-community.org/logo.png + :alt: Odoo Community Association + :target: https://odoo-community.org + +OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use. + +This module is part of the `OCA/queue `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/queue_job_profiler/__init__.py b/queue_job_profiler/__init__.py new file mode 100644 index 0000000000..91c5580fed --- /dev/null +++ b/queue_job_profiler/__init__.py @@ -0,0 +1,2 @@ +from . import controllers +from . import models diff --git a/queue_job_profiler/__manifest__.py b/queue_job_profiler/__manifest__.py new file mode 100644 index 0000000000..7db4b83454 --- /dev/null +++ b/queue_job_profiler/__manifest__.py @@ -0,0 +1,19 @@ +# Copyright 2026 Camptocamp SA (https://www.camptocamp.com). +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl + +{ + "name": "Job Queue Profiler", + "version": "18.0.1.0.0", + "author": "Camptocamp, Odoo Community Association (OCA)", + "maintainers": ["simahawk"], + "website": "https://github.com/OCA/queue", + "license": "AGPL-3", + "category": "Generic Modules", + "depends": [ + "queue_job", + ], + "data": [ + "views/queue_job_function_views.xml", + "views/queue_job_views.xml", + ], +} diff --git a/queue_job_profiler/controllers/__init__.py b/queue_job_profiler/controllers/__init__.py new file mode 100644 index 0000000000..12a7e529b6 --- /dev/null +++ b/queue_job_profiler/controllers/__init__.py @@ -0,0 +1 @@ +from . import main diff --git a/queue_job_profiler/controllers/main.py b/queue_job_profiler/controllers/main.py new file mode 100644 index 0000000000..08c8097634 --- /dev/null +++ b/queue_job_profiler/controllers/main.py @@ -0,0 +1,28 @@ +# Copyright 2026 Camptocamp SA (https://www.camptocamp.com). +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo.tools.profiler import Profiler + +from odoo.addons.queue_job.controllers.main import RunJobController as BaseController + + +class RunJobController(BaseController): + def _try_perform_job(self, env, job): + if self._profiler_is_enabled(env, job): + return self._profiler_perform_job(env, job) + return super()._try_perform_job(env, job) + + def _profiler_is_enabled(self, env, job): + func_id = job.job_config.job_function_id + job_function = env["queue.job.function"].browse(func_id) + return job_function.is_profiling_enabled() + + def _profiler_perform_job(self, env, job): + with self._profiler_get(env, job): + result = super()._try_perform_job(env, job) + return result + + def _profiler_get(self, env, job): + func_id = job.job_config.job_function_id + job_function = env["queue.job.function"].browse(func_id) + return Profiler(description=job_function._profile_make_name(job)) diff --git a/queue_job_profiler/models/__init__.py b/queue_job_profiler/models/__init__.py new file mode 100644 index 0000000000..2cf4503488 --- /dev/null +++ b/queue_job_profiler/models/__init__.py @@ -0,0 +1,2 @@ +from . import queue_job_function +from . import queue_job diff --git a/queue_job_profiler/models/queue_job.py b/queue_job_profiler/models/queue_job.py new file mode 100644 index 0000000000..04c1b893ee --- /dev/null +++ b/queue_job_profiler/models/queue_job.py @@ -0,0 +1,44 @@ +# Copyright 2026 Camptocamp SA +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html) + +from odoo import fields, models + + +class QueueJob(models.Model): + _inherit = "queue.job" + + job_is_profiled = fields.Boolean( + string="Profiled", + default=False, + help="Whether this job has been profiled or not.", + compute="_compute_job_is_profiled", + compute_sudo=True, + ) + + def _compute_job_is_profiled(self): + for job in self: + # don't care about perf as this is loaded only on the job form view + profile_name = job.job_function_id._profile_make_name(job) + job.job_is_profiled = bool(job._profiler_get_record(profile_name)) + + def _profiler_get_record(self, profile_name): + IrProfile = self.env["ir.profile"].sudo() + return IrProfile.search( + [("name", "=", profile_name)], + limit=1, + ) + + def action_view_profile(self): + self.ensure_one() + profile_name = self.job_function_id._profile_make_name(self) + profile = self._profiler_get_record(profile_name) + if not profile: + return {"type": "ir.actions.act_window_close"} + return { + "type": "ir.actions.act_window", + "name": "Profile", + "res_model": "ir.profile", + "view_mode": "form", + "res_id": profile.id, + "target": "current", + } diff --git a/queue_job_profiler/models/queue_job_function.py b/queue_job_profiler/models/queue_job_function.py new file mode 100644 index 0000000000..312e0796e7 --- /dev/null +++ b/queue_job_profiler/models/queue_job_function.py @@ -0,0 +1,48 @@ +# Copyright 2026 Camptocamp SA +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html) + +from odoo import api, exceptions, fields, models + + +class QueueJobFunction(models.Model): + _inherit = "queue.job.function" + + profiling_enabled = fields.Boolean( + string="Profiling enabled", + help="Indicates whether profiling is enabled for this job function.", + ) + profiling_user_id = fields.Many2one( + "res.users", + string="Profiling user", + help="The user allowed to perform profiling for this job function.", + ) + profiling_until = fields.Datetime( + string="Profiling until", + help="The date and time until which profiling is enabled " + "for this job function.", + ) + + def is_profiling_enabled(self): + self.ensure_one() + return ( + self.profiling_enabled + and self.profiling_user_id == self.env.user + and (self.profiling_until and self.profiling_until >= fields.Datetime.now()) + ) + + @api.constrains("profiling_enabled") + def _check_profiling_setup(self): + for record in self: + if record.profiling_enabled and ( + not record.profiling_user_id or not record.profiling_until + ): + raise exceptions.ValidationError( + self.env._( + "A profiling user and a profiling until date " + "must be set when profiling is enabled." + ) + ) + + def _profile_make_name(self, job): + self.ensure_one() + return f"queue.job {job.uuid} - {self.name}" diff --git a/queue_job_profiler/pyproject.toml b/queue_job_profiler/pyproject.toml new file mode 100644 index 0000000000..4231d0cccb --- /dev/null +++ b/queue_job_profiler/pyproject.toml @@ -0,0 +1,3 @@ +[build-system] +requires = ["whool"] +build-backend = "whool.buildapi" diff --git a/queue_job_profiler/readme/CONTRIBUTORS.md b/queue_job_profiler/readme/CONTRIBUTORS.md new file mode 100644 index 0000000000..fc27d9f599 --- /dev/null +++ b/queue_job_profiler/readme/CONTRIBUTORS.md @@ -0,0 +1,2 @@ +- [Camptocamp](https://camptocamp.com): + - Simone Orsi \<\> diff --git a/queue_job_profiler/readme/DESCRIPTION.md b/queue_job_profiler/readme/DESCRIPTION.md new file mode 100644 index 0000000000..8e8814426c --- /dev/null +++ b/queue_job_profiler/readme/DESCRIPTION.md @@ -0,0 +1,7 @@ +This addon adds profiling controls to queue job functions and wraps +queue job execution in an Odoo profiler session when enabled. + +When profiling is enabled for a job function and the executing user +matches the configured profiling user, the queue job runner records +SQL and async stack traces via `odoo.tools.profiler.Profiler` and saves +the results into `ir_profile`. \ No newline at end of file diff --git a/queue_job_profiler/readme/USAGE.md b/queue_job_profiler/readme/USAGE.md new file mode 100644 index 0000000000..868db0ccbe --- /dev/null +++ b/queue_job_profiler/readme/USAGE.md @@ -0,0 +1,8 @@ +1. Open the Queue Job Functions menu. +2. Open the job function you want to profile. +3. In the Profiler group, enable Profiling and set the Profiling user + and Profiling until. +4. Run the job with the selected user (the queue job runner usually executes + as the superuser). +5. Inspect the generated entries in `ir_profile` to review the captured + profiling data. \ No newline at end of file diff --git a/queue_job_profiler/static/description/index.html b/queue_job_profiler/static/description/index.html new file mode 100644 index 0000000000..9ab72a5454 --- /dev/null +++ b/queue_job_profiler/static/description/index.html @@ -0,0 +1,445 @@ + + + + + +Job Queue Profiler + + + +
+

Job Queue Profiler

+ + +

Beta License: AGPL-3 OCA/queue Translate me on Weblate Try me on Runboat

+

This addon adds profiling controls to queue job functions and wraps +queue job execution in an Odoo profiler session when enabled.

+

When profiling is enabled for a job function and the executing user +matches the configured profiling user, the queue job runner records SQL +and async stack traces via odoo.tools.profiler.Profiler and saves +the results into ir_profile.

+

Table of contents

+ +
+

Usage

+
    +
  1. Open the Queue Job Functions menu.
  2. +
  3. Open the job function you want to profile.
  4. +
  5. In the Profiler group, enable Profiling and set the Profiling user +and Profiling until.
  6. +
  7. Run the job with the selected user (the queue job runner usually +executes as the superuser).
  8. +
  9. Inspect the generated entries in ir_profile to review the +captured profiling data.
  10. +
+
+
+

Bug Tracker

+

Bugs are tracked on GitHub Issues. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us to smash it by providing a detailed and welcomed +feedback.

+

Do not contact contributors directly about support or help with technical issues.

+
+
+

Credits

+
+

Authors

+
    +
  • Camptocamp
  • +
+
+ +
+

Maintainers

+

This module is maintained by the OCA.

+ +Odoo Community Association + +

OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use.

+

This module is part of the OCA/queue project on GitHub.

+

You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

+
+
+
+ + diff --git a/queue_job_profiler/tests/__init__.py b/queue_job_profiler/tests/__init__.py new file mode 100644 index 0000000000..f4cae97b5a --- /dev/null +++ b/queue_job_profiler/tests/__init__.py @@ -0,0 +1 @@ +from . import test_job_profiler diff --git a/queue_job_profiler/tests/test_job_profiler.py b/queue_job_profiler/tests/test_job_profiler.py new file mode 100644 index 0000000000..e579ad0885 --- /dev/null +++ b/queue_job_profiler/tests/test_job_profiler.py @@ -0,0 +1,134 @@ +# Copyright 2026 Camptocamp SA +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html) + +from datetime import timedelta +from unittest.mock import patch + +from freezegun import freeze_time + +from odoo import exceptions, fields +from odoo.tests import common, new_test_user + +from odoo.addons.queue_job_profiler.controllers.main import RunJobController + + +class TestJobFunction(common.TransactionCase): + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.env = cls.env(context=dict(cls.env.context, tracking_disable=True)) + cls.user_func1 = cls.env["queue.job.function"].create( + {"model_id": cls.env["ir.model"]._get_id("res.users"), "method": "read"} + ) + cls.user_func2 = cls.env["queue.job.function"].create( + {"model_id": cls.env["ir.model"]._get_id("res.users"), "method": "read"} + ) + cls.user1 = new_test_user(cls.env, login="user1", groups="base.group_user") + cls.user2 = new_test_user(cls.env, login="user2", groups="base.group_user") + + def test_func_constraint(self): + with self.assertRaisesRegex( + exceptions.ValidationError, + "A profiling user and a profiling until date " + "must be set when profiling is enabled.", + ): + self.user_func1.profiling_enabled = True + + def _enable_profiling(self, job_function, user, delta=timedelta(hours=1)): + job_function.profiling_user_id = user + job_function.profiling_until = fields.Datetime.now() + delta + job_function.profiling_enabled = True + + def test_func_profiling_enabled(self): + # By default, profiling should be disabled for all users + for user in (self.env.user, self.user1, self.user2): + self.assertFalse(self.user_func1.with_user(user).is_profiling_enabled()) + # Enable it for user1 and check that it's only enabled for that user only + self._enable_profiling(self.user_func1, self.user1) + self.assertTrue(self.user_func1.with_user(self.user1).is_profiling_enabled()) + for user in (self.env.user, self.user2): + self.assertFalse(self.user_func1.with_user(user).is_profiling_enabled()) + # Check for another job function and user + self._enable_profiling(self.user_func2, self.user2) + self.assertTrue(self.user_func2.with_user(self.user2).is_profiling_enabled()) + for user in (self.env.user, self.user1): + self.assertFalse(self.user_func2.with_user(user).is_profiling_enabled()) + with freeze_time(fields.Datetime.now() + timedelta(days=1)): + # After the profiling_until date, profiling should be disabled for all users + for user in (self.env.user, self.user1, self.user2): + self.assertFalse(self.user_func1.with_user(user).is_profiling_enabled()) + self.assertFalse(self.user_func2.with_user(user).is_profiling_enabled()) + + def test_job_is_profiled(self): + job1 = self.env.user.with_delay().read(["id"]) + job1.store() + job_rec1 = job1.db_record() + job2 = self.env.user.with_delay().read(["id"]) + job2.store() + job_rec2 = job2.db_record() + jobs = job_rec1 | job_rec2 + self.assertEqual(jobs.mapped("job_is_profiled"), [False, False]) + profile_name1 = self.user_func1._profile_make_name(job_rec1) + profile_name2 = self.user_func2._profile_make_name(job_rec2) + prof1 = self.env["ir.profile"].create({"name": profile_name1}) + jobs.invalidate_recordset() + self.assertEqual(jobs.mapped("job_is_profiled"), [True, False]) + prof2 = self.env["ir.profile"].create({"name": profile_name2}) + jobs.invalidate_recordset() + self.assertEqual(jobs.mapped("job_is_profiled"), [True, True]) + self.assertEqual(job_rec1._profiler_get_record(profile_name1), prof1) + self.assertEqual(job_rec2._profiler_get_record(profile_name2), prof2) + + def test_job_action_view_profile(self): + job = self.env.user.with_delay().read(["id"]) + job.store() + job_rec = job.db_record() + self.assertEqual( + job_rec.action_view_profile(), {"type": "ir.actions.act_window_close"} + ) + profile_name = self.user_func1._profile_make_name(job_rec) + prof = self.env["ir.profile"].create({"name": profile_name}) + action = job_rec.action_view_profile() + self.assertEqual(action["type"], "ir.actions.act_window") + self.assertEqual(action["res_model"], "ir.profile") + self.assertEqual(action["res_id"], prof.id) + + def _run_controller(self, job, user=None): + controller = RunJobController() + env = self.env(user=user) if user else self.env + with ( + patch.object(self.env.cr, "commit"), + ): + controller._try_perform_job(env, job) + + def test_controller(self): + job = self.env.user.with_delay().read(["id"]) + self._enable_profiling(self.user_func1, self.user1) + # TODO @simahawk: I'd like to look for new `ir_profile` records + # but somehow looks very hard to find them + # since `Profiler` creates them in a separated db connection. + # All my attempts to mock the cr or de connection of `db_connect` + # failed poorly, so I prefer to not waste too much time aroudn this. + # I'm falling back to patching the controller method + # that should be called when profiling is enabled. + # The profiler init is tested in another method below. + # Not ideal, but better than no test :) + with patch.object(RunJobController, "_profiler_get") as mock_profiler_get: + self._run_controller(job) + mock_profiler_get.assert_not_called() + with patch.object(RunJobController, "_profiler_get") as mock_profiler_get: + self._run_controller(job, user=self.user1) + mock_profiler_get.assert_called_once() + with freeze_time(fields.Datetime.now() + timedelta(days=1)): + with patch.object(RunJobController, "_profiler_get") as mock_profiler_get: + self._run_controller(job) + mock_profiler_get.assert_not_called() + + def test_controller_profiler_get(self): + # as we mocked it before, make sure it works + controller = RunJobController() + job = self.env.user.with_delay().read(["id"]) + profiler = controller._profiler_get(self.env, job) + self.assertEqual( + profiler.description, f"queue.job {job.uuid} - {job.job_function_name}" + ) diff --git a/queue_job_profiler/views/queue_job_function_views.xml b/queue_job_profiler/views/queue_job_function_views.xml new file mode 100644 index 0000000000..57ecf10081 --- /dev/null +++ b/queue_job_profiler/views/queue_job_function_views.xml @@ -0,0 +1,25 @@ + + + + queue.job.function.form.profiler + queue.job.function + + + + + + + + + + + + diff --git a/queue_job_profiler/views/queue_job_views.xml b/queue_job_profiler/views/queue_job_views.xml new file mode 100644 index 0000000000..7e379a3795 --- /dev/null +++ b/queue_job_profiler/views/queue_job_views.xml @@ -0,0 +1,25 @@ + + + + queue.job.form.profiler + queue.job + + + + + + + + From c17a4ad8bcc9d2af27d04586f9f3ea65736269d1 Mon Sep 17 00:00:00 2001 From: Simone Orsi Date: Thu, 12 Feb 2026 11:07:47 +0100 Subject: [PATCH 03/27] queue_job_profiler: make user note required --- queue_job_profiler/models/queue_job_function.py | 9 +++------ queue_job_profiler/tests/test_job_profiler.py | 3 +-- queue_job_profiler/views/queue_job_function_views.xml | 6 +----- 3 files changed, 5 insertions(+), 13 deletions(-) diff --git a/queue_job_profiler/models/queue_job_function.py b/queue_job_profiler/models/queue_job_function.py index 312e0796e7..68e343b7bf 100644 --- a/queue_job_profiler/models/queue_job_function.py +++ b/queue_job_profiler/models/queue_job_function.py @@ -26,20 +26,17 @@ def is_profiling_enabled(self): self.ensure_one() return ( self.profiling_enabled - and self.profiling_user_id == self.env.user and (self.profiling_until and self.profiling_until >= fields.Datetime.now()) + and (not self.profiling_user_id or self.profiling_user_id == self.env.user) ) @api.constrains("profiling_enabled") def _check_profiling_setup(self): for record in self: - if record.profiling_enabled and ( - not record.profiling_user_id or not record.profiling_until - ): + if record.profiling_enabled and not record.profiling_until: raise exceptions.ValidationError( self.env._( - "A profiling user and a profiling until date " - "must be set when profiling is enabled." + "A profiling until date must be set when profiling is enabled." ) ) diff --git a/queue_job_profiler/tests/test_job_profiler.py b/queue_job_profiler/tests/test_job_profiler.py index e579ad0885..da7c6d8917 100644 --- a/queue_job_profiler/tests/test_job_profiler.py +++ b/queue_job_profiler/tests/test_job_profiler.py @@ -29,8 +29,7 @@ def setUpClass(cls): def test_func_constraint(self): with self.assertRaisesRegex( exceptions.ValidationError, - "A profiling user and a profiling until date " - "must be set when profiling is enabled.", + "A profiling until date must be set when profiling is enabled.", ): self.user_func1.profiling_enabled = True diff --git a/queue_job_profiler/views/queue_job_function_views.xml b/queue_job_profiler/views/queue_job_function_views.xml index 57ecf10081..c75bdc22eb 100644 --- a/queue_job_profiler/views/queue_job_function_views.xml +++ b/queue_job_profiler/views/queue_job_function_views.xml @@ -8,11 +8,7 @@ - + Date: Thu, 12 Feb 2026 15:35:59 +0100 Subject: [PATCH 04/27] queue_job_profiler: allow to select multiple users --- queue_job_profiler/README.rst | 11 +++++----- .../models/queue_job_function.py | 10 +++++---- queue_job_profiler/readme/DESCRIPTION.md | 3 ++- queue_job_profiler/readme/USAGE.md | 4 ++-- .../static/description/index.html | 11 +++++----- queue_job_profiler/tests/test_job_profiler.py | 22 ++++++++++++------- .../views/queue_job_function_views.xml | 5 ++++- 7 files changed, 40 insertions(+), 26 deletions(-) diff --git a/queue_job_profiler/README.rst b/queue_job_profiler/README.rst index 9765639adc..a2530f7ec9 100644 --- a/queue_job_profiler/README.rst +++ b/queue_job_profiler/README.rst @@ -32,9 +32,10 @@ This addon adds profiling controls to queue job functions and wraps queue job execution in an Odoo profiler session when enabled. When profiling is enabled for a job function and the executing user -matches the configured profiling user, the queue job runner records SQL -and async stack traces via ``odoo.tools.profiler.Profiler`` and saves -the results into ``ir_profile``. +matches one of the configured profiling users (or no users are set), the +queue job runner records SQL and async stack traces via +``odoo.tools.profiler.Profiler`` and saves the results into +``ir_profile``. **Table of contents** @@ -46,8 +47,8 @@ Usage 1. Open the Queue Job Functions menu. 2. Open the job function you want to profile. -3. In the Profiler group, enable Profiling and set the Profiling user - and Profiling until. +3. In the Profiler group, enable Profiling and set the Profiling users + (optional) and Profiling until. 4. Run the job with the selected user (the queue job runner usually executes as the superuser). 5. Inspect the generated entries in ``ir_profile`` to review the diff --git a/queue_job_profiler/models/queue_job_function.py b/queue_job_profiler/models/queue_job_function.py index 68e343b7bf..00550e15cb 100644 --- a/queue_job_profiler/models/queue_job_function.py +++ b/queue_job_profiler/models/queue_job_function.py @@ -11,10 +11,10 @@ class QueueJobFunction(models.Model): string="Profiling enabled", help="Indicates whether profiling is enabled for this job function.", ) - profiling_user_id = fields.Many2one( + profiling_user_ids = fields.Many2many( "res.users", - string="Profiling user", - help="The user allowed to perform profiling for this job function.", + string="Profiling users", + help="The users allowed to perform profiling for this job function.", ) profiling_until = fields.Datetime( string="Profiling until", @@ -27,7 +27,9 @@ def is_profiling_enabled(self): return ( self.profiling_enabled and (self.profiling_until and self.profiling_until >= fields.Datetime.now()) - and (not self.profiling_user_id or self.profiling_user_id == self.env.user) + and ( + not self.profiling_user_ids or self.env.user in self.profiling_user_ids + ) ) @api.constrains("profiling_enabled") diff --git a/queue_job_profiler/readme/DESCRIPTION.md b/queue_job_profiler/readme/DESCRIPTION.md index 8e8814426c..06cb1376de 100644 --- a/queue_job_profiler/readme/DESCRIPTION.md +++ b/queue_job_profiler/readme/DESCRIPTION.md @@ -2,6 +2,7 @@ This addon adds profiling controls to queue job functions and wraps queue job execution in an Odoo profiler session when enabled. When profiling is enabled for a job function and the executing user -matches the configured profiling user, the queue job runner records +matches one of the configured profiling users (or no users are set), +the queue job runner records SQL and async stack traces via `odoo.tools.profiler.Profiler` and saves the results into `ir_profile`. \ No newline at end of file diff --git a/queue_job_profiler/readme/USAGE.md b/queue_job_profiler/readme/USAGE.md index 868db0ccbe..a58ee8eeff 100644 --- a/queue_job_profiler/readme/USAGE.md +++ b/queue_job_profiler/readme/USAGE.md @@ -1,7 +1,7 @@ 1. Open the Queue Job Functions menu. 2. Open the job function you want to profile. -3. In the Profiler group, enable Profiling and set the Profiling user - and Profiling until. +3. In the Profiler group, enable Profiling and set the Profiling users + (optional) and Profiling until. 4. Run the job with the selected user (the queue job runner usually executes as the superuser). 5. Inspect the generated entries in `ir_profile` to review the captured diff --git a/queue_job_profiler/static/description/index.html b/queue_job_profiler/static/description/index.html index 9ab72a5454..7a850cb7c3 100644 --- a/queue_job_profiler/static/description/index.html +++ b/queue_job_profiler/static/description/index.html @@ -373,9 +373,10 @@

Job Queue Profiler

This addon adds profiling controls to queue job functions and wraps queue job execution in an Odoo profiler session when enabled.

When profiling is enabled for a job function and the executing user -matches the configured profiling user, the queue job runner records SQL -and async stack traces via odoo.tools.profiler.Profiler and saves -the results into ir_profile.

+matches one of the configured profiling users (or no users are set), the +queue job runner records SQL and async stack traces via +odoo.tools.profiler.Profiler and saves the results into +ir_profile.

Table of contents

    @@ -394,8 +395,8 @@

    Usage

    1. Open the Queue Job Functions menu.
    2. Open the job function you want to profile.
    3. -
    4. In the Profiler group, enable Profiling and set the Profiling user -and Profiling until.
    5. +
    6. In the Profiler group, enable Profiling and set the Profiling users +(optional) and Profiling until.
    7. Run the job with the selected user (the queue job runner usually executes as the superuser).
    8. Inspect the generated entries in ir_profile to review the diff --git a/queue_job_profiler/tests/test_job_profiler.py b/queue_job_profiler/tests/test_job_profiler.py index da7c6d8917..1eb696fecf 100644 --- a/queue_job_profiler/tests/test_job_profiler.py +++ b/queue_job_profiler/tests/test_job_profiler.py @@ -33,8 +33,8 @@ def test_func_constraint(self): ): self.user_func1.profiling_enabled = True - def _enable_profiling(self, job_function, user, delta=timedelta(hours=1)): - job_function.profiling_user_id = user + def _enable_profiling(self, job_function, users=None, delta=timedelta(hours=1)): + job_function.profiling_user_ids = users job_function.profiling_until = fields.Datetime.now() + delta job_function.profiling_enabled = True @@ -42,13 +42,19 @@ def test_func_profiling_enabled(self): # By default, profiling should be disabled for all users for user in (self.env.user, self.user1, self.user2): self.assertFalse(self.user_func1.with_user(user).is_profiling_enabled()) - # Enable it for user1 and check that it's only enabled for that user only - self._enable_profiling(self.user_func1, self.user1) + # Enable for all users (no profiling users set) + self._enable_profiling(self.user_func1) + for user in (self.env.user, self.user1, self.user2): + self.assertTrue(self.user_func1.with_user(user).is_profiling_enabled()) + # Enable it for user1 and user2 + self._enable_profiling(self.user_func1, users=self.user1 + self.user2) self.assertTrue(self.user_func1.with_user(self.user1).is_profiling_enabled()) - for user in (self.env.user, self.user2): - self.assertFalse(self.user_func1.with_user(user).is_profiling_enabled()) + self.assertTrue(self.user_func1.with_user(self.user2).is_profiling_enabled()) + self.assertFalse( + self.user_func1.with_user(self.env.user).is_profiling_enabled() + ) # Check for another job function and user - self._enable_profiling(self.user_func2, self.user2) + self._enable_profiling(self.user_func2, users=self.user2) self.assertTrue(self.user_func2.with_user(self.user2).is_profiling_enabled()) for user in (self.env.user, self.user1): self.assertFalse(self.user_func2.with_user(user).is_profiling_enabled()) @@ -102,7 +108,7 @@ def _run_controller(self, job, user=None): def test_controller(self): job = self.env.user.with_delay().read(["id"]) - self._enable_profiling(self.user_func1, self.user1) + self._enable_profiling(self.user_func1, [self.user1.id]) # TODO @simahawk: I'd like to look for new `ir_profile` records # but somehow looks very hard to find them # since `Profiler` creates them in a separated db connection. diff --git a/queue_job_profiler/views/queue_job_function_views.xml b/queue_job_profiler/views/queue_job_function_views.xml index c75bdc22eb..b351560088 100644 --- a/queue_job_profiler/views/queue_job_function_views.xml +++ b/queue_job_profiler/views/queue_job_function_views.xml @@ -8,7 +8,10 @@ - + Date: Thu, 12 Feb 2026 15:37:41 +0100 Subject: [PATCH 05/27] queue_job_profiler: use profile session name --- queue_job_profiler/controllers/main.py | 5 ++++- queue_job_profiler/tests/test_job_profiler.py | 3 +++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/queue_job_profiler/controllers/main.py b/queue_job_profiler/controllers/main.py index 08c8097634..57d7576ccc 100644 --- a/queue_job_profiler/controllers/main.py +++ b/queue_job_profiler/controllers/main.py @@ -25,4 +25,7 @@ def _profiler_perform_job(self, env, job): def _profiler_get(self, env, job): func_id = job.job_config.job_function_id job_function = env["queue.job.function"].browse(func_id) - return Profiler(description=job_function._profile_make_name(job)) + return Profiler( + description=job_function._profile_make_name(job), + profile_session=f"{env.user.name} (uid={env.user.id})", + ) diff --git a/queue_job_profiler/tests/test_job_profiler.py b/queue_job_profiler/tests/test_job_profiler.py index 1eb696fecf..3349382c7d 100644 --- a/queue_job_profiler/tests/test_job_profiler.py +++ b/queue_job_profiler/tests/test_job_profiler.py @@ -137,3 +137,6 @@ def test_controller_profiler_get(self): self.assertEqual( profiler.description, f"queue.job {job.uuid} - {job.job_function_name}" ) + self.assertEqual( + profiler.profile_session, f"{self.env.user.name} (uid={self.env.user.id})" + ) From 22c7dc5bf8eb1e3977c8c430399c66534d71efa8 Mon Sep 17 00:00:00 2001 From: David Gallay Date: Wed, 8 Apr 2026 11:02:44 +0200 Subject: [PATCH 06/27] queue_job_profiler: fix handling of no job_function_id Prevent crash when the function is not defined. --- queue_job_profiler/controllers/main.py | 4 ++++ queue_job_profiler/models/queue_job.py | 11 +++++++++-- queue_job_profiler/tests/test_job_profiler.py | 12 ++++++++++++ 3 files changed, 25 insertions(+), 2 deletions(-) diff --git a/queue_job_profiler/controllers/main.py b/queue_job_profiler/controllers/main.py index 57d7576ccc..7a6a296d5e 100644 --- a/queue_job_profiler/controllers/main.py +++ b/queue_job_profiler/controllers/main.py @@ -14,6 +14,8 @@ def _try_perform_job(self, env, job): def _profiler_is_enabled(self, env, job): func_id = job.job_config.job_function_id + if not func_id: + return False job_function = env["queue.job.function"].browse(func_id) return job_function.is_profiling_enabled() @@ -24,6 +26,8 @@ def _profiler_perform_job(self, env, job): def _profiler_get(self, env, job): func_id = job.job_config.job_function_id + if not func_id: + return None job_function = env["queue.job.function"].browse(func_id) return Profiler( description=job_function._profile_make_name(job), diff --git a/queue_job_profiler/models/queue_job.py b/queue_job_profiler/models/queue_job.py index 04c1b893ee..1f4cba5750 100644 --- a/queue_job_profiler/models/queue_job.py +++ b/queue_job_profiler/models/queue_job.py @@ -1,7 +1,7 @@ # Copyright 2026 Camptocamp SA # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html) -from odoo import fields, models +from odoo import api, fields, models class QueueJob(models.Model): @@ -15,13 +15,18 @@ class QueueJob(models.Model): compute_sudo=True, ) + @api.depends("job_function_id") def _compute_job_is_profiled(self): for job in self: - # don't care about perf as this is loaded only on the job form view + if not job.job_function_id: + # cannot be profiled if it has no function + job.job_is_profiled = False + continue profile_name = job.job_function_id._profile_make_name(job) job.job_is_profiled = bool(job._profiler_get_record(profile_name)) def _profiler_get_record(self, profile_name): + # don't care about perf as this is loaded only on the job form view IrProfile = self.env["ir.profile"].sudo() return IrProfile.search( [("name", "=", profile_name)], @@ -30,6 +35,8 @@ def _profiler_get_record(self, profile_name): def action_view_profile(self): self.ensure_one() + if not self.job_function_id: + return {"type": "ir.actions.act_window_close"} profile_name = self.job_function_id._profile_make_name(self) profile = self._profiler_get_record(profile_name) if not profile: diff --git a/queue_job_profiler/tests/test_job_profiler.py b/queue_job_profiler/tests/test_job_profiler.py index 3349382c7d..ab0c907cdb 100644 --- a/queue_job_profiler/tests/test_job_profiler.py +++ b/queue_job_profiler/tests/test_job_profiler.py @@ -64,6 +64,18 @@ def test_func_profiling_enabled(self): self.assertFalse(self.user_func1.with_user(user).is_profiling_enabled()) self.assertFalse(self.user_func2.with_user(user).is_profiling_enabled()) + def test_job_without_function(self): + # if a job has no function, it cannot be profiled + self.user_func1.sudo().unlink() + self.user_func2.sudo().unlink() + job1 = self.env.user.with_delay().read(["id"]) + job1.store() + job_rec1 = job1.db_record() + self.assertFalse(job_rec1.job_function_id) + self.assertFalse(job_rec1.job_is_profiled) + with self.assertRaises(ValueError): + self.env["queue.job.function"]._profile_make_name(job_rec1) + def test_job_is_profiled(self): job1 = self.env.user.with_delay().read(["id"]) job1.store() From 23eb6605340876924031763334373dd18bb2cc88 Mon Sep 17 00:00:00 2001 From: Adam Heinz Date: Thu, 30 Apr 2026 15:26:39 -0400 Subject: [PATCH 07/27] [FIX] queue_job: Restore doctesting. --- queue_job/tests/common.py | 53 ------------------------- queue_job/tests/test_runner_channels.py | 9 ++++- queue_job/tests/test_runner_runner.py | 12 +++--- 3 files changed, 14 insertions(+), 60 deletions(-) diff --git a/queue_job/tests/common.py b/queue_job/tests/common.py index ca88c31b47..53dbef0453 100644 --- a/queue_job/tests/common.py +++ b/queue_job/tests/common.py @@ -1,16 +1,11 @@ # Copyright 2019 Camptocamp # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). -import doctest -import logging import typing from contextlib import contextmanager from itertools import groupby from operator import attrgetter from unittest import TestCase, mock -from odoo.tests.case import TestCase as _TestCase -from odoo.tests.common import MetaCase - from odoo.addons.queue_job.delay import Graph # pylint: disable=odoo-addons-relative-import @@ -411,51 +406,3 @@ def test_export(self): delayable = mock.MagicMock(name="DelayableBinding") delayable_cls.return_value = delayable yield delayable_cls, delayable - - -class OdooDocTestCase(doctest.DocTestCase, _TestCase, MetaCase("DummyCase", (), {})): - """ - We need a custom DocTestCase class in order to: - - define test_tags to run as part of standard tests - - output a more meaningful test name than default "DocTestCase.runTest" - """ - - def __init__( - self, doctest, optionflags=0, setUp=None, tearDown=None, checker=None, seq=0 - ): - super().__init__( - doctest._dt_test, - optionflags=optionflags, - setUp=setUp, - tearDown=tearDown, - checker=checker, - ) - self.test_sequence = seq - - def setUp(self): - """Log an extra statement which test is started.""" - super().setUp() - logging.getLogger(__name__).info("Running tests for %s", self._dt_test.name) - - -def load_doctests(module): - """ - Generates a tests loading method for the doctests of the given module - https://docs.python.org/3/library/unittest.html#load-tests-protocol - """ - - def load_tests(loader, tests, ignore): - """ - Apply the 'test_tags' attribute to each DocTestCase found by the DocTestSuite. - Also extend the DocTestCase class trivially to fit the class teardown - that Odoo backported for its own test classes from Python 3.8. - """ - - for idx, test in enumerate(doctest.DocTestSuite(module)): - odoo_test = OdooDocTestCase(test, seq=idx) - odoo_test.test_tags = {"standard", "at_install", "queue_job", "doctest"} - tests.addTest(odoo_test) - - return tests - - return load_tests diff --git a/queue_job/tests/test_runner_channels.py b/queue_job/tests/test_runner_channels.py index d323d00683..e7124abce8 100644 --- a/queue_job/tests/test_runner_channels.py +++ b/queue_job/tests/test_runner_channels.py @@ -1,10 +1,15 @@ # Copyright 2015-2016 Camptocamp SA # License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl.html) +import doctest + +from odoo.tests import BaseCase, tagged # pylint: disable=odoo-addons-relative-import # we are testing, we want to test as we were an external consumer of the API from odoo.addons.queue_job.jobrunner import channels -from .common import load_doctests -load_tests = load_doctests(channels) +@tagged("doctest") +class TestDoctest(BaseCase): + def test_doctest(self): + doctest.testmod(channels, exclude_empty=True, raise_on_error=True) diff --git a/queue_job/tests/test_runner_runner.py b/queue_job/tests/test_runner_runner.py index 131ce6322d..6ff543c983 100644 --- a/queue_job/tests/test_runner_runner.py +++ b/queue_job/tests/test_runner_runner.py @@ -1,17 +1,19 @@ # Copyright 2015-2016 Camptocamp SA # License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl.html) - -# pylint: disable=odoo-addons-relative-import -# we are testing, we want to test as we were an external consumer of the API +import doctest import os from odoo.tests import BaseCase, tagged +# pylint: disable=odoo-addons-relative-import +# we are testing, we want to test as we were an external consumer of the API from odoo.addons.queue_job.jobrunner import runner -from .common import load_doctests -load_tests = load_doctests(runner) +@tagged("doctest") +class TestDoctest(BaseCase): + def test_doctest(self): + doctest.testmod(runner, exclude_empty=True, raise_on_error=True) @tagged("-at_install", "post_install") From fa87126956490e53e5564cd7c20b32b0ec1b76f9 Mon Sep 17 00:00:00 2001 From: oca-ci Date: Tue, 26 May 2026 13:40:41 +0000 Subject: [PATCH 08/27] [UPD] Update queue_job_profiler.pot --- .../i18n/queue_job_profiler.pot | 81 +++++++++++++++++++ 1 file changed, 81 insertions(+) create mode 100644 queue_job_profiler/i18n/queue_job_profiler.pot diff --git a/queue_job_profiler/i18n/queue_job_profiler.pot b/queue_job_profiler/i18n/queue_job_profiler.pot new file mode 100644 index 0000000000..0f33941cd9 --- /dev/null +++ b/queue_job_profiler/i18n/queue_job_profiler.pot @@ -0,0 +1,81 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * queue_job_profiler +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 18.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: queue_job_profiler +#. odoo-python +#: code:addons/queue_job_profiler/models/queue_job_function.py:0 +msgid "A profiling until date must be set when profiling is enabled." +msgstr "" + +#. module: queue_job_profiler +#: model:ir.model.fields,help:queue_job_profiler.field_queue_job_function__profiling_enabled +msgid "Indicates whether profiling is enabled for this job function." +msgstr "" + +#. module: queue_job_profiler +#: model:ir.model,name:queue_job_profiler.model_queue_job_function +msgid "Job Functions" +msgstr "" + +#. module: queue_job_profiler +#: model:ir.model.fields,field_description:queue_job_profiler.field_queue_job__job_is_profiled +msgid "Profiled" +msgstr "" + +#. module: queue_job_profiler +#: model_terms:ir.ui.view,arch_db:queue_job_profiler.queue_job_function_form_profiler +msgid "Profiler" +msgstr "" + +#. module: queue_job_profiler +#: model:ir.model.fields,field_description:queue_job_profiler.field_queue_job_function__profiling_enabled +msgid "Profiling enabled" +msgstr "" + +#. module: queue_job_profiler +#: model:ir.model.fields,field_description:queue_job_profiler.field_queue_job_function__profiling_until +msgid "Profiling until" +msgstr "" + +#. module: queue_job_profiler +#: model:ir.model.fields,field_description:queue_job_profiler.field_queue_job_function__profiling_user_ids +msgid "Profiling users" +msgstr "" + +#. module: queue_job_profiler +#: model:ir.model,name:queue_job_profiler.model_queue_job +msgid "Queue Job" +msgstr "" + +#. module: queue_job_profiler +#: model:ir.model.fields,help:queue_job_profiler.field_queue_job_function__profiling_until +msgid "" +"The date and time until which profiling is enabled for this job function." +msgstr "" + +#. module: queue_job_profiler +#: model:ir.model.fields,help:queue_job_profiler.field_queue_job_function__profiling_user_ids +msgid "The users allowed to perform profiling for this job function." +msgstr "" + +#. module: queue_job_profiler +#: model_terms:ir.ui.view,arch_db:queue_job_profiler.queue_job_form_profiler +msgid "View profiler" +msgstr "" + +#. module: queue_job_profiler +#: model:ir.model.fields,help:queue_job_profiler.field_queue_job__job_is_profiled +msgid "Whether this job has been profiled or not." +msgstr "" From d2c55f07feb16305d2dbba1456444b82e0fd3a5e Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Tue, 26 May 2026 13:44:24 +0000 Subject: [PATCH 09/27] [BOT] post-merge updates --- README.md | 1 + queue_job_profiler/README.rst | 16 ++++++++-- .../static/description/icon.png | Bin 0 -> 10254 bytes .../static/description/index.html | 30 +++++++++++------- setup/_metapackage/pyproject.toml | 3 +- 5 files changed, 36 insertions(+), 14 deletions(-) create mode 100644 queue_job_profiler/static/description/icon.png diff --git a/README.md b/README.md index fb36f7eddb..b4c1186bd0 100644 --- a/README.md +++ b/README.md @@ -26,6 +26,7 @@ addon | version | maintainers | summary [queue_job_batch](queue_job_batch/) | 18.0.1.0.0 | | Job Queue Batch [queue_job_cron](queue_job_cron/) | 18.0.1.1.1 | | Scheduled Actions as Queue Jobs [queue_job_cron_jobrunner](queue_job_cron_jobrunner/) | 18.0.1.0.1 | ivantodorovich | Run jobs without a dedicated JobRunner +[queue_job_profiler](queue_job_profiler/) | 18.0.1.0.0 | simahawk | Job Queue Profiler [queue_job_subscribe](queue_job_subscribe/) | 18.0.1.0.0 | | Control which users are subscribed to queue job notifications [test_queue_job](test_queue_job/) | 18.0.2.0.5 | sbidoul | Queue Job Tests [test_queue_job_batch](test_queue_job_batch/) | 18.0.1.0.0 | | Test Job Queue Batch diff --git a/queue_job_profiler/README.rst b/queue_job_profiler/README.rst index a2530f7ec9..695bc98d1a 100644 --- a/queue_job_profiler/README.rst +++ b/queue_job_profiler/README.rst @@ -1,3 +1,7 @@ +.. image:: https://odoo-community.org/readme-banner-image + :target: https://odoo-community.org/get-involved?utm_source=readme + :alt: Odoo Community Association + ================== Job Queue Profiler ================== @@ -7,13 +11,13 @@ Job Queue Profiler !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !! source digest: sha256:b6e605728ea05be0bf98dbe6e94c197bab21882e965286ef214f719e252b444e + !! source digest: sha256:e5e6823382b9de647ff5dda222e6338f224ea4cd51b79b69031930ebe0b35fab !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png :target: https://odoo-community.org/page/development-status :alt: Beta -.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png +.. |badge2| image:: https://img.shields.io/badge/license-AGPL--3-blue.png :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html :alt: License: AGPL-3 .. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fqueue-lightgray.png?logo=github @@ -92,6 +96,14 @@ OCA, or the Odoo Community Association, is a nonprofit organization whose mission is to support the collaborative development of Odoo features and promote its widespread use. +.. |maintainer-simahawk| image:: https://github.com/simahawk.png?size=40px + :target: https://github.com/simahawk + :alt: simahawk + +Current `maintainer `__: + +|maintainer-simahawk| + This module is part of the `OCA/queue `_ project on GitHub. You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/queue_job_profiler/static/description/icon.png b/queue_job_profiler/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..1dcc49c24f364e9adf0afbc6fc0bac6dbecdeb11 GIT binary patch literal 10254 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 -Job Queue Profiler +README.rst -
      -

      Job Queue Profiler

      +
      + + +Odoo Community Association + +
      +

      Job Queue Profiler

      -

      Beta License: AGPL-3 OCA/queue Translate me on Weblate Try me on Runboat

      +

      Beta License: AGPL-3 OCA/queue Translate me on Weblate Try me on Runboat

      This addon adds profiling controls to queue job functions and wraps queue job execution in an Odoo profiler session when enabled.

      When profiling is enabled for a job function and the executing user @@ -391,7 +396,7 @@

      Job Queue Profiler

-

Usage

+

Usage

  1. Open the Queue Job Functions menu.
  2. Open the job function you want to profile.
  3. @@ -404,7 +409,7 @@

    Usage

-

Bug Tracker

+

Bug Tracker

Bugs are tracked on GitHub Issues. In case of trouble, please check there if your issue has already been reported. If you spotted it first, help us to smash it by providing a detailed and welcomed @@ -412,15 +417,15 @@

Bug Tracker

Do not contact contributors directly about support or help with technical issues.

-

Credits

+

Credits

-

Authors

+

Authors

  • Camptocamp
-

Maintainers

+

Maintainers

This module is maintained by the OCA.

Odoo Community Association @@ -437,10 +442,13 @@

Maintainers

OCA, or the Odoo Community Association, is a nonprofit organization whose mission is to support the collaborative development of Odoo features and promote its widespread use.

+

Current maintainer:

+

simahawk

This module is part of the OCA/queue project on GitHub.

You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

+ diff --git a/setup/_metapackage/pyproject.toml b/setup/_metapackage/pyproject.toml index 8ad6da4a41..a7f0370299 100644 --- a/setup/_metapackage/pyproject.toml +++ b/setup/_metapackage/pyproject.toml @@ -1,12 +1,13 @@ [project] name = "odoo-addons-oca-queue" -version = "18.0.20250415.0" +version = "18.0.20260526.0" dependencies = [ "odoo-addon-base_import_async==18.0.*", "odoo-addon-queue_job==18.0.*", "odoo-addon-queue_job_batch==18.0.*", "odoo-addon-queue_job_cron==18.0.*", "odoo-addon-queue_job_cron_jobrunner==18.0.*", + "odoo-addon-queue_job_profiler==18.0.*", "odoo-addon-queue_job_subscribe==18.0.*", "odoo-addon-test_queue_job==18.0.*", "odoo-addon-test_queue_job_batch==18.0.*", From 55657f19981d5ae7bb4c1abff154ad8e6a44cdc5 Mon Sep 17 00:00:00 2001 From: mymage Date: Fri, 29 May 2026 09:39:43 +0000 Subject: [PATCH 10/27] Added translation using Weblate (Italian) --- queue_job_profiler/i18n/it.po | 82 +++++++++++++++++++++++++++++++++++ 1 file changed, 82 insertions(+) create mode 100644 queue_job_profiler/i18n/it.po diff --git a/queue_job_profiler/i18n/it.po b/queue_job_profiler/i18n/it.po new file mode 100644 index 0000000000..cfdc752b98 --- /dev/null +++ b/queue_job_profiler/i18n/it.po @@ -0,0 +1,82 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * queue_job_profiler +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 18.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: Automatically generated\n" +"Language-Team: none\n" +"Language: it\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" + +#. module: queue_job_profiler +#. odoo-python +#: code:addons/queue_job_profiler/models/queue_job_function.py:0 +msgid "A profiling until date must be set when profiling is enabled." +msgstr "" + +#. module: queue_job_profiler +#: model:ir.model.fields,help:queue_job_profiler.field_queue_job_function__profiling_enabled +msgid "Indicates whether profiling is enabled for this job function." +msgstr "" + +#. module: queue_job_profiler +#: model:ir.model,name:queue_job_profiler.model_queue_job_function +msgid "Job Functions" +msgstr "" + +#. module: queue_job_profiler +#: model:ir.model.fields,field_description:queue_job_profiler.field_queue_job__job_is_profiled +msgid "Profiled" +msgstr "" + +#. module: queue_job_profiler +#: model_terms:ir.ui.view,arch_db:queue_job_profiler.queue_job_function_form_profiler +msgid "Profiler" +msgstr "" + +#. module: queue_job_profiler +#: model:ir.model.fields,field_description:queue_job_profiler.field_queue_job_function__profiling_enabled +msgid "Profiling enabled" +msgstr "" + +#. module: queue_job_profiler +#: model:ir.model.fields,field_description:queue_job_profiler.field_queue_job_function__profiling_until +msgid "Profiling until" +msgstr "" + +#. module: queue_job_profiler +#: model:ir.model.fields,field_description:queue_job_profiler.field_queue_job_function__profiling_user_ids +msgid "Profiling users" +msgstr "" + +#. module: queue_job_profiler +#: model:ir.model,name:queue_job_profiler.model_queue_job +msgid "Queue Job" +msgstr "" + +#. module: queue_job_profiler +#: model:ir.model.fields,help:queue_job_profiler.field_queue_job_function__profiling_until +msgid "" +"The date and time until which profiling is enabled for this job function." +msgstr "" + +#. module: queue_job_profiler +#: model:ir.model.fields,help:queue_job_profiler.field_queue_job_function__profiling_user_ids +msgid "The users allowed to perform profiling for this job function." +msgstr "" + +#. module: queue_job_profiler +#: model_terms:ir.ui.view,arch_db:queue_job_profiler.queue_job_form_profiler +msgid "View profiler" +msgstr "" + +#. module: queue_job_profiler +#: model:ir.model.fields,help:queue_job_profiler.field_queue_job__job_is_profiled +msgid "Whether this job has been profiled or not." +msgstr "" From 05a7fd440c611281dad04779db591b6511fd63a1 Mon Sep 17 00:00:00 2001 From: Hoang Tran Date: Sat, 9 May 2026 12:51:04 +0700 Subject: [PATCH 11/27] [IMP] queue_job_batch: improve perf --- queue_job_batch/models/queue_job.py | 2 +- queue_job_batch/models/queue_job_batch.py | 50 ++++++++++++++++++----- 2 files changed, 41 insertions(+), 11 deletions(-) diff --git a/queue_job_batch/models/queue_job.py b/queue_job_batch/models/queue_job.py index ddc3efe879..524da23ef7 100644 --- a/queue_job_batch/models/queue_job.py +++ b/queue_job_batch/models/queue_job.py @@ -9,7 +9,7 @@ class QueueJob(models.Model): _inherit = "queue.job" - job_batch_id = fields.Many2one("queue.job.batch") + job_batch_id = fields.Many2one("queue.job.batch", index="btree_not_null") @api.model_create_multi def create(self, vals_list): diff --git a/queue_job_batch/models/queue_job_batch.py b/queue_job_batch/models/queue_job_batch.py index 998f7a5ac2..a0d084040d 100644 --- a/queue_job_batch/models/queue_job_batch.py +++ b/queue_job_batch/models/queue_job_batch.py @@ -62,9 +62,11 @@ class QueueJobBatch(models.Model): compute="_compute_job_count", ) - def _get_state(self): - self.ensure_one() - job_states = set(self.job_ids.grouped("state").keys()) + def _get_state(self, job_states): + """Determine the batch state from a set of job states. + + :param job_states: set of state strings for all jobs in this batch + """ if all(state in ("done", "cancelled", "failed") for state in job_states): return "finished" elif {"done", "started"} & job_states: @@ -74,8 +76,20 @@ def _get_state(self): return "pending" def check_state(self): + grouped = self.env["queue.job"].read_group( + [("job_batch_id", "in", self.ids)], + ["job_batch_id", "state"], + ["job_batch_id", "state"], + lazy=False, + ) + states_by_batch = {} + for g in grouped: + batch_id = g["job_batch_id"][0] + states_by_batch.setdefault(batch_id, set()).add(g["state"]) + for rec in self: - if (state := rec._get_state()) != rec.state: + job_states = states_by_batch.get(rec.id, set()) + if (state := rec._get_state(job_states)) != rec.state: rec.state = state def set_read(self): @@ -101,13 +115,29 @@ def get_new_batch(self, name, **kwargs): @api.depends("job_ids.state") def _compute_job_count(self): + grouped = self.env["queue.job"].read_group( + [("job_batch_id", "in", self.ids)], + ["job_batch_id", "state"], + ["job_batch_id", "state"], + lazy=False, + ) + counts = {} + for g in grouped: + batch_id = g["job_batch_id"][0] + counts.setdefault(batch_id, {}) + counts[batch_id][g["state"]] = g["__count"] + for rec in self: - jobs_by_state = rec.job_ids.grouped("state") - rec.job_count = len(rec.job_ids) - rec.failed_job_count = len(jobs_by_state.get("failed", [])) - rec.finished_job_count = len(jobs_by_state.get("done", [])) - rec.completeness = rec.finished_job_count / max(1, rec.job_count) - rec.failed_percentage = rec.failed_job_count / max(1, rec.job_count) + by_state = counts.get(rec.id, {}) + total = sum(by_state.values()) + done = by_state.get("done", 0) + failed = by_state.get("failed", 0) + + rec.job_count = total + rec.failed_job_count = failed + rec.finished_job_count = done + rec.completeness = done / max(1, total) + rec.failed_percentage = failed / max(1, total) @api.model def _to_store_fnames(self): From 1164f054e00d29dbcd53d1009dd37ba9bf75b6de Mon Sep 17 00:00:00 2001 From: mymage Date: Wed, 3 Jun 2026 07:11:17 +0000 Subject: [PATCH 12/27] Translated using Weblate (Italian) Currently translated at 100.0% (13 of 13 strings) Translation: queue-18.0/queue-18.0-queue_job_profiler Translate-URL: https://translation.odoo-community.org/projects/queue-18-0/queue-18-0-queue_job_profiler/it/ --- queue_job_profiler/i18n/it.po | 28 ++++++++++++++++++---------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/queue_job_profiler/i18n/it.po b/queue_job_profiler/i18n/it.po index cfdc752b98..51bb700240 100644 --- a/queue_job_profiler/i18n/it.po +++ b/queue_job_profiler/i18n/it.po @@ -6,77 +6,85 @@ msgid "" msgstr "" "Project-Id-Version: Odoo Server 18.0\n" "Report-Msgid-Bugs-To: \n" -"Last-Translator: Automatically generated\n" +"PO-Revision-Date: 2026-06-03 09:46+0000\n" +"Last-Translator: mymage \n" "Language-Team: none\n" "Language: it\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: \n" "Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 5.15.2\n" #. module: queue_job_profiler #. odoo-python #: code:addons/queue_job_profiler/models/queue_job_function.py:0 msgid "A profiling until date must be set when profiling is enabled." msgstr "" +"Quando la profilazione è abilitata deve essere impostata una data limite." #. module: queue_job_profiler #: model:ir.model.fields,help:queue_job_profiler.field_queue_job_function__profiling_enabled msgid "Indicates whether profiling is enabled for this job function." msgstr "" +"Indica quando la profilazione è abilitata per questa funzione lavorativa." #. module: queue_job_profiler #: model:ir.model,name:queue_job_profiler.model_queue_job_function msgid "Job Functions" -msgstr "" +msgstr "Funzioni lavorative" #. module: queue_job_profiler #: model:ir.model.fields,field_description:queue_job_profiler.field_queue_job__job_is_profiled msgid "Profiled" -msgstr "" +msgstr "Profilato" #. module: queue_job_profiler #: model_terms:ir.ui.view,arch_db:queue_job_profiler.queue_job_function_form_profiler msgid "Profiler" -msgstr "" +msgstr "Profilatore" #. module: queue_job_profiler #: model:ir.model.fields,field_description:queue_job_profiler.field_queue_job_function__profiling_enabled msgid "Profiling enabled" -msgstr "" +msgstr "Profilazione abilitata" #. module: queue_job_profiler #: model:ir.model.fields,field_description:queue_job_profiler.field_queue_job_function__profiling_until msgid "Profiling until" -msgstr "" +msgstr "Profilare fino a" #. module: queue_job_profiler #: model:ir.model.fields,field_description:queue_job_profiler.field_queue_job_function__profiling_user_ids msgid "Profiling users" -msgstr "" +msgstr "Utenti profilazione" #. module: queue_job_profiler #: model:ir.model,name:queue_job_profiler.model_queue_job msgid "Queue Job" -msgstr "" +msgstr "Lavoro in coda" #. module: queue_job_profiler #: model:ir.model.fields,help:queue_job_profiler.field_queue_job_function__profiling_until msgid "" "The date and time until which profiling is enabled for this job function." msgstr "" +"Data e ora entro cui la profilazione è abilitata per questa funzione " +"lavorativa." #. module: queue_job_profiler #: model:ir.model.fields,help:queue_job_profiler.field_queue_job_function__profiling_user_ids msgid "The users allowed to perform profiling for this job function." msgstr "" +"Gli utenti abilitati ad applicare la profilazione per questa funzione " +"lavorativa." #. module: queue_job_profiler #: model_terms:ir.ui.view,arch_db:queue_job_profiler.queue_job_form_profiler msgid "View profiler" -msgstr "" +msgstr "Visualizza profilatore" #. module: queue_job_profiler #: model:ir.model.fields,help:queue_job_profiler.field_queue_job__job_is_profiled msgid "Whether this job has been profiled or not." -msgstr "" +msgstr "Se questo incarico è stato profilato o meno." From ccef05c9700448b170b1b6bb6918b77c941c6e9d Mon Sep 17 00:00:00 2001 From: Thierry Ducrest Date: Thu, 4 Jun 2026 09:37:29 +0200 Subject: [PATCH 13/27] [FIX] queue_job_profiler: controller hook Broken by job acquisition refactoring #941 --- queue_job_profiler/controllers/main.py | 18 +++++++++++------- queue_job_profiler/tests/test_job_profiler.py | 6 +----- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/queue_job_profiler/controllers/main.py b/queue_job_profiler/controllers/main.py index 7a6a296d5e..9717e6d388 100644 --- a/queue_job_profiler/controllers/main.py +++ b/queue_job_profiler/controllers/main.py @@ -7,24 +7,28 @@ class RunJobController(BaseController): - def _try_perform_job(self, env, job): - if self._profiler_is_enabled(env, job): - return self._profiler_perform_job(env, job) + @classmethod + def _try_perform_job(cls, env, job): + if cls._profiler_is_enabled(env, job): + return cls._profiler_perform_job(env, job) return super()._try_perform_job(env, job) - def _profiler_is_enabled(self, env, job): + @classmethod + def _profiler_is_enabled(cls, env, job): func_id = job.job_config.job_function_id if not func_id: return False job_function = env["queue.job.function"].browse(func_id) return job_function.is_profiling_enabled() - def _profiler_perform_job(self, env, job): - with self._profiler_get(env, job): + @classmethod + def _profiler_perform_job(cls, env, job): + with cls._profiler_get(env, job): result = super()._try_perform_job(env, job) return result - def _profiler_get(self, env, job): + @classmethod + def _profiler_get(cls, env, job): func_id = job.job_config.job_function_id if not func_id: return None diff --git a/queue_job_profiler/tests/test_job_profiler.py b/queue_job_profiler/tests/test_job_profiler.py index ab0c907cdb..d1047795cb 100644 --- a/queue_job_profiler/tests/test_job_profiler.py +++ b/queue_job_profiler/tests/test_job_profiler.py @@ -111,12 +111,8 @@ def test_job_action_view_profile(self): self.assertEqual(action["res_id"], prof.id) def _run_controller(self, job, user=None): - controller = RunJobController() env = self.env(user=user) if user else self.env - with ( - patch.object(self.env.cr, "commit"), - ): - controller._try_perform_job(env, job) + RunJobController._try_perform_job(env, job) def test_controller(self): job = self.env.user.with_delay().read(["id"]) From 71220eabb70b8eda9b7d8051c80032899a47ddd2 Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Fri, 5 Jun 2026 13:25:10 +0000 Subject: [PATCH 14/27] [BOT] post-merge updates --- README.md | 2 +- queue_job_profiler/README.rst | 2 +- queue_job_profiler/__manifest__.py | 2 +- queue_job_profiler/static/description/index.html | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index b4c1186bd0..2e5f65cf2a 100644 --- a/README.md +++ b/README.md @@ -26,7 +26,7 @@ addon | version | maintainers | summary [queue_job_batch](queue_job_batch/) | 18.0.1.0.0 | | Job Queue Batch [queue_job_cron](queue_job_cron/) | 18.0.1.1.1 | | Scheduled Actions as Queue Jobs [queue_job_cron_jobrunner](queue_job_cron_jobrunner/) | 18.0.1.0.1 | ivantodorovich | Run jobs without a dedicated JobRunner -[queue_job_profiler](queue_job_profiler/) | 18.0.1.0.0 | simahawk | Job Queue Profiler +[queue_job_profiler](queue_job_profiler/) | 18.0.1.0.1 | simahawk | Job Queue Profiler [queue_job_subscribe](queue_job_subscribe/) | 18.0.1.0.0 | | Control which users are subscribed to queue job notifications [test_queue_job](test_queue_job/) | 18.0.2.0.5 | sbidoul | Queue Job Tests [test_queue_job_batch](test_queue_job_batch/) | 18.0.1.0.0 | | Test Job Queue Batch diff --git a/queue_job_profiler/README.rst b/queue_job_profiler/README.rst index 695bc98d1a..6339df4de4 100644 --- a/queue_job_profiler/README.rst +++ b/queue_job_profiler/README.rst @@ -11,7 +11,7 @@ Job Queue Profiler !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !! source digest: sha256:e5e6823382b9de647ff5dda222e6338f224ea4cd51b79b69031930ebe0b35fab + !! source digest: sha256:81110cbf029c5da24b53e16e05ed53c784d8df608158c1506c7464c972af5fbc !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png diff --git a/queue_job_profiler/__manifest__.py b/queue_job_profiler/__manifest__.py index 7db4b83454..724dad205a 100644 --- a/queue_job_profiler/__manifest__.py +++ b/queue_job_profiler/__manifest__.py @@ -3,7 +3,7 @@ { "name": "Job Queue Profiler", - "version": "18.0.1.0.0", + "version": "18.0.1.0.1", "author": "Camptocamp, Odoo Community Association (OCA)", "maintainers": ["simahawk"], "website": "https://github.com/OCA/queue", diff --git a/queue_job_profiler/static/description/index.html b/queue_job_profiler/static/description/index.html index 6637e6a169..958d29acc3 100644 --- a/queue_job_profiler/static/description/index.html +++ b/queue_job_profiler/static/description/index.html @@ -372,7 +372,7 @@

Job Queue Profiler

!! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!! source digest: sha256:e5e6823382b9de647ff5dda222e6338f224ea4cd51b79b69031930ebe0b35fab +!! source digest: sha256:81110cbf029c5da24b53e16e05ed53c784d8df608158c1506c7464c972af5fbc !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->

Beta License: AGPL-3 OCA/queue Translate me on Weblate Try me on Runboat

This addon adds profiling controls to queue job functions and wraps From dadad55efb840c01a00fbc79e66b94d836720bec Mon Sep 17 00:00:00 2001 From: Yann Papouin Date: Thu, 11 Jun 2026 14:10:53 +0000 Subject: [PATCH 15/27] Added translation using Weblate (French) --- queue_job/i18n/fr.po | 908 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 908 insertions(+) create mode 100644 queue_job/i18n/fr.po diff --git a/queue_job/i18n/fr.po b/queue_job/i18n/fr.po new file mode 100644 index 0000000000..a5c8e301de --- /dev/null +++ b/queue_job/i18n/fr.po @@ -0,0 +1,908 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * queue_job +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 18.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: Automatically generated\n" +"Language-Team: none\n" +"Language: fr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n > 1;\n" + +#. module: queue_job +#: model_terms:ir.ui.view,arch_db:queue_job.view_queue_job_form +msgid "" +"
\n" +" If the max. retries is 0, the number of retries is infinite." +msgstr "" + +#. module: queue_job +#. odoo-python +#: code:addons/queue_job/controllers/main.py:0 +msgid "Access Denied" +msgstr "" + +#. module: queue_job +#: model:ir.model.fields,field_description:queue_job.field_queue_job__message_needaction +msgid "Action Needed" +msgstr "" + +#. module: queue_job +#: model:ir.model.fields,field_description:queue_job.field_queue_job__activity_ids +msgid "Activities" +msgstr "" + +#. module: queue_job +#: model:ir.model.fields,field_description:queue_job.field_queue_job__activity_exception_decoration +msgid "Activity Exception Decoration" +msgstr "" + +#. module: queue_job +#: model:ir.model.fields,field_description:queue_job.field_queue_job__activity_state +msgid "Activity State" +msgstr "" + +#. module: queue_job +#: model:ir.model.fields,field_description:queue_job.field_queue_job__activity_type_icon +msgid "Activity Type Icon" +msgstr "" + +#. module: queue_job +#: model:ir.model.fields,field_description:queue_job.field_queue_job_function__allow_commit +msgid "Allow Commit" +msgstr "" + +#. module: queue_job +#: model:ir.model.fields,help:queue_job.field_queue_job_function__allow_commit +msgid "" +"Allows the job to commit transactions during execution. Under the hood, this" +" executes the job in a new database cursor, which incurs an overhead as it " +"requires an extra connection to the database. " +msgstr "" + +#. module: queue_job +#: model:ir.model.fields,field_description:queue_job.field_queue_job__args +msgid "Args" +msgstr "" + +#. module: queue_job +#: model:ir.model.fields,field_description:queue_job.field_queue_job__message_attachment_count +msgid "Attachment Count" +msgstr "" + +#. module: queue_job +#: model:ir.actions.server,name:queue_job.ir_cron_autovacuum_queue_jobs_ir_actions_server +msgid "AutoVacuum Job Queue" +msgstr "" + +#. module: queue_job +#: model:ir.model,name:queue_job.model_base +msgid "Base" +msgstr "" + +#. module: queue_job +#: model_terms:ir.ui.view,arch_db:queue_job.view_requeue_job +#: model_terms:ir.ui.view,arch_db:queue_job.view_set_jobs_cancelled +#: model_terms:ir.ui.view,arch_db:queue_job.view_set_jobs_done +msgid "Cancel" +msgstr "" + +#. module: queue_job +#: model:ir.model,name:queue_job.model_queue_jobs_to_cancelled +msgid "Cancel all selected jobs" +msgstr "" + +#. module: queue_job +#: model_terms:ir.ui.view,arch_db:queue_job.view_queue_job_form +msgid "Cancel job" +msgstr "" + +#. module: queue_job +#: model:ir.actions.act_window,name:queue_job.action_set_jobs_cancelled +#: model_terms:ir.ui.view,arch_db:queue_job.view_set_jobs_cancelled +msgid "Cancel jobs" +msgstr "" + +#. module: queue_job +#: model:ir.model.fields.selection,name:queue_job.selection__queue_job__state__cancelled +#: model_terms:ir.ui.view,arch_db:queue_job.view_queue_job_search +msgid "Cancelled" +msgstr "" + +#. module: queue_job +#. odoo-python +#: code:addons/queue_job/models/queue_job.py:0 +msgid "Cancelled by {}" +msgstr "" + +#. module: queue_job +#. odoo-python +#: code:addons/queue_job/models/queue_job_channel.py:0 +msgid "Cannot change the root channel" +msgstr "" + +#. module: queue_job +#. odoo-python +#: code:addons/queue_job/models/queue_job_channel.py:0 +msgid "Cannot remove the root channel" +msgstr "" + +#. module: queue_job +#: model:ir.model.fields,field_description:queue_job.field_queue_job__channel +#: model:ir.model.fields,field_description:queue_job.field_queue_job_function__channel_id +#: model_terms:ir.ui.view,arch_db:queue_job.view_queue_job_function_search +#: model_terms:ir.ui.view,arch_db:queue_job.view_queue_job_search +msgid "Channel" +msgstr "" + +#. module: queue_job +#: model:ir.model.constraint,message:queue_job.constraint_queue_job_channel_name_uniq +msgid "Channel complete name must be unique" +msgstr "" + +#. module: queue_job +#: model:ir.actions.act_window,name:queue_job.action_queue_job_channel +#: model:ir.ui.menu,name:queue_job.menu_queue_job_channel +#: model_terms:ir.ui.view,arch_db:queue_job.view_queue_job_channel_form +#: model_terms:ir.ui.view,arch_db:queue_job.view_queue_job_channel_search +msgid "Channels" +msgstr "" + +#. module: queue_job +#: model:ir.model.fields,field_description:queue_job.field_queue_job__company_id +msgid "Company" +msgstr "" + +#. module: queue_job +#: model:ir.model.fields,field_description:queue_job.field_queue_job__channel_method_name +msgid "Complete Method Name" +msgstr "" + +#. module: queue_job +#: model:ir.model.fields,field_description:queue_job.field_queue_job_channel__complete_name +#: model:ir.model.fields,field_description:queue_job.field_queue_job_function__channel +msgid "Complete Name" +msgstr "" + +#. module: queue_job +#: model:ir.model.fields,field_description:queue_job.field_queue_job__date_created +msgid "Created Date" +msgstr "" + +#. module: queue_job +#: model:ir.model.fields,field_description:queue_job.field_queue_job_channel__create_uid +#: model:ir.model.fields,field_description:queue_job.field_queue_job_lock__create_uid +#: model:ir.model.fields,field_description:queue_job.field_queue_jobs_to_cancelled__create_uid +#: model:ir.model.fields,field_description:queue_job.field_queue_jobs_to_done__create_uid +#: model:ir.model.fields,field_description:queue_job.field_queue_requeue_job__create_uid +msgid "Created by" +msgstr "" + +#. module: queue_job +#: model_terms:ir.ui.view,arch_db:queue_job.view_queue_job_search +msgid "Created date" +msgstr "" + +#. module: queue_job +#: model:ir.model.fields,field_description:queue_job.field_queue_job_channel__create_date +#: model:ir.model.fields,field_description:queue_job.field_queue_job_lock__create_date +#: model:ir.model.fields,field_description:queue_job.field_queue_jobs_to_cancelled__create_date +#: model:ir.model.fields,field_description:queue_job.field_queue_jobs_to_done__create_date +#: model:ir.model.fields,field_description:queue_job.field_queue_requeue_job__create_date +msgid "Created on" +msgstr "" + +#. module: queue_job +#: model:ir.model.fields,field_description:queue_job.field_queue_job__retry +msgid "Current try" +msgstr "" + +#. module: queue_job +#: model_terms:ir.ui.view,arch_db:queue_job.view_queue_job_form +msgid "Current try / max. retries" +msgstr "" + +#. module: queue_job +#: model:ir.model.fields,field_description:queue_job.field_queue_job__date_cancelled +msgid "Date Cancelled" +msgstr "" + +#. module: queue_job +#: model:ir.model.fields,field_description:queue_job.field_queue_job__date_done +msgid "Date Done" +msgstr "" + +#. module: queue_job +#: model:ir.model.fields,field_description:queue_job.field_queue_job__dependencies +#: model_terms:ir.ui.view,arch_db:queue_job.view_queue_job_form +msgid "Dependencies" +msgstr "" + +#. module: queue_job +#: model:ir.model.fields,field_description:queue_job.field_queue_job__dependency_graph +msgid "Dependency Graph" +msgstr "" + +#. module: queue_job +#: model:ir.model.fields,field_description:queue_job.field_queue_job__name +msgid "Description" +msgstr "" + +#. module: queue_job +#: model:ir.model.fields,field_description:queue_job.field_queue_job__display_name +#: model:ir.model.fields,field_description:queue_job.field_queue_job_channel__display_name +#: model:ir.model.fields,field_description:queue_job.field_queue_job_function__display_name +#: model:ir.model.fields,field_description:queue_job.field_queue_job_lock__display_name +#: model:ir.model.fields,field_description:queue_job.field_queue_jobs_to_cancelled__display_name +#: model:ir.model.fields,field_description:queue_job.field_queue_jobs_to_done__display_name +#: model:ir.model.fields,field_description:queue_job.field_queue_requeue_job__display_name +msgid "Display Name" +msgstr "" + +#. module: queue_job +#: model:ir.model.fields.selection,name:queue_job.selection__queue_job__state__done +#: model_terms:ir.ui.view,arch_db:queue_job.view_queue_job_search +msgid "Done" +msgstr "" + +#. module: queue_job +#: model:ir.model.fields,field_description:queue_job.field_queue_job__date_enqueued +msgid "Enqueue Time" +msgstr "" + +#. module: queue_job +#: model:ir.model.fields.selection,name:queue_job.selection__queue_job__state__enqueued +#: model_terms:ir.ui.view,arch_db:queue_job.view_queue_job_search +msgid "Enqueued" +msgstr "" + +#. module: queue_job +#: model:ir.model.fields,field_description:queue_job.field_queue_job__exc_name +#: model_terms:ir.ui.view,arch_db:queue_job.view_queue_job_search +msgid "Exception" +msgstr "" + +#. module: queue_job +#: model:ir.model.fields,field_description:queue_job.field_queue_job__exc_info +msgid "Exception Info" +msgstr "" + +#. module: queue_job +#: model_terms:ir.ui.view,arch_db:queue_job.view_queue_job_form +msgid "Exception Information" +msgstr "" + +#. module: queue_job +#: model:ir.model.fields,field_description:queue_job.field_queue_job__exc_message +msgid "Exception Message" +msgstr "" + +#. module: queue_job +#: model_terms:ir.ui.view,arch_db:queue_job.view_queue_job_search +msgid "Exception message" +msgstr "" + +#. module: queue_job +#: model_terms:ir.ui.view,arch_db:queue_job.view_queue_job_form +msgid "Exception:" +msgstr "" + +#. module: queue_job +#: model:ir.model.fields,field_description:queue_job.field_queue_job__eta +msgid "Execute only after" +msgstr "" + +#. module: queue_job +#: model:ir.model.fields,field_description:queue_job.field_queue_job__exec_time +msgid "Execution Time (avg)" +msgstr "" + +#. module: queue_job +#: model:ir.model.fields.selection,name:queue_job.selection__queue_job__state__failed +#: model_terms:ir.ui.view,arch_db:queue_job.view_queue_job_search +msgid "Failed" +msgstr "" + +#. module: queue_job +#: model:ir.model.fields,field_description:queue_job.field_ir_model_fields__ttype +msgid "Field Type" +msgstr "" + +#. module: queue_job +#: model:ir.model,name:queue_job.model_ir_model_fields +msgid "Fields" +msgstr "" + +#. module: queue_job +#: model:ir.model.fields,field_description:queue_job.field_queue_job__message_follower_ids +msgid "Followers" +msgstr "" + +#. module: queue_job +#: model:ir.model.fields,field_description:queue_job.field_queue_job__message_partner_ids +msgid "Followers (Partners)" +msgstr "" + +#. module: queue_job +#: model:ir.model.fields,help:queue_job.field_queue_job__activity_type_icon +msgid "Font awesome icon e.g. fa-tasks" +msgstr "" + +#. module: queue_job +#: model_terms:ir.ui.view,arch_db:queue_job.view_queue_job_search +msgid "Graph" +msgstr "" + +#. module: queue_job +#: model_terms:ir.ui.view,arch_db:queue_job.view_queue_job_form +msgid "Graph Jobs" +msgstr "" + +#. module: queue_job +#: model:ir.model.fields,field_description:queue_job.field_queue_job__graph_jobs_count +msgid "Graph Jobs Count" +msgstr "" + +#. module: queue_job +#: model:ir.model.fields,field_description:queue_job.field_queue_job__graph_uuid +msgid "Graph UUID" +msgstr "" + +#. module: queue_job +#: model_terms:ir.ui.view,arch_db:queue_job.view_queue_job_function_search +#: model_terms:ir.ui.view,arch_db:queue_job.view_queue_job_search +msgid "Group By" +msgstr "" + +#. module: queue_job +#: model:ir.model.fields,field_description:queue_job.field_queue_job__has_message +msgid "Has Message" +msgstr "" + +#. module: queue_job +#: model:ir.model.fields,field_description:queue_job.field_queue_job__id +#: model:ir.model.fields,field_description:queue_job.field_queue_job_channel__id +#: model:ir.model.fields,field_description:queue_job.field_queue_job_function__id +#: model:ir.model.fields,field_description:queue_job.field_queue_job_lock__id +#: model:ir.model.fields,field_description:queue_job.field_queue_jobs_to_cancelled__id +#: model:ir.model.fields,field_description:queue_job.field_queue_jobs_to_done__id +#: model:ir.model.fields,field_description:queue_job.field_queue_requeue_job__id +msgid "ID" +msgstr "" + +#. module: queue_job +#: model:ir.model.fields,field_description:queue_job.field_queue_job__activity_exception_icon +msgid "Icon" +msgstr "" + +#. module: queue_job +#: model:ir.model.fields,help:queue_job.field_queue_job__activity_exception_icon +msgid "Icon to indicate an exception activity." +msgstr "" + +#. module: queue_job +#: model:ir.model.fields,field_description:queue_job.field_queue_job__identity_key +msgid "Identity Key" +msgstr "" + +#. module: queue_job +#: model:ir.model.fields,help:queue_job.field_queue_job__message_needaction +msgid "If checked, new messages require your attention." +msgstr "" + +#. module: queue_job +#: model:ir.model.fields,help:queue_job.field_queue_job__message_has_error +msgid "If checked, some messages have a delivery error." +msgstr "" + +#. module: queue_job +#. odoo-python +#: code:addons/queue_job/models/queue_job_function.py:0 +msgid "Invalid job function: {}" +msgstr "" + +#. module: queue_job +#: model:ir.model.fields,field_description:queue_job.field_queue_job__message_is_follower +msgid "Is Follower" +msgstr "" + +#. module: queue_job +#: model:ir.model,name:queue_job.model_queue_job_channel +msgid "Job Channels" +msgstr "" + +#. module: queue_job +#: model:ir.model.fields,field_description:queue_job.field_queue_job__job_function_id +#: model_terms:ir.ui.view,arch_db:queue_job.view_queue_job_search +msgid "Job Function" +msgstr "" + +#. module: queue_job +#: model:ir.actions.act_window,name:queue_job.action_queue_job_function +#: model:ir.model,name:queue_job.model_queue_job_function +#: model:ir.model.fields,field_description:queue_job.field_queue_job_channel__job_function_ids +#: model:ir.ui.menu,name:queue_job.menu_queue_job_function +#: model_terms:ir.ui.view,arch_db:queue_job.view_queue_job_function_form +#: model_terms:ir.ui.view,arch_db:queue_job.view_queue_job_function_search +msgid "Job Functions" +msgstr "" + +#. module: queue_job +#: model:ir.module.category,name:queue_job.module_category_queue_job +#: model:ir.ui.menu,name:queue_job.menu_queue_job_root +msgid "Job Queue" +msgstr "" + +#. module: queue_job +#: model:res.groups,name:queue_job.group_queue_job_manager +msgid "Job Queue Manager" +msgstr "" + +#. module: queue_job +#: model:ir.model.fields.selection,name:queue_job.selection__ir_model_fields__ttype__job_serialized +msgid "Job Serialized" +msgstr "" + +#. module: queue_job +#: model:mail.message.subtype,name:queue_job.mt_job_failed +msgid "Job failed" +msgstr "" + +#. module: queue_job +#: model:ir.actions.act_window,name:queue_job.action_queue_job +#: model:ir.model.fields,field_description:queue_job.field_queue_jobs_to_cancelled__job_ids +#: model:ir.model.fields,field_description:queue_job.field_queue_jobs_to_done__job_ids +#: model:ir.model.fields,field_description:queue_job.field_queue_requeue_job__job_ids +#: model:ir.ui.menu,name:queue_job.menu_queue_job +#: model_terms:ir.ui.view,arch_db:queue_job.view_queue_job_form +#: model_terms:ir.ui.view,arch_db:queue_job.view_queue_job_graph +#: model_terms:ir.ui.view,arch_db:queue_job.view_queue_job_pivot +#: model_terms:ir.ui.view,arch_db:queue_job.view_queue_job_search +msgid "Jobs" +msgstr "" + +#. module: queue_job +#. odoo-python +#: code:addons/queue_job/models/queue_job.py:0 +msgid "Jobs for graph %s" +msgstr "" + +#. module: queue_job +#: model:ir.model.fields,field_description:queue_job.field_queue_job__kwargs +msgid "Kwargs" +msgstr "" + +#. module: queue_job +#: model_terms:ir.ui.view,arch_db:queue_job.view_queue_job_search +msgid "Last 24 hours" +msgstr "" + +#. module: queue_job +#: model_terms:ir.ui.view,arch_db:queue_job.view_queue_job_search +msgid "Last 30 days" +msgstr "" + +#. module: queue_job +#: model_terms:ir.ui.view,arch_db:queue_job.view_queue_job_search +msgid "Last 7 days" +msgstr "" + +#. module: queue_job +#: model:ir.model.fields,field_description:queue_job.field_queue_job_channel__write_uid +#: model:ir.model.fields,field_description:queue_job.field_queue_job_lock__write_uid +#: model:ir.model.fields,field_description:queue_job.field_queue_jobs_to_cancelled__write_uid +#: model:ir.model.fields,field_description:queue_job.field_queue_jobs_to_done__write_uid +#: model:ir.model.fields,field_description:queue_job.field_queue_requeue_job__write_uid +msgid "Last Updated by" +msgstr "" + +#. module: queue_job +#: model:ir.model.fields,field_description:queue_job.field_queue_job_channel__write_date +#: model:ir.model.fields,field_description:queue_job.field_queue_job_lock__write_date +#: model:ir.model.fields,field_description:queue_job.field_queue_jobs_to_cancelled__write_date +#: model:ir.model.fields,field_description:queue_job.field_queue_jobs_to_done__write_date +#: model:ir.model.fields,field_description:queue_job.field_queue_requeue_job__write_date +msgid "Last Updated on" +msgstr "" + +#. module: queue_job +#. odoo-python +#: code:addons/queue_job/models/queue_job.py:0 +msgid "Manually set to done by {}" +msgstr "" + +#. module: queue_job +#: model:ir.model.fields,field_description:queue_job.field_queue_job__max_retries +msgid "Max. retries" +msgstr "" + +#. module: queue_job +#: model:ir.model.fields,field_description:queue_job.field_queue_job__message_has_error +msgid "Message Delivery error" +msgstr "" + +#. module: queue_job +#: model:ir.model.fields,field_description:queue_job.field_queue_job__message_ids +msgid "Messages" +msgstr "" + +#. module: queue_job +#: model:ir.model.fields,field_description:queue_job.field_queue_job_function__method +msgid "Method" +msgstr "" + +#. module: queue_job +#: model:ir.model.fields,field_description:queue_job.field_queue_job__method_name +msgid "Method Name" +msgstr "" + +#. module: queue_job +#: model:ir.model.fields,field_description:queue_job.field_queue_job__model_name +#: model:ir.model.fields,field_description:queue_job.field_queue_job_function__model_id +#: model_terms:ir.ui.view,arch_db:queue_job.view_queue_job_search +msgid "Model" +msgstr "" + +#. module: queue_job +#. odoo-python +#: code:addons/queue_job/models/queue_job_function.py:0 +msgid "Model {} not found" +msgstr "" + +#. module: queue_job +#: model:ir.model.fields,field_description:queue_job.field_queue_job__my_activity_date_deadline +msgid "My Activity Deadline" +msgstr "" + +#. module: queue_job +#: model:ir.model.fields,field_description:queue_job.field_queue_job_channel__name +#: model:ir.model.fields,field_description:queue_job.field_queue_job_function__name +msgid "Name" +msgstr "" + +#. module: queue_job +#: model:ir.model.fields,field_description:queue_job.field_queue_job__activity_date_deadline +msgid "Next Activity Deadline" +msgstr "" + +#. module: queue_job +#: model:ir.model.fields,field_description:queue_job.field_queue_job__activity_summary +msgid "Next Activity Summary" +msgstr "" + +#. module: queue_job +#: model:ir.model.fields,field_description:queue_job.field_queue_job__activity_type_id +msgid "Next Activity Type" +msgstr "" + +#. module: queue_job +#. odoo-python +#: code:addons/queue_job/models/queue_job.py:0 +msgid "No action available for this job" +msgstr "" + +#. module: queue_job +#. odoo-python +#: code:addons/queue_job/models/queue_job.py:0 +msgid "Not allowed to change field(s): {}" +msgstr "" + +#. module: queue_job +#: model:ir.model.fields,field_description:queue_job.field_queue_job__message_needaction_counter +msgid "Number of Actions" +msgstr "" + +#. module: queue_job +#: model:ir.model.fields,field_description:queue_job.field_queue_job__message_has_error_counter +msgid "Number of errors" +msgstr "" + +#. module: queue_job +#: model:ir.model.fields,help:queue_job.field_queue_job__message_needaction_counter +msgid "Number of messages requiring action" +msgstr "" + +#. module: queue_job +#: model:ir.model.fields,help:queue_job.field_queue_job__message_has_error_counter +msgid "Number of messages with delivery error" +msgstr "" + +#. module: queue_job +#: model:ir.model.fields,field_description:queue_job.field_queue_job_channel__parent_id +msgid "Parent Channel" +msgstr "" + +#. module: queue_job +#. odoo-python +#: code:addons/queue_job/models/queue_job_channel.py:0 +msgid "Parent channel required." +msgstr "" + +#. module: queue_job +#: model:ir.model.fields,help:queue_job.field_queue_job_function__edit_retry_pattern +msgid "" +"Pattern expressing from the count of retries on retryable errors, the number of of seconds to postpone the next execution. Setting the number of seconds to a 2-element tuple or list will randomize the retry interval between the 2 values.\n" +"Example: {1: 10, 5: 20, 10: 30, 15: 300}.\n" +"Example: {1: (1, 10), 5: (11, 20), 10: (21, 30), 15: (100, 300)}.\n" +"See the module description for details." +msgstr "" + +#. module: queue_job +#: model:ir.model.fields.selection,name:queue_job.selection__queue_job__state__pending +#: model_terms:ir.ui.view,arch_db:queue_job.view_queue_job_search +msgid "Pending" +msgstr "" + +#. module: queue_job +#: model:ir.model.fields,field_description:queue_job.field_queue_job__priority +#: model_terms:ir.ui.view,arch_db:queue_job.view_queue_job_search +msgid "Priority" +msgstr "" + +#. module: queue_job +#: model:ir.ui.menu,name:queue_job.menu_queue +msgid "Queue" +msgstr "" + +#. module: queue_job +#: model:ir.model,name:queue_job.model_queue_job +#: model:ir.model.fields,field_description:queue_job.field_queue_job_lock__queue_job_id +msgid "Queue Job" +msgstr "" + +#. module: queue_job +#: model:ir.model,name:queue_job.model_queue_job_lock +msgid "Queue Job Lock" +msgstr "" + +#. module: queue_job +#: model:ir.model.fields,field_description:queue_job.field_queue_job__records +msgid "Record(s)" +msgstr "" + +#. module: queue_job +#: model_terms:ir.ui.view,arch_db:queue_job.view_queue_job_form +msgid "Related" +msgstr "" + +#. module: queue_job +#: model:ir.model.fields,field_description:queue_job.field_queue_job_function__edit_related_action +msgid "Related Action" +msgstr "" + +#. module: queue_job +#: model:ir.model.fields,field_description:queue_job.field_queue_job_function__related_action +msgid "Related Action (serialized)" +msgstr "" + +#. module: queue_job +#. odoo-python +#: code:addons/queue_job/models/queue_job.py:0 +msgid "Related Record" +msgstr "" + +#. module: queue_job +#. odoo-python +#: code:addons/queue_job/models/queue_job.py:0 +msgid "Related Records" +msgstr "" + +#. module: queue_job +#: model_terms:ir.ui.view,arch_db:queue_job.view_queue_job_tree +msgid "Remaining days to execute" +msgstr "" + +#. module: queue_job +#: model:ir.model.fields,field_description:queue_job.field_queue_job_channel__removal_interval +msgid "Removal Interval" +msgstr "" + +#. module: queue_job +#: model_terms:ir.ui.view,arch_db:queue_job.view_requeue_job +msgid "Requeue" +msgstr "" + +#. module: queue_job +#: model_terms:ir.ui.view,arch_db:queue_job.view_queue_job_form +msgid "Requeue Job" +msgstr "" + +#. module: queue_job +#: model:ir.actions.act_window,name:queue_job.action_requeue_job +#: model_terms:ir.ui.view,arch_db:queue_job.view_requeue_job +msgid "Requeue Jobs" +msgstr "" + +#. module: queue_job +#: model:ir.model.fields,field_description:queue_job.field_queue_job__activity_user_id +msgid "Responsible User" +msgstr "" + +#. module: queue_job +#: model:ir.model.fields,field_description:queue_job.field_queue_job__result +#: model_terms:ir.ui.view,arch_db:queue_job.view_queue_job_form +msgid "Result" +msgstr "" + +#. module: queue_job +#: model_terms:ir.ui.view,arch_db:queue_job.view_queue_job_form +msgid "Results" +msgstr "" + +#. module: queue_job +#: model:ir.model.fields,field_description:queue_job.field_queue_job_function__edit_retry_pattern +msgid "Retry Pattern" +msgstr "" + +#. module: queue_job +#: model:ir.model.fields,field_description:queue_job.field_queue_job_function__retry_pattern +msgid "Retry Pattern (serialized)" +msgstr "" + +#. module: queue_job +#: model:ir.model,name:queue_job.model_queue_jobs_to_done +msgid "Set all selected jobs to done" +msgstr "" + +#. module: queue_job +#: model_terms:ir.ui.view,arch_db:queue_job.view_set_jobs_done +msgid "Set jobs done" +msgstr "" + +#. module: queue_job +#: model:ir.actions.act_window,name:queue_job.action_set_jobs_done +msgid "Set jobs to done" +msgstr "" + +#. module: queue_job +#: model_terms:ir.ui.view,arch_db:queue_job.view_queue_job_form +msgid "Set to 'Done'" +msgstr "" + +#. module: queue_job +#: model_terms:ir.ui.view,arch_db:queue_job.view_set_jobs_done +msgid "Set to done" +msgstr "" + +#. module: queue_job +#: model:ir.model.fields,help:queue_job.field_queue_job__graph_uuid +msgid "Single shared identifier of a Graph. Empty for a single job." +msgstr "" + +#. module: queue_job +#. odoo-python +#: code:addons/queue_job/models/queue_job.py:0 +msgid "" +"Something bad happened during the execution of the job. More details in the " +"'Exception Information' section." +msgstr "" + +#. module: queue_job +#: model:ir.model.fields,field_description:queue_job.field_queue_job__date_started +msgid "Start Date" +msgstr "" + +#. module: queue_job +#: model:ir.model.fields.selection,name:queue_job.selection__queue_job__state__started +#: model_terms:ir.ui.view,arch_db:queue_job.view_queue_job_search +msgid "Started" +msgstr "" + +#. module: queue_job +#: model:ir.model.fields,field_description:queue_job.field_queue_job__state +#: model_terms:ir.ui.view,arch_db:queue_job.view_queue_job_search +msgid "State" +msgstr "" + +#. module: queue_job +#: model:ir.model.fields,help:queue_job.field_queue_job__activity_state +msgid "" +"Status based on activities\n" +"Overdue: Due date is already passed\n" +"Today: Activity date is today\n" +"Planned: Future activities." +msgstr "" + +#. module: queue_job +#: model:ir.model.fields,field_description:queue_job.field_queue_job__func_string +msgid "Task" +msgstr "" + +#. module: queue_job +#: model:ir.model.fields,help:queue_job.field_queue_job_function__edit_related_action +msgid "" +"The action when the button *Related Action* is used on a job. The default action is to open the view of the record related to the job. Configured as a dictionary with optional keys: enable, func_name, kwargs.\n" +"See the module description for details." +msgstr "" + +#. module: queue_job +#: model:ir.model.fields,help:queue_job.field_queue_job__max_retries +msgid "" +"The job will fail if the number of tries reach the max. retries.\n" +"Retries are infinite when empty." +msgstr "" + +#. module: queue_job +#: model_terms:ir.ui.view,arch_db:queue_job.view_set_jobs_cancelled +msgid "The selected jobs will be cancelled." +msgstr "" + +#. module: queue_job +#: model_terms:ir.ui.view,arch_db:queue_job.view_requeue_job +msgid "The selected jobs will be requeued." +msgstr "" + +#. module: queue_job +#: model_terms:ir.ui.view,arch_db:queue_job.view_set_jobs_done +msgid "The selected jobs will be set to done." +msgstr "" + +#. module: queue_job +#: model_terms:ir.ui.view,arch_db:queue_job.view_queue_job_form +msgid "Time (s)" +msgstr "" + +#. module: queue_job +#: model:ir.model.fields,help:queue_job.field_queue_job__exec_time +msgid "Time required to execute this job in seconds. Average when grouped." +msgstr "" + +#. module: queue_job +#: model_terms:ir.ui.view,arch_db:queue_job.view_queue_job_search +msgid "Tried many times" +msgstr "" + +#. module: queue_job +#: model:ir.model.fields,help:queue_job.field_queue_job__activity_exception_decoration +msgid "Type of the exception activity on record." +msgstr "" + +#. module: queue_job +#: model:ir.model.fields,field_description:queue_job.field_queue_job__uuid +msgid "UUID" +msgstr "" + +#. module: queue_job +#. odoo-python +#: code:addons/queue_job/models/queue_job_function.py:0 +msgid "" +"Unexpected format of Related Action for {}.\n" +"Example of valid format:\n" +"{{\"enable\": True, \"func_name\": \"related_action_foo\", \"kwargs\" {{\"limit\": 10}}}}" +msgstr "" + +#. module: queue_job +#. odoo-python +#: code:addons/queue_job/models/queue_job_function.py:0 +msgid "" +"Unexpected format of Retry Pattern for {}.\n" +"Example of valid formats:\n" +"{{1: 300, 5: 600, 10: 1200, 15: 3000}}\n" +"{{1: (1, 10), 5: (11, 20), 10: (21, 30), 15: (100, 300)}}" +msgstr "" + +#. module: queue_job +#: model:ir.model.fields,field_description:queue_job.field_queue_job__user_id +msgid "User ID" +msgstr "" + +#. module: queue_job +#: model:ir.model.fields.selection,name:queue_job.selection__queue_job__state__wait_dependencies +#: model_terms:ir.ui.view,arch_db:queue_job.view_queue_job_search +msgid "Wait Dependencies" +msgstr "" + +#. module: queue_job +#: model:ir.model,name:queue_job.model_queue_requeue_job +msgid "Wizard to requeue a selection of jobs" +msgstr "" + +#. module: queue_job +#: model:ir.model.fields,field_description:queue_job.field_queue_job__worker_pid +msgid "Worker Pid" +msgstr "" From 7392fe5a42de4da70fe62fdcb011d48e6f0d52d6 Mon Sep 17 00:00:00 2001 From: Yann Papouin Date: Thu, 11 Jun 2026 14:31:14 +0000 Subject: [PATCH 16/27] Translated using Weblate (French) Currently translated at 100.0% (156 of 156 strings) Translation: queue-18.0/queue-18.0-queue_job Translate-URL: https://translation.odoo-community.org/projects/queue-18-0/queue-18-0-queue_job/fr/ --- queue_job/i18n/fr.po | 335 ++++++++++++++++++++++++------------------- 1 file changed, 188 insertions(+), 147 deletions(-) diff --git a/queue_job/i18n/fr.po b/queue_job/i18n/fr.po index a5c8e301de..a3bc81e504 100644 --- a/queue_job/i18n/fr.po +++ b/queue_job/i18n/fr.po @@ -6,13 +6,15 @@ msgid "" msgstr "" "Project-Id-Version: Odoo Server 18.0\n" "Report-Msgid-Bugs-To: \n" -"Last-Translator: Automatically generated\n" +"PO-Revision-Date: 2026-06-11 14:31+0000\n" +"Last-Translator: Yann Papouin \n" "Language-Team: none\n" "Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: \n" "Plural-Forms: nplurals=2; plural=n > 1;\n" +"X-Generator: Weblate 5.15.2\n" #. module: queue_job #: model_terms:ir.ui.view,arch_db:queue_job.view_queue_job_form @@ -20,42 +22,45 @@ msgid "" "
\n" " If the max. retries is 0, the number of retries is infinite." msgstr "" +"
\n" +" Si le max de " +"tentatives est à 0, le nombre de tentatives sera illimité." #. module: queue_job #. odoo-python #: code:addons/queue_job/controllers/main.py:0 msgid "Access Denied" -msgstr "" +msgstr "Accès refusé" #. module: queue_job #: model:ir.model.fields,field_description:queue_job.field_queue_job__message_needaction msgid "Action Needed" -msgstr "" +msgstr "Nécessite une action" #. module: queue_job #: model:ir.model.fields,field_description:queue_job.field_queue_job__activity_ids msgid "Activities" -msgstr "" +msgstr "Activités" #. module: queue_job #: model:ir.model.fields,field_description:queue_job.field_queue_job__activity_exception_decoration msgid "Activity Exception Decoration" -msgstr "" +msgstr "Décoration d’activité en exception" #. module: queue_job #: model:ir.model.fields,field_description:queue_job.field_queue_job__activity_state msgid "Activity State" -msgstr "" +msgstr "Statut de l'activité" #. module: queue_job #: model:ir.model.fields,field_description:queue_job.field_queue_job__activity_type_icon msgid "Activity Type Icon" -msgstr "" +msgstr "Icône de type d’activité" #. module: queue_job #: model:ir.model.fields,field_description:queue_job.field_queue_job_function__allow_commit msgid "Allow Commit" -msgstr "" +msgstr "Autoriser « commit »" #. module: queue_job #: model:ir.model.fields,help:queue_job.field_queue_job_function__allow_commit @@ -64,73 +69,77 @@ msgid "" " executes the job in a new database cursor, which incurs an overhead as it " "requires an extra connection to the database. " msgstr "" +"Permet à la tâche de valider les transactions (commit) pendant son " +"exécution. En arrière-plan, cela exécute la tâche dans un nouveau curseur de " +"base de données, ce qui entraîne une surcharge, car cela nécessite une " +"connexion supplémentaire à la base de données. " #. module: queue_job #: model:ir.model.fields,field_description:queue_job.field_queue_job__args msgid "Args" -msgstr "" +msgstr "Arguments" #. module: queue_job #: model:ir.model.fields,field_description:queue_job.field_queue_job__message_attachment_count msgid "Attachment Count" -msgstr "" +msgstr "Nombre de pièces jointes" #. module: queue_job #: model:ir.actions.server,name:queue_job.ir_cron_autovacuum_queue_jobs_ir_actions_server msgid "AutoVacuum Job Queue" -msgstr "" +msgstr "Vidange automatique de la file d'attente des tâches" #. module: queue_job #: model:ir.model,name:queue_job.model_base msgid "Base" -msgstr "" +msgstr "Base" #. module: queue_job #: model_terms:ir.ui.view,arch_db:queue_job.view_requeue_job #: model_terms:ir.ui.view,arch_db:queue_job.view_set_jobs_cancelled #: model_terms:ir.ui.view,arch_db:queue_job.view_set_jobs_done msgid "Cancel" -msgstr "" +msgstr "Annuler" #. module: queue_job #: model:ir.model,name:queue_job.model_queue_jobs_to_cancelled msgid "Cancel all selected jobs" -msgstr "" +msgstr "Annuler toutes les tâches sélectionnées" #. module: queue_job #: model_terms:ir.ui.view,arch_db:queue_job.view_queue_job_form msgid "Cancel job" -msgstr "" +msgstr "Annuler la tâche" #. module: queue_job #: model:ir.actions.act_window,name:queue_job.action_set_jobs_cancelled #: model_terms:ir.ui.view,arch_db:queue_job.view_set_jobs_cancelled msgid "Cancel jobs" -msgstr "" +msgstr "Annuler les tâches" #. module: queue_job #: model:ir.model.fields.selection,name:queue_job.selection__queue_job__state__cancelled #: model_terms:ir.ui.view,arch_db:queue_job.view_queue_job_search msgid "Cancelled" -msgstr "" +msgstr "Annulé" #. module: queue_job #. odoo-python #: code:addons/queue_job/models/queue_job.py:0 msgid "Cancelled by {}" -msgstr "" +msgstr "Annulé par {}" #. module: queue_job #. odoo-python #: code:addons/queue_job/models/queue_job_channel.py:0 msgid "Cannot change the root channel" -msgstr "" +msgstr "Impossible de changer le canal racine" #. module: queue_job #. odoo-python #: code:addons/queue_job/models/queue_job_channel.py:0 msgid "Cannot remove the root channel" -msgstr "" +msgstr "Impossible de supprimer le canal racine" #. module: queue_job #: model:ir.model.fields,field_description:queue_job.field_queue_job__channel @@ -138,12 +147,12 @@ msgstr "" #: model_terms:ir.ui.view,arch_db:queue_job.view_queue_job_function_search #: model_terms:ir.ui.view,arch_db:queue_job.view_queue_job_search msgid "Channel" -msgstr "" +msgstr "Canal" #. module: queue_job #: model:ir.model.constraint,message:queue_job.constraint_queue_job_channel_name_uniq msgid "Channel complete name must be unique" -msgstr "" +msgstr "Le nom complet du canal doit être unique" #. module: queue_job #: model:ir.actions.act_window,name:queue_job.action_queue_job_channel @@ -151,28 +160,28 @@ msgstr "" #: model_terms:ir.ui.view,arch_db:queue_job.view_queue_job_channel_form #: model_terms:ir.ui.view,arch_db:queue_job.view_queue_job_channel_search msgid "Channels" -msgstr "" +msgstr "Canaux" #. module: queue_job #: model:ir.model.fields,field_description:queue_job.field_queue_job__company_id msgid "Company" -msgstr "" +msgstr "Société" #. module: queue_job #: model:ir.model.fields,field_description:queue_job.field_queue_job__channel_method_name msgid "Complete Method Name" -msgstr "" +msgstr "Nom complet de la méthode" #. module: queue_job #: model:ir.model.fields,field_description:queue_job.field_queue_job_channel__complete_name #: model:ir.model.fields,field_description:queue_job.field_queue_job_function__channel msgid "Complete Name" -msgstr "" +msgstr "Nom complet" #. module: queue_job #: model:ir.model.fields,field_description:queue_job.field_queue_job__date_created msgid "Created Date" -msgstr "" +msgstr "Date de création" #. module: queue_job #: model:ir.model.fields,field_description:queue_job.field_queue_job_channel__create_uid @@ -181,12 +190,12 @@ msgstr "" #: model:ir.model.fields,field_description:queue_job.field_queue_jobs_to_done__create_uid #: model:ir.model.fields,field_description:queue_job.field_queue_requeue_job__create_uid msgid "Created by" -msgstr "" +msgstr "Créé par" #. module: queue_job #: model_terms:ir.ui.view,arch_db:queue_job.view_queue_job_search msgid "Created date" -msgstr "" +msgstr "Date de création" #. module: queue_job #: model:ir.model.fields,field_description:queue_job.field_queue_job_channel__create_date @@ -195,43 +204,43 @@ msgstr "" #: model:ir.model.fields,field_description:queue_job.field_queue_jobs_to_done__create_date #: model:ir.model.fields,field_description:queue_job.field_queue_requeue_job__create_date msgid "Created on" -msgstr "" +msgstr "Créé le" #. module: queue_job #: model:ir.model.fields,field_description:queue_job.field_queue_job__retry msgid "Current try" -msgstr "" +msgstr "Tentative courante" #. module: queue_job #: model_terms:ir.ui.view,arch_db:queue_job.view_queue_job_form msgid "Current try / max. retries" -msgstr "" +msgstr "Tentative courante / tentatives max." #. module: queue_job #: model:ir.model.fields,field_description:queue_job.field_queue_job__date_cancelled msgid "Date Cancelled" -msgstr "" +msgstr "Date d'annulation" #. module: queue_job #: model:ir.model.fields,field_description:queue_job.field_queue_job__date_done msgid "Date Done" -msgstr "" +msgstr "Date d'achèvement" #. module: queue_job #: model:ir.model.fields,field_description:queue_job.field_queue_job__dependencies #: model_terms:ir.ui.view,arch_db:queue_job.view_queue_job_form msgid "Dependencies" -msgstr "" +msgstr "Dépendances" #. module: queue_job #: model:ir.model.fields,field_description:queue_job.field_queue_job__dependency_graph msgid "Dependency Graph" -msgstr "" +msgstr "Graphe de dépendance" #. module: queue_job #: model:ir.model.fields,field_description:queue_job.field_queue_job__name msgid "Description" -msgstr "" +msgstr "Description" #. module: queue_job #: model:ir.model.fields,field_description:queue_job.field_queue_job__display_name @@ -242,127 +251,127 @@ msgstr "" #: model:ir.model.fields,field_description:queue_job.field_queue_jobs_to_done__display_name #: model:ir.model.fields,field_description:queue_job.field_queue_requeue_job__display_name msgid "Display Name" -msgstr "" +msgstr "Intitulé" #. module: queue_job #: model:ir.model.fields.selection,name:queue_job.selection__queue_job__state__done #: model_terms:ir.ui.view,arch_db:queue_job.view_queue_job_search msgid "Done" -msgstr "" +msgstr "Terminé" #. module: queue_job #: model:ir.model.fields,field_description:queue_job.field_queue_job__date_enqueued msgid "Enqueue Time" -msgstr "" +msgstr "Date de mise en file d'attente" #. module: queue_job #: model:ir.model.fields.selection,name:queue_job.selection__queue_job__state__enqueued #: model_terms:ir.ui.view,arch_db:queue_job.view_queue_job_search msgid "Enqueued" -msgstr "" +msgstr "Mis en file d'attente" #. module: queue_job #: model:ir.model.fields,field_description:queue_job.field_queue_job__exc_name #: model_terms:ir.ui.view,arch_db:queue_job.view_queue_job_search msgid "Exception" -msgstr "" +msgstr "Exception" #. module: queue_job #: model:ir.model.fields,field_description:queue_job.field_queue_job__exc_info msgid "Exception Info" -msgstr "" +msgstr "Informations sur l'exception" #. module: queue_job #: model_terms:ir.ui.view,arch_db:queue_job.view_queue_job_form msgid "Exception Information" -msgstr "" +msgstr "Informations sur l'exception" #. module: queue_job #: model:ir.model.fields,field_description:queue_job.field_queue_job__exc_message msgid "Exception Message" -msgstr "" +msgstr "Message d’exception" #. module: queue_job #: model_terms:ir.ui.view,arch_db:queue_job.view_queue_job_search msgid "Exception message" -msgstr "" +msgstr "Message d’exception" #. module: queue_job #: model_terms:ir.ui.view,arch_db:queue_job.view_queue_job_form msgid "Exception:" -msgstr "" +msgstr "Exception :" #. module: queue_job #: model:ir.model.fields,field_description:queue_job.field_queue_job__eta msgid "Execute only after" -msgstr "" +msgstr "Exécuter seulement après" #. module: queue_job #: model:ir.model.fields,field_description:queue_job.field_queue_job__exec_time msgid "Execution Time (avg)" -msgstr "" +msgstr "Temps d’exécution (moyenne)" #. module: queue_job #: model:ir.model.fields.selection,name:queue_job.selection__queue_job__state__failed #: model_terms:ir.ui.view,arch_db:queue_job.view_queue_job_search msgid "Failed" -msgstr "" +msgstr "Echoué" #. module: queue_job #: model:ir.model.fields,field_description:queue_job.field_ir_model_fields__ttype msgid "Field Type" -msgstr "" +msgstr "Type du champ" #. module: queue_job #: model:ir.model,name:queue_job.model_ir_model_fields msgid "Fields" -msgstr "" +msgstr "Champs" #. module: queue_job #: model:ir.model.fields,field_description:queue_job.field_queue_job__message_follower_ids msgid "Followers" -msgstr "" +msgstr "Abonnés" #. module: queue_job #: model:ir.model.fields,field_description:queue_job.field_queue_job__message_partner_ids msgid "Followers (Partners)" -msgstr "" +msgstr "Abonnés (Partenaires)" #. module: queue_job #: model:ir.model.fields,help:queue_job.field_queue_job__activity_type_icon msgid "Font awesome icon e.g. fa-tasks" -msgstr "" +msgstr "Icône Font Awesome ex : fa-tasks" #. module: queue_job #: model_terms:ir.ui.view,arch_db:queue_job.view_queue_job_search msgid "Graph" -msgstr "" +msgstr "Graphe" #. module: queue_job #: model_terms:ir.ui.view,arch_db:queue_job.view_queue_job_form msgid "Graph Jobs" -msgstr "" +msgstr "Tâches du graphe" #. module: queue_job #: model:ir.model.fields,field_description:queue_job.field_queue_job__graph_jobs_count msgid "Graph Jobs Count" -msgstr "" +msgstr "Nombre de tâches du graphe" #. module: queue_job #: model:ir.model.fields,field_description:queue_job.field_queue_job__graph_uuid msgid "Graph UUID" -msgstr "" +msgstr "Graphe UUID" #. module: queue_job #: model_terms:ir.ui.view,arch_db:queue_job.view_queue_job_function_search #: model_terms:ir.ui.view,arch_db:queue_job.view_queue_job_search msgid "Group By" -msgstr "" +msgstr "Regrouper par" #. module: queue_job #: model:ir.model.fields,field_description:queue_job.field_queue_job__has_message msgid "Has Message" -msgstr "" +msgstr "A un message" #. module: queue_job #: model:ir.model.fields,field_description:queue_job.field_queue_job__id @@ -373,54 +382,54 @@ msgstr "" #: model:ir.model.fields,field_description:queue_job.field_queue_jobs_to_done__id #: model:ir.model.fields,field_description:queue_job.field_queue_requeue_job__id msgid "ID" -msgstr "" +msgstr "ID" #. module: queue_job #: model:ir.model.fields,field_description:queue_job.field_queue_job__activity_exception_icon msgid "Icon" -msgstr "" +msgstr "Icône" #. module: queue_job #: model:ir.model.fields,help:queue_job.field_queue_job__activity_exception_icon msgid "Icon to indicate an exception activity." -msgstr "" +msgstr "Icône pour indiquer une activité d'exception." #. module: queue_job #: model:ir.model.fields,field_description:queue_job.field_queue_job__identity_key msgid "Identity Key" -msgstr "" +msgstr "Clé d'identification" #. module: queue_job #: model:ir.model.fields,help:queue_job.field_queue_job__message_needaction msgid "If checked, new messages require your attention." -msgstr "" +msgstr "Si coché, de nouveaux messages requièrent votre attention." #. module: queue_job #: model:ir.model.fields,help:queue_job.field_queue_job__message_has_error msgid "If checked, some messages have a delivery error." -msgstr "" +msgstr "Si coché, certains messages ont une erreur de livraison." #. module: queue_job #. odoo-python #: code:addons/queue_job/models/queue_job_function.py:0 msgid "Invalid job function: {}" -msgstr "" +msgstr "Fonction de tâche invalide : {}" #. module: queue_job #: model:ir.model.fields,field_description:queue_job.field_queue_job__message_is_follower msgid "Is Follower" -msgstr "" +msgstr "Est abonné" #. module: queue_job #: model:ir.model,name:queue_job.model_queue_job_channel msgid "Job Channels" -msgstr "" +msgstr "Canaux de tâches" #. module: queue_job #: model:ir.model.fields,field_description:queue_job.field_queue_job__job_function_id #: model_terms:ir.ui.view,arch_db:queue_job.view_queue_job_search msgid "Job Function" -msgstr "" +msgstr "Fonction de tâche" #. module: queue_job #: model:ir.actions.act_window,name:queue_job.action_queue_job_function @@ -430,28 +439,28 @@ msgstr "" #: model_terms:ir.ui.view,arch_db:queue_job.view_queue_job_function_form #: model_terms:ir.ui.view,arch_db:queue_job.view_queue_job_function_search msgid "Job Functions" -msgstr "" +msgstr "Fonctions de tâche" #. module: queue_job #: model:ir.module.category,name:queue_job.module_category_queue_job #: model:ir.ui.menu,name:queue_job.menu_queue_job_root msgid "Job Queue" -msgstr "" +msgstr "File d'attente des tâches" #. module: queue_job #: model:res.groups,name:queue_job.group_queue_job_manager msgid "Job Queue Manager" -msgstr "" +msgstr "Gestionnaire de file d'attente des tâches" #. module: queue_job #: model:ir.model.fields.selection,name:queue_job.selection__ir_model_fields__ttype__job_serialized msgid "Job Serialized" -msgstr "" +msgstr "Sérialisation de tâche" #. module: queue_job #: model:mail.message.subtype,name:queue_job.mt_job_failed msgid "Job failed" -msgstr "" +msgstr "Tâche échouée" #. module: queue_job #: model:ir.actions.act_window,name:queue_job.action_queue_job @@ -464,33 +473,33 @@ msgstr "" #: model_terms:ir.ui.view,arch_db:queue_job.view_queue_job_pivot #: model_terms:ir.ui.view,arch_db:queue_job.view_queue_job_search msgid "Jobs" -msgstr "" +msgstr "Tâches" #. module: queue_job #. odoo-python #: code:addons/queue_job/models/queue_job.py:0 msgid "Jobs for graph %s" -msgstr "" +msgstr "Tâches du graphe %s" #. module: queue_job #: model:ir.model.fields,field_description:queue_job.field_queue_job__kwargs msgid "Kwargs" -msgstr "" +msgstr "Kwargs" #. module: queue_job #: model_terms:ir.ui.view,arch_db:queue_job.view_queue_job_search msgid "Last 24 hours" -msgstr "" +msgstr "Dernières 24 heures" #. module: queue_job #: model_terms:ir.ui.view,arch_db:queue_job.view_queue_job_search msgid "Last 30 days" -msgstr "" +msgstr "Les 30 derniers jours" #. module: queue_job #: model_terms:ir.ui.view,arch_db:queue_job.view_queue_job_search msgid "Last 7 days" -msgstr "" +msgstr "Les 7 derniers jours" #. module: queue_job #: model:ir.model.fields,field_description:queue_job.field_queue_job_channel__write_uid @@ -499,7 +508,7 @@ msgstr "" #: model:ir.model.fields,field_description:queue_job.field_queue_jobs_to_done__write_uid #: model:ir.model.fields,field_description:queue_job.field_queue_requeue_job__write_uid msgid "Last Updated by" -msgstr "" +msgstr "Modifié par" #. module: queue_job #: model:ir.model.fields,field_description:queue_job.field_queue_job_channel__write_date @@ -508,120 +517,120 @@ msgstr "" #: model:ir.model.fields,field_description:queue_job.field_queue_jobs_to_done__write_date #: model:ir.model.fields,field_description:queue_job.field_queue_requeue_job__write_date msgid "Last Updated on" -msgstr "" +msgstr "Modifié le" #. module: queue_job #. odoo-python #: code:addons/queue_job/models/queue_job.py:0 msgid "Manually set to done by {}" -msgstr "" +msgstr "Défini manuellement comme terminé par {}" #. module: queue_job #: model:ir.model.fields,field_description:queue_job.field_queue_job__max_retries msgid "Max. retries" -msgstr "" +msgstr "Nombre max. de tentatives" #. module: queue_job #: model:ir.model.fields,field_description:queue_job.field_queue_job__message_has_error msgid "Message Delivery error" -msgstr "" +msgstr "Erreur de livraison du message" #. module: queue_job #: model:ir.model.fields,field_description:queue_job.field_queue_job__message_ids msgid "Messages" -msgstr "" +msgstr "Messages" #. module: queue_job #: model:ir.model.fields,field_description:queue_job.field_queue_job_function__method msgid "Method" -msgstr "" +msgstr "Méthode" #. module: queue_job #: model:ir.model.fields,field_description:queue_job.field_queue_job__method_name msgid "Method Name" -msgstr "" +msgstr "Nom de méthode" #. module: queue_job #: model:ir.model.fields,field_description:queue_job.field_queue_job__model_name #: model:ir.model.fields,field_description:queue_job.field_queue_job_function__model_id #: model_terms:ir.ui.view,arch_db:queue_job.view_queue_job_search msgid "Model" -msgstr "" +msgstr "Modèle" #. module: queue_job #. odoo-python #: code:addons/queue_job/models/queue_job_function.py:0 msgid "Model {} not found" -msgstr "" +msgstr "Modèle {} non trouvé" #. module: queue_job #: model:ir.model.fields,field_description:queue_job.field_queue_job__my_activity_date_deadline msgid "My Activity Deadline" -msgstr "" +msgstr "Mon échéance d'activité" #. module: queue_job #: model:ir.model.fields,field_description:queue_job.field_queue_job_channel__name #: model:ir.model.fields,field_description:queue_job.field_queue_job_function__name msgid "Name" -msgstr "" +msgstr "Nom" #. module: queue_job #: model:ir.model.fields,field_description:queue_job.field_queue_job__activity_date_deadline msgid "Next Activity Deadline" -msgstr "" +msgstr "Échéance de la prochaine activité" #. module: queue_job #: model:ir.model.fields,field_description:queue_job.field_queue_job__activity_summary msgid "Next Activity Summary" -msgstr "" +msgstr "Résumé de la prochaine activité" #. module: queue_job #: model:ir.model.fields,field_description:queue_job.field_queue_job__activity_type_id msgid "Next Activity Type" -msgstr "" +msgstr "Type de la prochaine activité" #. module: queue_job #. odoo-python #: code:addons/queue_job/models/queue_job.py:0 msgid "No action available for this job" -msgstr "" +msgstr "Aucune action disponible pour cette tâche" #. module: queue_job #. odoo-python #: code:addons/queue_job/models/queue_job.py:0 msgid "Not allowed to change field(s): {}" -msgstr "" +msgstr "Non autorisé à changer le ou les champs : {}" #. module: queue_job #: model:ir.model.fields,field_description:queue_job.field_queue_job__message_needaction_counter msgid "Number of Actions" -msgstr "" +msgstr "Nombre d'actions" #. module: queue_job #: model:ir.model.fields,field_description:queue_job.field_queue_job__message_has_error_counter msgid "Number of errors" -msgstr "" +msgstr "Nombre d'erreurs" #. module: queue_job #: model:ir.model.fields,help:queue_job.field_queue_job__message_needaction_counter msgid "Number of messages requiring action" -msgstr "" +msgstr "Nombre de messages nécessitant une action" #. module: queue_job #: model:ir.model.fields,help:queue_job.field_queue_job__message_has_error_counter msgid "Number of messages with delivery error" -msgstr "" +msgstr "Nombre de messages avec erreur de livraison" #. module: queue_job #: model:ir.model.fields,field_description:queue_job.field_queue_job_channel__parent_id msgid "Parent Channel" -msgstr "" +msgstr "Canal parent" #. module: queue_job #. odoo-python #: code:addons/queue_job/models/queue_job_channel.py:0 msgid "Parent channel required." -msgstr "" +msgstr "Canal parent requis." #. module: queue_job #: model:ir.model.fields,help:queue_job.field_queue_job_function__edit_retry_pattern @@ -631,148 +640,157 @@ msgid "" "Example: {1: (1, 10), 5: (11, 20), 10: (21, 30), 15: (100, 300)}.\n" "See the module description for details." msgstr "" +"Modèle permettant de définir, à partir du nombre de tentatives pour les " +"erreurs pouvant faire l'objet d'une nouvelle tentative, le nombre de " +"secondes pendant lesquelles l'exécution suivante sera reportée. En " +"définissant ce nombre de secondes sous la forme d'un tuple ou d'une liste à " +"deux éléments, l'intervalle entre les tentatives sera aléatoire et compris " +"entre ces deux valeurs.\n" +"Exemple : {1 : 10, 5 : 20, 10 : 30, 15 : 300}.\n" +"Exemple : {1 : (1, 10), 5 : (11, 20), 10 : (21, 30), 15 : (100, 300)}.\n" +"Voir la description du module pour plus de détails." #. module: queue_job #: model:ir.model.fields.selection,name:queue_job.selection__queue_job__state__pending #: model_terms:ir.ui.view,arch_db:queue_job.view_queue_job_search msgid "Pending" -msgstr "" +msgstr "En attente" #. module: queue_job #: model:ir.model.fields,field_description:queue_job.field_queue_job__priority #: model_terms:ir.ui.view,arch_db:queue_job.view_queue_job_search msgid "Priority" -msgstr "" +msgstr "Priorité" #. module: queue_job #: model:ir.ui.menu,name:queue_job.menu_queue msgid "Queue" -msgstr "" +msgstr "File d'attente" #. module: queue_job #: model:ir.model,name:queue_job.model_queue_job #: model:ir.model.fields,field_description:queue_job.field_queue_job_lock__queue_job_id msgid "Queue Job" -msgstr "" +msgstr "File d'attente des tâches" #. module: queue_job #: model:ir.model,name:queue_job.model_queue_job_lock msgid "Queue Job Lock" -msgstr "" +msgstr "Verrour de la file d'attente des tâches" #. module: queue_job #: model:ir.model.fields,field_description:queue_job.field_queue_job__records msgid "Record(s)" -msgstr "" +msgstr "Enregistrement(s)" #. module: queue_job #: model_terms:ir.ui.view,arch_db:queue_job.view_queue_job_form msgid "Related" -msgstr "" +msgstr "En relation" #. module: queue_job #: model:ir.model.fields,field_description:queue_job.field_queue_job_function__edit_related_action msgid "Related Action" -msgstr "" +msgstr "Action rattachée" #. module: queue_job #: model:ir.model.fields,field_description:queue_job.field_queue_job_function__related_action msgid "Related Action (serialized)" -msgstr "" +msgstr "Action rattaché (sérialisé)" #. module: queue_job #. odoo-python #: code:addons/queue_job/models/queue_job.py:0 msgid "Related Record" -msgstr "" +msgstr "Enregistrement lié" #. module: queue_job #. odoo-python #: code:addons/queue_job/models/queue_job.py:0 msgid "Related Records" -msgstr "" +msgstr "Enregistrements liés" #. module: queue_job #: model_terms:ir.ui.view,arch_db:queue_job.view_queue_job_tree msgid "Remaining days to execute" -msgstr "" +msgstr "Jours restants avant l'exécution" #. module: queue_job #: model:ir.model.fields,field_description:queue_job.field_queue_job_channel__removal_interval msgid "Removal Interval" -msgstr "" +msgstr "Intervalle de suppression" #. module: queue_job #: model_terms:ir.ui.view,arch_db:queue_job.view_requeue_job msgid "Requeue" -msgstr "" +msgstr "Remise en file d'attente" #. module: queue_job #: model_terms:ir.ui.view,arch_db:queue_job.view_queue_job_form msgid "Requeue Job" -msgstr "" +msgstr "Remettre la tâche en file d'attente" #. module: queue_job #: model:ir.actions.act_window,name:queue_job.action_requeue_job #: model_terms:ir.ui.view,arch_db:queue_job.view_requeue_job msgid "Requeue Jobs" -msgstr "" +msgstr "Remettre les tâches en file d'attente" #. module: queue_job #: model:ir.model.fields,field_description:queue_job.field_queue_job__activity_user_id msgid "Responsible User" -msgstr "" +msgstr "Responsable" #. module: queue_job #: model:ir.model.fields,field_description:queue_job.field_queue_job__result #: model_terms:ir.ui.view,arch_db:queue_job.view_queue_job_form msgid "Result" -msgstr "" +msgstr "Résultat" #. module: queue_job #: model_terms:ir.ui.view,arch_db:queue_job.view_queue_job_form msgid "Results" -msgstr "" +msgstr "Résultats" #. module: queue_job #: model:ir.model.fields,field_description:queue_job.field_queue_job_function__edit_retry_pattern msgid "Retry Pattern" -msgstr "" +msgstr "Modèle des tentatives" #. module: queue_job #: model:ir.model.fields,field_description:queue_job.field_queue_job_function__retry_pattern msgid "Retry Pattern (serialized)" -msgstr "" +msgstr "Modèle des tentatives (sérialisé)" #. module: queue_job #: model:ir.model,name:queue_job.model_queue_jobs_to_done msgid "Set all selected jobs to done" -msgstr "" +msgstr "Définir toutes les tâches sélectionnées comme terminées" #. module: queue_job #: model_terms:ir.ui.view,arch_db:queue_job.view_set_jobs_done msgid "Set jobs done" -msgstr "" +msgstr "Définir les tâches comme terminées" #. module: queue_job #: model:ir.actions.act_window,name:queue_job.action_set_jobs_done msgid "Set jobs to done" -msgstr "" +msgstr "Définir les tâches comme terminées" #. module: queue_job #: model_terms:ir.ui.view,arch_db:queue_job.view_queue_job_form msgid "Set to 'Done'" -msgstr "" +msgstr "Mettre en \"Terminé\"" #. module: queue_job #: model_terms:ir.ui.view,arch_db:queue_job.view_set_jobs_done msgid "Set to done" -msgstr "" +msgstr "Définir comme terminé" #. module: queue_job #: model:ir.model.fields,help:queue_job.field_queue_job__graph_uuid msgid "Single shared identifier of a Graph. Empty for a single job." -msgstr "" +msgstr "Identifiant unique et partagé d'un graphe. Vide pour une tâche unique." #. module: queue_job #. odoo-python @@ -781,23 +799,25 @@ msgid "" "Something bad happened during the execution of the job. More details in the " "'Exception Information' section." msgstr "" +"Quelque chose s'est mal passé pendant l'exécution de la tâche. Plus de " +"détails dans la section \"Information sur l'exception\"." #. module: queue_job #: model:ir.model.fields,field_description:queue_job.field_queue_job__date_started msgid "Start Date" -msgstr "" +msgstr "Date de début" #. module: queue_job #: model:ir.model.fields.selection,name:queue_job.selection__queue_job__state__started #: model_terms:ir.ui.view,arch_db:queue_job.view_queue_job_search msgid "Started" -msgstr "" +msgstr "Commencé" #. module: queue_job #: model:ir.model.fields,field_description:queue_job.field_queue_job__state #: model_terms:ir.ui.view,arch_db:queue_job.view_queue_job_search msgid "State" -msgstr "" +msgstr "État" #. module: queue_job #: model:ir.model.fields,help:queue_job.field_queue_job__activity_state @@ -807,11 +827,15 @@ msgid "" "Today: Activity date is today\n" "Planned: Future activities." msgstr "" +"Statut basé sur les activités\n" +"En retard : la date d'échéance est déjà dépassée\n" +"Aujourd'hui : la date d'activité est aujourd'hui\n" +"Planifiée : activités futures." #. module: queue_job #: model:ir.model.fields,field_description:queue_job.field_queue_job__func_string msgid "Task" -msgstr "" +msgstr "Tâche" #. module: queue_job #: model:ir.model.fields,help:queue_job.field_queue_job_function__edit_related_action @@ -819,6 +843,11 @@ msgid "" "The action when the button *Related Action* is used on a job. The default action is to open the view of the record related to the job. Configured as a dictionary with optional keys: enable, func_name, kwargs.\n" "See the module description for details." msgstr "" +"L’action lorsque le bouton « Action rattachée » est utilisé dans une tâche. " +"L’action par défaut est d’ouvrir une vue de l’enregistrement rattaché à la " +"tâche. Configuré avec un dictionnaire avec les clés optionnelles : enable, " +"func_name, kwargs.\n" +"Voir la description du module pour plus de détails." #. module: queue_job #: model:ir.model.fields,help:queue_job.field_queue_job__max_retries @@ -826,46 +855,50 @@ msgid "" "The job will fail if the number of tries reach the max. retries.\n" "Retries are infinite when empty." msgstr "" +"La tâche échouera si le nombre d'essai atteint le max. de tentatives.\n" +"Quand vide, le nombre de tentatives est illimité." #. module: queue_job #: model_terms:ir.ui.view,arch_db:queue_job.view_set_jobs_cancelled msgid "The selected jobs will be cancelled." -msgstr "" +msgstr "Les tâches sélectionnées seront définies comme annulée." #. module: queue_job #: model_terms:ir.ui.view,arch_db:queue_job.view_requeue_job msgid "The selected jobs will be requeued." -msgstr "" +msgstr "Les tâches sélectionnées seront remises en file d'attente." #. module: queue_job #: model_terms:ir.ui.view,arch_db:queue_job.view_set_jobs_done msgid "The selected jobs will be set to done." -msgstr "" +msgstr "Les tâches sélectionnées seront définies comme terminées." #. module: queue_job #: model_terms:ir.ui.view,arch_db:queue_job.view_queue_job_form msgid "Time (s)" -msgstr "" +msgstr "Heure(s)" #. module: queue_job #: model:ir.model.fields,help:queue_job.field_queue_job__exec_time msgid "Time required to execute this job in seconds. Average when grouped." msgstr "" +"Temps requis pour exécuter cette tâche en seconde. Moyenne lors des " +"regroupements." #. module: queue_job #: model_terms:ir.ui.view,arch_db:queue_job.view_queue_job_search msgid "Tried many times" -msgstr "" +msgstr "Tentée plusieurs fois" #. module: queue_job #: model:ir.model.fields,help:queue_job.field_queue_job__activity_exception_decoration msgid "Type of the exception activity on record." -msgstr "" +msgstr "Type d'activité d'exception enregistrée." #. module: queue_job #: model:ir.model.fields,field_description:queue_job.field_queue_job__uuid msgid "UUID" -msgstr "" +msgstr "UUID" #. module: queue_job #. odoo-python @@ -875,6 +908,10 @@ msgid "" "Example of valid format:\n" "{{\"enable\": True, \"func_name\": \"related_action_foo\", \"kwargs\" {{\"limit\": 10}}}}" msgstr "" +"Format inattendu pour l’action rattachée de {}.\n" +"Exemple de format valide :\n" +"{{\"enable\" : True, \"func_name\" : \"related_action_foo\", \"kwargs\" {" +"{\"limit\" : 10}}}}" #. module: queue_job #. odoo-python @@ -885,24 +922,28 @@ msgid "" "{{1: 300, 5: 600, 10: 1200, 15: 3000}}\n" "{{1: (1, 10), 5: (11, 20), 10: (21, 30), 15: (100, 300)}}" msgstr "" +"Format inattendu du modèle de nouvelle tentative pour {}.\n" +"Exemples de formats valides :\n" +"{{1 : 300, 5 : 600, 10 : 1200, 15 : 3000}}\n" +"{{1 : (1, 10), 5 : (11, 20), 10 : (21, 30), 15 : (100, 300)}}" #. module: queue_job #: model:ir.model.fields,field_description:queue_job.field_queue_job__user_id msgid "User ID" -msgstr "" +msgstr "ID utilisateur" #. module: queue_job #: model:ir.model.fields.selection,name:queue_job.selection__queue_job__state__wait_dependencies #: model_terms:ir.ui.view,arch_db:queue_job.view_queue_job_search msgid "Wait Dependencies" -msgstr "" +msgstr "En attente des dépendances" #. module: queue_job #: model:ir.model,name:queue_job.model_queue_requeue_job msgid "Wizard to requeue a selection of jobs" -msgstr "" +msgstr "Assistant pour mettre en file d'attente une sélection de tâches" #. module: queue_job #: model:ir.model.fields,field_description:queue_job.field_queue_job__worker_pid msgid "Worker Pid" -msgstr "" +msgstr "Identifiant du processus de travail" From 4501f5c03da08849b0677363aa436b52a1705365 Mon Sep 17 00:00:00 2001 From: Yann Papouin Date: Thu, 11 Jun 2026 14:31:49 +0000 Subject: [PATCH 17/27] Translated using Weblate (French) Currently translated at 100.0% (156 of 156 strings) Translation: queue-18.0/queue-18.0-queue_job Translate-URL: https://translation.odoo-community.org/projects/queue-18-0/queue-18-0-queue_job/fr/ --- queue_job/i18n/fr.po | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/queue_job/i18n/fr.po b/queue_job/i18n/fr.po index a3bc81e504..ce1a944129 100644 --- a/queue_job/i18n/fr.po +++ b/queue_job/i18n/fr.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: Odoo Server 18.0\n" "Report-Msgid-Bugs-To: \n" -"PO-Revision-Date: 2026-06-11 14:31+0000\n" +"PO-Revision-Date: 2026-06-11 14:32+0000\n" "Last-Translator: Yann Papouin \n" "Language-Team: none\n" "Language: fr\n" @@ -77,7 +77,7 @@ msgstr "" #. module: queue_job #: model:ir.model.fields,field_description:queue_job.field_queue_job__args msgid "Args" -msgstr "Arguments" +msgstr "Args" #. module: queue_job #: model:ir.model.fields,field_description:queue_job.field_queue_job__message_attachment_count From 2cf8f210ac96746e23b3f8f00f21522c60388b7f Mon Sep 17 00:00:00 2001 From: Yann Papouin Date: Thu, 11 Jun 2026 14:32:50 +0000 Subject: [PATCH 18/27] Added translation using Weblate (French) --- queue_job_cron/i18n/fr.po | 48 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 queue_job_cron/i18n/fr.po diff --git a/queue_job_cron/i18n/fr.po b/queue_job_cron/i18n/fr.po new file mode 100644 index 0000000000..faf8f9068e --- /dev/null +++ b/queue_job_cron/i18n/fr.po @@ -0,0 +1,48 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * queue_job_cron +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 18.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: Automatically generated\n" +"Language-Team: none\n" +"Language: fr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n > 1;\n" + +#. module: queue_job_cron +#: model:ir.model.fields,help:queue_job_cron.field_ir_cron__no_parallel_queue_job_run +msgid "" +"Avoid parallel run. If the cron job is already running, the new one will be " +"skipped. By default, odoo never runs the same cron job in parallel. This " +"option is therefore set to True by default when job is run as a queue job." +msgstr "" + +#. module: queue_job_cron +#: model:ir.model.fields,field_description:queue_job_cron.field_ir_cron__channel_id +msgid "Channel" +msgstr "" + +#. module: queue_job_cron +#: model:ir.model.fields,field_description:queue_job_cron.field_ir_cron__no_parallel_queue_job_run +msgid "No Parallel Queue Job Run" +msgstr "" + +#. module: queue_job_cron +#: model:ir.model.fields,field_description:queue_job_cron.field_ir_cron__run_as_queue_job +msgid "Run As Queue Job" +msgstr "" + +#. module: queue_job_cron +#: model:ir.model,name:queue_job_cron.model_ir_cron +msgid "Scheduled Actions" +msgstr "" + +#. module: queue_job_cron +#: model:ir.model.fields,help:queue_job_cron.field_ir_cron__run_as_queue_job +msgid "Specify if this cron should be ran as a queue job" +msgstr "" From 5bf3bf0a4ae8f152b1efd6c710e4643c632f9a64 Mon Sep 17 00:00:00 2001 From: Yann Papouin Date: Thu, 11 Jun 2026 14:34:36 +0000 Subject: [PATCH 19/27] Translated using Weblate (French) Currently translated at 100.0% (6 of 6 strings) Translation: queue-18.0/queue-18.0-queue_job_cron Translate-URL: https://translation.odoo-community.org/projects/queue-18-0/queue-18-0-queue_job_cron/fr/ --- queue_job_cron/i18n/fr.po | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/queue_job_cron/i18n/fr.po b/queue_job_cron/i18n/fr.po index faf8f9068e..d8202cc2a8 100644 --- a/queue_job_cron/i18n/fr.po +++ b/queue_job_cron/i18n/fr.po @@ -6,13 +6,15 @@ msgid "" msgstr "" "Project-Id-Version: Odoo Server 18.0\n" "Report-Msgid-Bugs-To: \n" -"Last-Translator: Automatically generated\n" +"PO-Revision-Date: 2026-06-11 16:46+0000\n" +"Last-Translator: Yann Papouin \n" "Language-Team: none\n" "Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: \n" "Plural-Forms: nplurals=2; plural=n > 1;\n" +"X-Generator: Weblate 5.15.2\n" #. module: queue_job_cron #: model:ir.model.fields,help:queue_job_cron.field_ir_cron__no_parallel_queue_job_run @@ -21,28 +23,34 @@ msgid "" "skipped. By default, odoo never runs the same cron job in parallel. This " "option is therefore set to True by default when job is run as a queue job." msgstr "" +"Évitez l'exécution en parallèle. Si la tâche cron est déjà en cours " +"d'exécution, la nouvelle sera ignorée. Par défaut, Odoo n'exécute jamais la " +"même tâche cron en parallèle. Cette option est donc définie sur « True » par " +"défaut lorsque la tâche est exécutée en tant que tâche de file d'attente." #. module: queue_job_cron #: model:ir.model.fields,field_description:queue_job_cron.field_ir_cron__channel_id msgid "Channel" -msgstr "" +msgstr "Canal" #. module: queue_job_cron #: model:ir.model.fields,field_description:queue_job_cron.field_ir_cron__no_parallel_queue_job_run msgid "No Parallel Queue Job Run" -msgstr "" +msgstr "Aucune exécution de tâche en file d'attente parallèle" #. module: queue_job_cron #: model:ir.model.fields,field_description:queue_job_cron.field_ir_cron__run_as_queue_job msgid "Run As Queue Job" -msgstr "" +msgstr "Exécuté en tant que tâche sur file d'attente" #. module: queue_job_cron #: model:ir.model,name:queue_job_cron.model_ir_cron msgid "Scheduled Actions" -msgstr "" +msgstr "Actions planifiées" #. module: queue_job_cron #: model:ir.model.fields,help:queue_job_cron.field_ir_cron__run_as_queue_job msgid "Specify if this cron should be ran as a queue job" msgstr "" +"Spécifie si cette tâche cron doit être exécutée en tant que tâche en file " +"d'attente" From 1768b9f153476bc5b2002cde18329299b5ba39c0 Mon Sep 17 00:00:00 2001 From: Matjaz Mozetic Date: Tue, 16 Jun 2026 18:34:47 +0000 Subject: [PATCH 20/27] Translated using Weblate (Slovenian) Currently translated at 100.0% (5 of 5 strings) Translation: queue-18.0/queue-18.0-queue_job_subscribe Translate-URL: https://translation.odoo-community.org/projects/queue-18-0/queue-18-0-queue_job_subscribe/sl/ --- queue_job_subscribe/i18n/sl.po | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/queue_job_subscribe/i18n/sl.po b/queue_job_subscribe/i18n/sl.po index 65fe1eaf3a..aa6e2902ba 100644 --- a/queue_job_subscribe/i18n/sl.po +++ b/queue_job_subscribe/i18n/sl.po @@ -10,15 +10,16 @@ msgstr "" "Project-Id-Version: Odoo Server 9.0c\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-04-05 00:42+0000\n" -"PO-Revision-Date: 2017-04-05 00:42+0000\n" -"Last-Translator: Matjaž Mozetič , 2017\n" +"PO-Revision-Date: 2026-06-16 20:46+0000\n" +"Last-Translator: Matjaz Mozetic \n" "Language-Team: Slovenian (https://www.transifex.com/oca/teams/23907/sl/)\n" "Language: sl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: \n" -"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || " -"n%100==4 ? 2 : 3);\n" +"Plural-Forms: nplurals=4; plural=n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || " +"n%100==4 ? 2 : 3;\n" +"X-Generator: Weblate 5.15.2\n" #. module: queue_job_subscribe #: model_terms:ir.ui.view,arch_db:queue_job_subscribe.view_user_connector_form @@ -36,19 +37,18 @@ msgstr "" #. module: queue_job_subscribe #: model:ir.model.fields,field_description:queue_job_subscribe.field_res_users__subscribe_job -#, fuzzy msgid "Job Notifications" -msgstr "Obvestila o delu" +msgstr "Obvestila o nalogah" #. module: queue_job_subscribe #: model:ir.model,name:queue_job_subscribe.model_queue_job msgid "Queue Job" -msgstr "Delo čakalne vrste" +msgstr "Naloga v čakalni vrsti" #. module: queue_job_subscribe #: model:ir.model,name:queue_job_subscribe.model_res_users msgid "User" -msgstr "" +msgstr "Uporabnik" #~ msgid "Users" #~ msgstr "Uporabniki" From 6c0a91adb23c5b5bf9f2fe8920c386760ebde1d3 Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Fri, 26 Jun 2026 13:45:21 +0000 Subject: [PATCH 21/27] [BOT] post-merge updates --- README.md | 2 +- queue_job/README.rst | 2 +- queue_job/__manifest__.py | 2 +- queue_job/static/description/index.html | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 2e5f65cf2a..b9ac30d19e 100644 --- a/README.md +++ b/README.md @@ -22,7 +22,7 @@ Available addons addon | version | maintainers | summary --- | --- | --- | --- [base_import_async](base_import_async/) | 18.0.1.0.0 | | Import CSV files in the background -[queue_job](queue_job/) | 18.0.3.1.1 | guewen sbidoul | Job Queue +[queue_job](queue_job/) | 18.0.3.1.2 | guewen sbidoul | Job Queue [queue_job_batch](queue_job_batch/) | 18.0.1.0.0 | | Job Queue Batch [queue_job_cron](queue_job_cron/) | 18.0.1.1.1 | | Scheduled Actions as Queue Jobs [queue_job_cron_jobrunner](queue_job_cron_jobrunner/) | 18.0.1.0.1 | ivantodorovich | Run jobs without a dedicated JobRunner diff --git a/queue_job/README.rst b/queue_job/README.rst index cfe02b7d37..b5fffba28b 100644 --- a/queue_job/README.rst +++ b/queue_job/README.rst @@ -11,7 +11,7 @@ Job Queue !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !! source digest: sha256:a5cdcff42c2f45fbb57753e7693373b08e3497d0bc07212dac0f3ab56217eaf2 + !! source digest: sha256:1a7d130b59eb39161ed944ca426f01cebd6aac4bc2e206685815958bbe18394d !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Mature-brightgreen.png diff --git a/queue_job/__manifest__.py b/queue_job/__manifest__.py index 9463b8cc07..5698cfb1dc 100644 --- a/queue_job/__manifest__.py +++ b/queue_job/__manifest__.py @@ -2,7 +2,7 @@ { "name": "Job Queue", - "version": "18.0.3.1.1", + "version": "18.0.3.1.2", "author": "Camptocamp,ACSONE SA/NV,Odoo Community Association (OCA)", "website": "https://github.com/OCA/queue", "license": "LGPL-3", diff --git a/queue_job/static/description/index.html b/queue_job/static/description/index.html index 30983ba0c7..ff714d0b32 100644 --- a/queue_job/static/description/index.html +++ b/queue_job/static/description/index.html @@ -372,7 +372,7 @@

Job Queue

!! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!! source digest: sha256:a5cdcff42c2f45fbb57753e7693373b08e3497d0bc07212dac0f3ab56217eaf2 +!! source digest: sha256:1a7d130b59eb39161ed944ca426f01cebd6aac4bc2e206685815958bbe18394d !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->

Mature License: LGPL-3 OCA/queue Translate me on Weblate Try me on Runboat

This addon adds an integrated Job Queue to Odoo.

From 579297eae8fd3f1b6c87d038ffd4a856fff3dd19 Mon Sep 17 00:00:00 2001 From: Guewen Baconnier Date: Fri, 22 May 2026 10:52:00 +0200 Subject: [PATCH 22/27] [FIX] queue_job: fix verbose warning in tests with patched methods Methods patched with _patch_method leads to a lot of warnings during tests that look like: 2026-05-22 08:44:57,099 1 INFO testdb odoo.tests.common: /odoo/external-src/queue/queue_job/models/base.py:270:_patch_method setting edi.exchange.record.action_exchange_generate to Stack (most recent call last): File "/usr/local/bin/odoo", line 8, in odoo.cli.main() File "/odoo/src/odoo/cli/command.py", line 66, in main o.run(args) File "/odoo/src/odoo/cli/server.py", line 182, in run main(args) File "/odoo/src/odoo/cli/server.py", line 175, in main rc = odoo.service.server.start(preload=preload, stop=stop) File "/odoo/src/odoo/service/server.py", line 1457, in start rc = server.run(preload, stop) File "/odoo/src/odoo/service/server.py", line 622, in run rc = preload_registries(preload) File "/odoo/src/odoo/service/server.py", line 1388, in preload_registries result = loader.run_suite(post_install_suite, global_report=registry._assertion_report) File "/odoo/src/odoo/tests/loader.py", line 118, in run_suite suite(results) File "/usr/local/lib/python3.12/unittest/suite.py", line 84, in __call__ return self.run(*args, **kwds) File "/odoo/src/odoo/tests/suite.py", line 49, in run self._tearDownPreviousClass(None, result) File "/odoo/src/odoo/tests/suite.py", line 190, in _tearDownPreviousClass super()._tearDownPreviousClass(test, result) File "/odoo/src/odoo/tests/suite.py", line 112, in _tearDownPreviousClass previousClass.doClassCleanups() File "/odoo/src/odoo/tests/case.py", line 247, in doClassCleanups function(*args, **kwargs) File "/odoo/src/odoo/tests/common.py", line 989, in reset_changes cls.registry.setup_models(cr) File "/usr/local/lib/python3.12/site-packages/decorator.py", line 232, in fun return caller(func, *(extras + args), **kw) File "/odoo/src/odoo/tools/func.py", line 97, in locked return func(inst, *args, **kwargs) File "/odoo/src/odoo/modules/registry.py", line 375, in setup_models model._register_hook() File "/odoo/external-src/edi-framework/edi_queue_oca/models/edi_exchange_record.py", line 26, in _register_hook self._patch_method(function, self._patch_job_auto_delay(function)) File "/odoo/external-src/queue/queue_job/models/base.py", line 270, in _patch_method setattr(cls, name, wrapped) File "/odoo/src/odoo/tests/common.py", line 971, in metamodel_setattr _logger.runbot( File "/odoo/src/odoo/netsvc.py", line 360, in runbot self.log(logging.RUNBOT, message, *args, **kws) --- queue_job/tests/common.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/queue_job/tests/common.py b/queue_job/tests/common.py index 53dbef0453..8773d51cc6 100644 --- a/queue_job/tests/common.py +++ b/queue_job/tests/common.py @@ -6,11 +6,19 @@ from operator import attrgetter from unittest import TestCase, mock +from odoo.tests.common import SETATTR_SOURCES + from odoo.addons.queue_job.delay import Graph # pylint: disable=odoo-addons-relative-import from odoo.addons.queue_job.job import Job +# Register queue_job patcher as a known path to prevent verbose warning +# in tests when methods are patched. +SETATTR_SOURCES["_patch_method"] = tuple( + list(SETATTR_SOURCES.get("_patch_method", [])) + ["/queue_job/models/base.py"], +) + @contextmanager def trap_jobs(): @@ -206,7 +214,7 @@ def assert_enqueued_job(self, method, args=None, kwargs=None, properties=None): if expected_call not in actual_calls: raise AssertionError( - "Job {} was not enqueued.\n" "Actual enqueued jobs:\n{}".format( + "Job {} was not enqueued.\nActual enqueued jobs:\n{}".format( self._format_job_call(expected_call), "\n".join( f" * {self._format_job_call(call)}" for call in actual_calls From ce5672789bf1e41b5557d7dea052649263843646 Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Tue, 30 Jun 2026 08:40:41 +0000 Subject: [PATCH 23/27] [BOT] post-merge updates --- README.md | 2 +- queue_job/README.rst | 2 +- queue_job/__manifest__.py | 2 +- queue_job/static/description/index.html | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index b9ac30d19e..979d94d524 100644 --- a/README.md +++ b/README.md @@ -22,7 +22,7 @@ Available addons addon | version | maintainers | summary --- | --- | --- | --- [base_import_async](base_import_async/) | 18.0.1.0.0 | | Import CSV files in the background -[queue_job](queue_job/) | 18.0.3.1.2 | guewen sbidoul | Job Queue +[queue_job](queue_job/) | 18.0.3.1.3 | guewen sbidoul | Job Queue [queue_job_batch](queue_job_batch/) | 18.0.1.0.0 | | Job Queue Batch [queue_job_cron](queue_job_cron/) | 18.0.1.1.1 | | Scheduled Actions as Queue Jobs [queue_job_cron_jobrunner](queue_job_cron_jobrunner/) | 18.0.1.0.1 | ivantodorovich | Run jobs without a dedicated JobRunner diff --git a/queue_job/README.rst b/queue_job/README.rst index b5fffba28b..b27a1675ad 100644 --- a/queue_job/README.rst +++ b/queue_job/README.rst @@ -11,7 +11,7 @@ Job Queue !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !! source digest: sha256:1a7d130b59eb39161ed944ca426f01cebd6aac4bc2e206685815958bbe18394d + !! source digest: sha256:85d54819989d21ee1d0349ecbcc7eeafe118baa9521524b1ce50fc3fdb890050 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Mature-brightgreen.png diff --git a/queue_job/__manifest__.py b/queue_job/__manifest__.py index 5698cfb1dc..fea6a34476 100644 --- a/queue_job/__manifest__.py +++ b/queue_job/__manifest__.py @@ -2,7 +2,7 @@ { "name": "Job Queue", - "version": "18.0.3.1.2", + "version": "18.0.3.1.3", "author": "Camptocamp,ACSONE SA/NV,Odoo Community Association (OCA)", "website": "https://github.com/OCA/queue", "license": "LGPL-3", diff --git a/queue_job/static/description/index.html b/queue_job/static/description/index.html index ff714d0b32..c5920c7ac7 100644 --- a/queue_job/static/description/index.html +++ b/queue_job/static/description/index.html @@ -372,7 +372,7 @@

Job Queue

!! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!! source digest: sha256:1a7d130b59eb39161ed944ca426f01cebd6aac4bc2e206685815958bbe18394d +!! source digest: sha256:85d54819989d21ee1d0349ecbcc7eeafe118baa9521524b1ce50fc3fdb890050 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->

Mature License: LGPL-3 OCA/queue Translate me on Weblate Try me on Runboat

This addon adds an integrated Job Queue to Odoo.

From d198792c484ee34305f70e2f005a69fb9d763bc5 Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Thu, 2 Jul 2026 07:02:04 +0000 Subject: [PATCH 24/27] [BOT] post-merge updates --- README.md | 2 +- queue_job_batch/README.rst | 8 +++- queue_job_batch/__manifest__.py | 2 +- queue_job_batch/static/description/index.html | 40 +++++++++++-------- 4 files changed, 31 insertions(+), 21 deletions(-) diff --git a/README.md b/README.md index 979d94d524..48ce68f2d8 100644 --- a/README.md +++ b/README.md @@ -23,7 +23,7 @@ addon | version | maintainers | summary --- | --- | --- | --- [base_import_async](base_import_async/) | 18.0.1.0.0 | | Import CSV files in the background [queue_job](queue_job/) | 18.0.3.1.3 | guewen sbidoul | Job Queue -[queue_job_batch](queue_job_batch/) | 18.0.1.0.0 | | Job Queue Batch +[queue_job_batch](queue_job_batch/) | 18.0.1.1.0 | | Job Queue Batch [queue_job_cron](queue_job_cron/) | 18.0.1.1.1 | | Scheduled Actions as Queue Jobs [queue_job_cron_jobrunner](queue_job_cron_jobrunner/) | 18.0.1.0.1 | ivantodorovich | Run jobs without a dedicated JobRunner [queue_job_profiler](queue_job_profiler/) | 18.0.1.0.1 | simahawk | Job Queue Profiler diff --git a/queue_job_batch/README.rst b/queue_job_batch/README.rst index d0b9d22c38..a232be0b3c 100644 --- a/queue_job_batch/README.rst +++ b/queue_job_batch/README.rst @@ -1,3 +1,7 @@ +.. image:: https://odoo-community.org/readme-banner-image + :target: https://odoo-community.org/get-involved?utm_source=readme + :alt: Odoo Community Association + =============== Job Queue Batch =============== @@ -7,13 +11,13 @@ Job Queue Batch !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !! source digest: sha256:b6e605728ea05be0bf98dbe6e94c197bab21882e965286ef214f719e252b444e + !! source digest: sha256:81d1edb81bb2c114b7afe11730c4f36f6eedcf5fe32a6b258600fd24d69a4be9 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png :target: https://odoo-community.org/page/development-status :alt: Beta -.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png +.. |badge2| image:: https://img.shields.io/badge/license-AGPL--3-blue.png :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html :alt: License: AGPL-3 .. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fqueue-lightgray.png?logo=github diff --git a/queue_job_batch/__manifest__.py b/queue_job_batch/__manifest__.py index 669ba10927..fc1245e076 100644 --- a/queue_job_batch/__manifest__.py +++ b/queue_job_batch/__manifest__.py @@ -4,7 +4,7 @@ { "name": "Job Queue Batch", - "version": "18.0.1.0.0", + "version": "18.0.1.1.0", "author": "Creu Blanca,Odoo Community Association (OCA)", "website": "https://github.com/OCA/queue", "license": "AGPL-3", diff --git a/queue_job_batch/static/description/index.html b/queue_job_batch/static/description/index.html index 455c0ecf78..75a507f02e 100644 --- a/queue_job_batch/static/description/index.html +++ b/queue_job_batch/static/description/index.html @@ -3,7 +3,7 @@ -Job Queue Batch +README.rst -
-

Job Queue Batch

+
+ + +Odoo Community Association + +
+

Job Queue Batch

-

Beta License: AGPL-3 OCA/queue Translate me on Weblate Try me on Runboat

+

Beta License: AGPL-3 OCA/queue Translate me on Weblate Try me on Runboat

This addon adds an a grouper for queue jobs.

It allows to show your jobs in a batched form in order to know better the results.

Example:

-from odoo import models, fields, api
+from odoo import models, fields, api
 
 
-class MyModel(models.Model):
+class MyModel(models.Model):
     _name = 'my.model'
 
-    def my_method(self, a, k=None):
+    def my_method(self, a, k=None):
         _logger.info('executed with a: %s and k: %s', a, k)
 
 
-class MyOtherModel(models.Model):
+class MyOtherModel(models.Model):
     _name = 'my.other.model'
 
     @api.multi
-    def button_do_stuff(self):
+    def button_do_stuff(self):
         batch = self.env['queue.job.batch'].get_new_batch('Group')
         model = self.env['my.model'].with_context(job_batch=batch)
         for i in range(1, 100):
@@ -415,13 +420,13 @@ 

Job Queue Batch

-

Usage

+

Usage

You can manage your batch jobs from the Systray. A new button will be shown with your currently executing job batches and the recently finished job groups.

-

Bug Tracker

+

Bug Tracker

Bugs are tracked on GitHub Issues. In case of trouble, please check there if your issue has already been reported. If you spotted it first, help us to smash it by providing a detailed and welcomed @@ -429,15 +434,15 @@

Bug Tracker

Do not contact contributors directly about support or help with technical issues.

-

Credits

+

Credits

-

Authors

+

Authors

  • Creu Blanca
-

Contributors

+

Contributors

-

Other credits

+

Other credits

The migration of this module from 12.0 to 14.0 was financially supported by Camptocamp

-

Maintainers

+

Maintainers

This module is maintained by the OCA.

Odoo Community Association @@ -475,5 +480,6 @@

Maintainers

+
From 85c951832cbdc6deb095f86ee8a973e97f7eb71c Mon Sep 17 00:00:00 2001 From: Adam Heinz Date: Tue, 14 Jul 2026 10:30:43 -0400 Subject: [PATCH 25/27] [IMP] queue_job: Set doctest.REPORT_ONLY_FIRST_FAILURE option. --- queue_job/tests/test_runner_channels.py | 4 +++- queue_job/tests/test_runner_runner.py | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/queue_job/tests/test_runner_channels.py b/queue_job/tests/test_runner_channels.py index e7124abce8..b00dd26261 100644 --- a/queue_job/tests/test_runner_channels.py +++ b/queue_job/tests/test_runner_channels.py @@ -12,4 +12,6 @@ @tagged("doctest") class TestDoctest(BaseCase): def test_doctest(self): - doctest.testmod(channels, exclude_empty=True, raise_on_error=True) + doctest.testmod( + channels, exclude_empty=True, optionflags=doctest.REPORT_ONLY_FIRST_FAILURE + ) diff --git a/queue_job/tests/test_runner_runner.py b/queue_job/tests/test_runner_runner.py index 6ff543c983..1adfa790dd 100644 --- a/queue_job/tests/test_runner_runner.py +++ b/queue_job/tests/test_runner_runner.py @@ -13,7 +13,9 @@ @tagged("doctest") class TestDoctest(BaseCase): def test_doctest(self): - doctest.testmod(runner, exclude_empty=True, raise_on_error=True) + doctest.testmod( + runner, exclude_empty=True, optionflags=doctest.REPORT_ONLY_FIRST_FAILURE + ) @tagged("-at_install", "post_install") From 5b11f1d55bfbaa8c5094d2d72a2f24c88fe0bffe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Bidoul?= Date: Sun, 19 Jul 2026 14:01:58 +0200 Subject: [PATCH 26/27] Update dotfiles --- .copier-answers.yml | 4 +- .gitattributes | 1 + .github/workflows/pre-commit.yml | 9 +++- .github/workflows/test.yml | 13 +++++- .pre-commit-config.yaml | 12 ++++-- .pylintrc | 73 +++++++++++++++++--------------- .pylintrc-mandatory | 54 ++++++++++++----------- README.md | 5 ++- checklog-odoo.cfg | 2 + eslint.config.cjs | 5 ++- renovate.json | 6 +++ 11 files changed, 115 insertions(+), 69 deletions(-) create mode 100644 .gitattributes create mode 100644 renovate.json diff --git a/.copier-answers.yml b/.copier-answers.yml index d4b6ba0151..99080f40d4 100644 --- a/.copier-answers.yml +++ b/.copier-answers.yml @@ -1,8 +1,7 @@ # Do NOT update manually; changes here will be overwritten by Copier -_commit: v1.29 +_commit: v1.44 _src_path: git+https://github.com/OCA/oca-addons-repo-template additional_ruff_rules: [] -ci: GitHub convert_readme_fragments_to_markdown: true enable_checklog_odoo: true generate_requirements_txt: true @@ -17,6 +16,7 @@ odoo_test_flavor: Both odoo_version: 18.0 org_name: Odoo Community Association (OCA) org_slug: OCA +postgres_image: '' rebel_module_groups: [] repo_description: queue repo_name: queue diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000000..e0d56685a9 --- /dev/null +++ b/.gitattributes @@ -0,0 +1 @@ +test-requirements.txt merge=union diff --git a/.github/workflows/pre-commit.yml b/.github/workflows/pre-commit.yml index 5eb021ef15..408069d32d 100644 --- a/.github/workflows/pre-commit.yml +++ b/.github/workflows/pre-commit.yml @@ -1,3 +1,4 @@ + name: pre-commit on: @@ -9,6 +10,10 @@ on: - "18.0" - "18.0-ocabot-*" +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + jobs: pre-commit: runs-on: ubuntu-22.04 @@ -16,7 +21,9 @@ jobs: - uses: actions/checkout@v4 - uses: actions/setup-python@v5 with: - python-version: "3.11" + python-version: "3.12" + cache: 'pip' + cache-dependency-path: '.pre-commit-config.yaml' - name: Get python version run: echo "PY=$(python -VV | sha256sum | cut -d' ' -f1)" >> $GITHUB_ENV - uses: actions/cache@v4 diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index a06488079f..cd982c1e44 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -9,6 +9,10 @@ on: - "18.0" - "18.0-ocabot-*" +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + jobs: unreleased-deps: runs-on: ubuntu-latest @@ -42,7 +46,7 @@ jobs: makepot: "true" services: postgres: - image: postgres:12.0 + image: postgres:12 env: POSTGRES_USER: odoo POSTGRES_PASSWORD: odoo @@ -65,6 +69,13 @@ jobs: run: oca_init_test_database - name: Run tests run: oca_run_tests + - name: Upload screenshots from JS tests + uses: actions/upload-artifact@v4 + if: ${{ failure() }} + with: + name: Screenshots of failed JS tests - ${{ matrix.name }}${{ join(matrix.include) }} + path: /tmp/odoo_tests/${{ env.PGDATABASE }} + if-no-files-found: ignore - uses: codecov/codecov-action@v4 with: token: ${{ secrets.CODECOV_TOKEN }} diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index c74099edcf..29c15eaf6a 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -21,7 +21,7 @@ exclude: | # You don't usually want a bot to modify your legal texts (LICENSE.*|COPYING.*) default_language_version: - python: python3 + python: python3.12 node: "22.9.0" repos: - repo: local @@ -38,12 +38,17 @@ repos: entry: found a en.po file language: fail files: '[a-zA-Z0-9_]*/i18n/en\.po$' + - id: obsolete dotfiles + name: obsolete dotfiles + entry: found obsolete files; remove them + files: '^(\.travis\.yml|\.t2d\.yml|CONTRIBUTING\.md|\.prettierrc\.yml|\.eslintrc\.yml)$' + language: fail - repo: https://github.com/sbidoul/whool - rev: v1.2 + rev: v1.3 hooks: - id: whool-init - repo: https://github.com/oca/maintainer-tools - rev: bf9ecb9938b6a5deca0ff3d870fbd3f33341fded + rev: 31bdbd8e4cb94be6534f0e82b1cafb84a455f671 hooks: # update the NOT INSTALLABLE ADDONS section above - id: oca-update-pre-commit-excluded-addons @@ -95,6 +100,7 @@ repos: additional_dependencies: - "eslint@9.12.0" - "eslint-plugin-jsdoc@50.3.1" + - "globals@16.0.0" - repo: https://github.com/pre-commit/pre-commit-hooks rev: v4.6.0 hooks: diff --git a/.pylintrc b/.pylintrc index 7c62b6d2ed..914fd235d9 100644 --- a/.pylintrc +++ b/.pylintrc @@ -4,6 +4,9 @@ load-plugins=pylint_odoo score=n +[IMPORTS] +deprecated-modules=pdb,pudb,ipdb,bs4 + [ODOOLINT] readme-template-url="https://github.com/OCA/maintainer-tools/blob/master/template/module/README.rst" manifest-required-authors=Odoo Community Association (OCA) @@ -25,19 +28,26 @@ disable=all enable=anomalous-backslash-in-string, api-one-deprecated, api-one-multi-together, - assignment-from-none, - attribute-deprecated, class-camelcase, - dangerous-default-value, dangerous-view-replace-wo-priority, - development-status-allowed, duplicate-id-csv, - duplicate-key, duplicate-xml-fields, duplicate-xml-record-id, eval-referenced, - eval-used, incoherent-interpreter-exec-perm, + openerp-exception-warning, + redundant-modulename-xml, + relative-import, + rst-syntax-error, + wrong-tabs-instead-of-spaces, + xml-syntax-error, + assignment-from-none, + attribute-deprecated, + dangerous-default-value, + deprecated-module, + development-status-allowed, + duplicate-key, + eval-used, license-allowed, manifest-author-string, manifest-deprecated-key, @@ -48,73 +58,68 @@ enable=anomalous-backslash-in-string, method-inverse, method-required-super, method-search, - openerp-exception-warning, pointless-statement, pointless-string-statement, print-used, redundant-keyword-arg, - redundant-modulename-xml, reimported, - relative-import, return-in-init, - rst-syntax-error, sql-injection, too-few-format-args, translation-field, translation-required, unreachable, use-vim-comment, - wrong-tabs-instead-of-spaces, - xml-syntax-error, - attribute-string-redundant, character-not-valid-in-resource-link, - consider-merging-classes-inherited, - context-overridden, create-user-wo-reset-password, dangerous-filter-wo-user, dangerous-qweb-replace-wo-priority, deprecated-data-xml-node, deprecated-openerp-xml-node, duplicate-po-message-definition, - except-pass, file-not-used, + missing-newline-extrafiles, + old-api7-method-defined, + po-msgstr-variables, + po-syntax-error, + str-format-used, + unnecessary-utf8-coding-comment, + xml-attribute-translatable, + xml-deprecated-qweb-directive, + xml-deprecated-tree-attribute, + attribute-string-redundant, + consider-merging-classes-inherited, + context-overridden, + except-pass, invalid-commit, manifest-maintainers-list, - missing-newline-extrafiles, missing-readme, missing-return, odoo-addons-relative-import, - old-api7-method-defined, - po-msgstr-variables, - po-syntax-error, renamed-field-parameter, resource-not-exist, - str-format-used, test-folder-imported, translation-contains-variable, translation-positional-used, - unnecessary-utf8-coding-comment, website-manifest-key-not-valid-uri, - xml-attribute-translatable, - xml-deprecated-qweb-directive, - xml-deprecated-tree-attribute, external-request-timeout, - # messages that do not cause the lint step to fail - consider-merging-classes-inherited, + missing-manifest-dependency, + too-complex, create-user-wo-reset-password, dangerous-filter-wo-user, - deprecated-module, file-not-used, - invalid-commit, - missing-manifest-dependency, missing-newline-extrafiles, - missing-readme, no-utf8-coding-comment, - odoo-addons-relative-import, old-api7-method-defined, + unnecessary-utf8-coding-comment, + # messages that do not cause the lint step to fail + consider-merging-classes-inherited, + deprecated-module, + invalid-commit, + missing-readme, + odoo-addons-relative-import, redefined-builtin, - too-complex, - unnecessary-utf8-coding-comment + manifest-external-assets [REPORTS] diff --git a/.pylintrc-mandatory b/.pylintrc-mandatory index 018fd61cdd..e4fd970b0d 100644 --- a/.pylintrc-mandatory +++ b/.pylintrc-mandatory @@ -3,6 +3,9 @@ load-plugins=pylint_odoo score=n +[IMPORTS] +deprecated-modules=pdb,pudb,ipdb,bs4 + [ODOOLINT] readme-template-url="https://github.com/OCA/maintainer-tools/blob/master/template/module/README.rst" manifest-required-authors=Odoo Community Association (OCA) @@ -17,19 +20,26 @@ disable=all enable=anomalous-backslash-in-string, api-one-deprecated, api-one-multi-together, - assignment-from-none, - attribute-deprecated, class-camelcase, - dangerous-default-value, dangerous-view-replace-wo-priority, - development-status-allowed, duplicate-id-csv, - duplicate-key, duplicate-xml-fields, duplicate-xml-record-id, eval-referenced, - eval-used, incoherent-interpreter-exec-perm, + openerp-exception-warning, + redundant-modulename-xml, + relative-import, + rst-syntax-error, + wrong-tabs-instead-of-spaces, + xml-syntax-error, + assignment-from-none, + attribute-deprecated, + dangerous-default-value, + deprecated-module, + development-status-allowed, + duplicate-key, + eval-used, license-allowed, manifest-author-string, manifest-deprecated-key, @@ -40,56 +50,50 @@ enable=anomalous-backslash-in-string, method-inverse, method-required-super, method-search, - openerp-exception-warning, pointless-statement, pointless-string-statement, print-used, redundant-keyword-arg, - redundant-modulename-xml, reimported, - relative-import, return-in-init, - rst-syntax-error, sql-injection, too-few-format-args, translation-field, translation-required, unreachable, use-vim-comment, - wrong-tabs-instead-of-spaces, - xml-syntax-error, - attribute-string-redundant, character-not-valid-in-resource-link, - consider-merging-classes-inherited, - context-overridden, create-user-wo-reset-password, dangerous-filter-wo-user, dangerous-qweb-replace-wo-priority, deprecated-data-xml-node, deprecated-openerp-xml-node, duplicate-po-message-definition, - except-pass, file-not-used, + missing-newline-extrafiles, + old-api7-method-defined, + po-msgstr-variables, + po-syntax-error, + str-format-used, + unnecessary-utf8-coding-comment, + xml-attribute-translatable, + xml-deprecated-qweb-directive, + xml-deprecated-tree-attribute, + attribute-string-redundant, + consider-merging-classes-inherited, + context-overridden, + except-pass, invalid-commit, manifest-maintainers-list, - missing-newline-extrafiles, missing-readme, missing-return, odoo-addons-relative-import, - old-api7-method-defined, - po-msgstr-variables, - po-syntax-error, renamed-field-parameter, resource-not-exist, - str-format-used, test-folder-imported, translation-contains-variable, translation-positional-used, - unnecessary-utf8-coding-comment, website-manifest-key-not-valid-uri, - xml-attribute-translatable, - xml-deprecated-qweb-directive, - xml-deprecated-tree-attribute, external-request-timeout [REPORTS] diff --git a/README.md b/README.md index 48ce68f2d8..883336fd69 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,7 @@ +[![Support the OCA](https://odoo-community.org/readme-banner-image)](https://odoo-community.org/get-involved?utm_source=repo-readme) + +# queue [![Runboat](https://img.shields.io/badge/runboat-Try%20me-875A7B.png)](https://runboat.odoo-community.org/builds?repo=OCA/queue&target_branch=18.0) [![Pre-commit Status](https://github.com/OCA/queue/actions/workflows/pre-commit.yml/badge.svg?branch=18.0)](https://github.com/OCA/queue/actions/workflows/pre-commit.yml?query=branch%3A18.0) [![Build Status](https://github.com/OCA/queue/actions/workflows/test.yml/badge.svg?branch=18.0)](https://github.com/OCA/queue/actions/workflows/test.yml?query=branch%3A18.0) @@ -7,8 +10,6 @@ -# queue - queue diff --git a/checklog-odoo.cfg b/checklog-odoo.cfg index 0b55b7bf66..58d43aa666 100644 --- a/checklog-odoo.cfg +++ b/checklog-odoo.cfg @@ -1,3 +1,5 @@ [checklog-odoo] ignore= WARNING.* 0 failed, 0 error\(s\).* + WARNING .* Killing chrome descendants-or-self .* + WARNING.* Missing widget: res_partner_many2one for field of type many2one.* diff --git a/eslint.config.cjs b/eslint.config.cjs index 0d5731f89a..dd0cbe0aef 100644 --- a/eslint.config.cjs +++ b/eslint.config.cjs @@ -1,3 +1,4 @@ +var globals = require('globals'); jsdoc = require("eslint-plugin-jsdoc"); const config = [{ @@ -16,6 +17,8 @@ const config = [{ openerp: "readonly", owl: "readonly", luxon: "readonly", + QUnit: "readonly", + ...globals.browser, }, ecmaVersion: 2024, @@ -191,7 +194,7 @@ const config = [{ }, }, { - files: ["**/*.esm.js"], + files: ["**/*.esm.js", "**/*test.js"], languageOptions: { ecmaVersion: 2024, diff --git a/renovate.json b/renovate.json new file mode 100644 index 0000000000..bd6c2a4f6f --- /dev/null +++ b/renovate.json @@ -0,0 +1,6 @@ +{ + "$schema": "https://docs.renovatebot.com/renovate-schema.json", + "extends": ["config:recommended", ":disableDependencyDashboard"], + "baseBranchPatterns": ["19.0", "18.0", "17.0", "16.0", "15.0"], + "enabledManagers": ["copier"] +} From 697f0db82876ea9d847ab51d6ec4731f8969a83d Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Mon, 20 Jul 2026 15:30:34 +0000 Subject: [PATCH 27/27] [BOT] post-merge updates --- README.md | 2 +- queue_job_batch/README.rst | 2 +- queue_job_batch/__manifest__.py | 2 +- queue_job_batch/static/description/index.html | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 883336fd69..3d44e9cde8 100644 --- a/README.md +++ b/README.md @@ -24,7 +24,7 @@ addon | version | maintainers | summary --- | --- | --- | --- [base_import_async](base_import_async/) | 18.0.1.0.0 | | Import CSV files in the background [queue_job](queue_job/) | 18.0.3.1.3 | guewen sbidoul | Job Queue -[queue_job_batch](queue_job_batch/) | 18.0.1.1.0 | | Job Queue Batch +[queue_job_batch](queue_job_batch/) | 18.0.1.1.1 | | Job Queue Batch [queue_job_cron](queue_job_cron/) | 18.0.1.1.1 | | Scheduled Actions as Queue Jobs [queue_job_cron_jobrunner](queue_job_cron_jobrunner/) | 18.0.1.0.1 | ivantodorovich | Run jobs without a dedicated JobRunner [queue_job_profiler](queue_job_profiler/) | 18.0.1.0.1 | simahawk | Job Queue Profiler diff --git a/queue_job_batch/README.rst b/queue_job_batch/README.rst index a232be0b3c..57dc08f67b 100644 --- a/queue_job_batch/README.rst +++ b/queue_job_batch/README.rst @@ -11,7 +11,7 @@ Job Queue Batch !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !! source digest: sha256:81d1edb81bb2c114b7afe11730c4f36f6eedcf5fe32a6b258600fd24d69a4be9 + !! source digest: sha256:ca835258ad181cc54a5ba0eea86590c59e71b3aa70582a7ce115b83caa952991 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png diff --git a/queue_job_batch/__manifest__.py b/queue_job_batch/__manifest__.py index fc1245e076..7b9a0abc54 100644 --- a/queue_job_batch/__manifest__.py +++ b/queue_job_batch/__manifest__.py @@ -4,7 +4,7 @@ { "name": "Job Queue Batch", - "version": "18.0.1.1.0", + "version": "18.0.1.1.1", "author": "Creu Blanca,Odoo Community Association (OCA)", "website": "https://github.com/OCA/queue", "license": "AGPL-3", diff --git a/queue_job_batch/static/description/index.html b/queue_job_batch/static/description/index.html index 75a507f02e..3c8cb8fe0b 100644 --- a/queue_job_batch/static/description/index.html +++ b/queue_job_batch/static/description/index.html @@ -372,7 +372,7 @@

Job Queue Batch

!! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!! source digest: sha256:81d1edb81bb2c114b7afe11730c4f36f6eedcf5fe32a6b258600fd24d69a4be9 +!! source digest: sha256:ca835258ad181cc54a5ba0eea86590c59e71b3aa70582a7ce115b83caa952991 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->

Beta License: AGPL-3 OCA/queue Translate me on Weblate Try me on Runboat

This addon adds an a grouper for queue jobs.