From 3730b246827522f45cbae83ebb96e4916c407814 Mon Sep 17 00:00:00 2001 From: jordyBSK Date: Wed, 10 Jun 2026 10:57:05 +0200 Subject: [PATCH 1/7] refactor: count only completed translations in stats - Update nb_translated_letters to filter on translation_status == "done" - Replace translate_date usage with translate_done for yearly stats - Add precise @api.depends on translation_status and translate_done - Ensure counters reflect only completed translations --- sbc_translation/models/translation_user.py | 24 ++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/sbc_translation/models/translation_user.py b/sbc_translation/models/translation_user.py index 2b54ac2c5..c7eb82c1a 100644 --- a/sbc_translation/models/translation_user.py +++ b/sbc_translation/models/translation_user.py @@ -53,28 +53,36 @@ class TranslationUser(models.Model): ("unique_translator", "unique(user_id)", "This translator already exists.") ] - @api.depends("translated_letter_ids") + @api.depends("translated_letter_ids.translation_status") def _compute_nb_translated_letters(self): for translator in self: - translator.nb_translated_letters = len(translator.translated_letter_ids) + translator.nb_translated_letters = len( + translator.translated_letter_ids.filtered( + lambda it: it.translation_status == "done" + ) + ) - @api.depends("translated_letter_ids") + @api.depends("translated_letter_ids.translation_status", "translated_letter_ids.translate_done") def _compute_nb_translated_letters_this_year(self): + current_year = fields.Datetime.now().year for translator in self: translator.nb_translated_letters_this_year = len( translator.translated_letter_ids.filtered( - lambda it: it.translate_date - and it.translate_date.year == fields.Datetime.now().year + lambda it: it.translation_status == "done" and + it.translate_done and + it.translate_done.year == current_year ) ) - @api.depends("translated_letter_ids") + @api.depends("translated_letter_ids.translation_status", "translated_letter_ids.translate_done") def _compute_nb_translated_letters_last_year(self): + last_year = fields.Datetime.now().year - 1 for translator in self: translator.nb_translated_letters_last_year = len( translator.translated_letter_ids.filtered( - lambda it: it.translate_date - and it.translate_date.year == fields.Datetime.now().year - 1 + lambda it: it.translation_status == "done" and + it.translate_done and + it.translate_done.year == last_year ) ) From db9499d61b6aa925296877c184ac05aed14dae1c Mon Sep 17 00:00:00 2001 From: jordyBSK Date: Wed, 10 Jun 2026 11:47:42 +0200 Subject: [PATCH 2/7] fix: fix the file translation_user.py with the pre-commit --- sbc_translation/models/translation_user.py | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/sbc_translation/models/translation_user.py b/sbc_translation/models/translation_user.py index c7eb82c1a..7b8e7faa8 100644 --- a/sbc_translation/models/translation_user.py +++ b/sbc_translation/models/translation_user.py @@ -62,27 +62,33 @@ def _compute_nb_translated_letters(self): ) ) - @api.depends("translated_letter_ids.translation_status", "translated_letter_ids.translate_done") + @api.depends( + "translated_letter_ids.translation_status", + "translated_letter_ids.translate_done", + ) def _compute_nb_translated_letters_this_year(self): current_year = fields.Datetime.now().year for translator in self: translator.nb_translated_letters_this_year = len( translator.translated_letter_ids.filtered( - lambda it: it.translation_status == "done" and - it.translate_done and - it.translate_done.year == current_year + lambda it: it.translation_status == "done" + and it.translate_done + and it.translate_done.year == current_year ) ) - @api.depends("translated_letter_ids.translation_status", "translated_letter_ids.translate_done") + @api.depends( + "translated_letter_ids.translation_status", + "translated_letter_ids.translate_done", + ) def _compute_nb_translated_letters_last_year(self): last_year = fields.Datetime.now().year - 1 for translator in self: translator.nb_translated_letters_last_year = len( translator.translated_letter_ids.filtered( - lambda it: it.translation_status == "done" and - it.translate_done and - it.translate_done.year == last_year + lambda it: it.translation_status == "done" + and it.translate_done + and it.translate_done.year == last_year ) ) From 1c46838fdc1303eb318be0065eaf5338371a0cc0 Mon Sep 17 00:00:00 2001 From: jordyBSK Date: Fri, 12 Jun 2026 15:06:49 +0200 Subject: [PATCH 3/7] refactor: added changes recommended by gemini code --- sbc_translation/models/translation_user.py | 64 +++++++++++++++------- 1 file changed, 45 insertions(+), 19 deletions(-) diff --git a/sbc_translation/models/translation_user.py b/sbc_translation/models/translation_user.py index 7b8e7faa8..b43369be2 100644 --- a/sbc_translation/models/translation_user.py +++ b/sbc_translation/models/translation_user.py @@ -55,42 +55,68 @@ class TranslationUser(models.Model): @api.depends("translated_letter_ids.translation_status") def _compute_nb_translated_letters(self): + groups = self.env["correspondence"].read_group( + [("new_translator_id", "in", self.ids), ("translation_status", "=", "done")], + ["new_translator_id"], + ["new_translator_id"] + ) + mapped_data = { + g["new_translator_id"][0]: g["new_translator_id_count"] + for g in groups + if g["new_translator_id"] + } for translator in self: - translator.nb_translated_letters = len( - translator.translated_letter_ids.filtered( - lambda it: it.translation_status == "done" - ) - ) + translator.nb_translated_letters = mapped_data.get(translator.id, 0) @api.depends( "translated_letter_ids.translation_status", "translated_letter_ids.translate_done", ) + @api.depends("translated_letter_ids.translation_status", "translated_letter_ids.translate_done") def _compute_nb_translated_letters_this_year(self): current_year = fields.Datetime.now().year + groups = self.env["correspondence"].read_group( + [ + ("new_translator_id", "in", self.ids), + ("translation_status", "=", "done"), + ("translate_done", ">=", f"{current_year}-01-01 00:00:00"), + ("translate_done", "<=", f"{current_year}-12-31 23:59:59"), + ], + ["new_translator_id"], + ["new_translator_id"] + ) + mapped_data = { + g["new_translator_id"][0]: g["new_translator_id_count"] + for g in groups + if g["new_translator_id"] + } for translator in self: - translator.nb_translated_letters_this_year = len( - translator.translated_letter_ids.filtered( - lambda it: it.translation_status == "done" - and it.translate_done - and it.translate_done.year == current_year - ) - ) + translator.nb_translated_letters_this_year = mapped_data.get(translator.id, 0) @api.depends( "translated_letter_ids.translation_status", "translated_letter_ids.translate_done", ) + @api.depends("translated_letter_ids.translation_status", "translated_letter_ids.translate_done") def _compute_nb_translated_letters_last_year(self): last_year = fields.Datetime.now().year - 1 + groups = self.env["correspondence"].read_group( + [ + ("new_translator_id", "in", self.ids), + ("translation_status", "=", "done"), + ("translate_done", ">=", f"{last_year}-01-01 00:00:00"), + ("translate_done", "<=", f"{last_year}-12-31 23:59:59"), + ], + ["new_translator_id"], + ["new_translator_id"] + ) + mapped_data = { + g["new_translator_id"][0]: g["new_translator_id_count"] + for g in groups + if g["new_translator_id"] + } for translator in self: - translator.nb_translated_letters_last_year = len( - translator.translated_letter_ids.filtered( - lambda it: it.translation_status == "done" - and it.translate_done - and it.translate_done.year == last_year - ) - ) + translator.nb_translated_letters_last_year = mapped_data.get(translator.id, 0) @api.model_create_multi def create(self, vals_list): From ccbaa0450d3a979e216151c24cb63de97a6f2097 Mon Sep 17 00:00:00 2001 From: jordyBSK Date: Mon, 15 Jun 2026 10:13:26 +0200 Subject: [PATCH 4/7] refactor: fix the file with pre-commit --- sbc_translation/models/translation_user.py | 29 ++++++++++++++++------ 1 file changed, 21 insertions(+), 8 deletions(-) diff --git a/sbc_translation/models/translation_user.py b/sbc_translation/models/translation_user.py index b43369be2..ed8fc34d0 100644 --- a/sbc_translation/models/translation_user.py +++ b/sbc_translation/models/translation_user.py @@ -56,9 +56,12 @@ class TranslationUser(models.Model): @api.depends("translated_letter_ids.translation_status") def _compute_nb_translated_letters(self): groups = self.env["correspondence"].read_group( - [("new_translator_id", "in", self.ids), ("translation_status", "=", "done")], + [ + ("new_translator_id", "in", self.ids), + ("translation_status", "=", "done"), + ], + ["new_translator_id"], ["new_translator_id"], - ["new_translator_id"] ) mapped_data = { g["new_translator_id"][0]: g["new_translator_id_count"] @@ -72,7 +75,10 @@ def _compute_nb_translated_letters(self): "translated_letter_ids.translation_status", "translated_letter_ids.translate_done", ) - @api.depends("translated_letter_ids.translation_status", "translated_letter_ids.translate_done") + @api.depends( + "translated_letter_ids.translation_status", + "translated_letter_ids.translate_done", + ) def _compute_nb_translated_letters_this_year(self): current_year = fields.Datetime.now().year groups = self.env["correspondence"].read_group( @@ -83,7 +89,7 @@ def _compute_nb_translated_letters_this_year(self): ("translate_done", "<=", f"{current_year}-12-31 23:59:59"), ], ["new_translator_id"], - ["new_translator_id"] + ["new_translator_id"], ) mapped_data = { g["new_translator_id"][0]: g["new_translator_id_count"] @@ -91,13 +97,18 @@ def _compute_nb_translated_letters_this_year(self): if g["new_translator_id"] } for translator in self: - translator.nb_translated_letters_this_year = mapped_data.get(translator.id, 0) + translator.nb_translated_letters_this_year = mapped_data.get( + translator.id, 0 + ) @api.depends( "translated_letter_ids.translation_status", "translated_letter_ids.translate_done", ) - @api.depends("translated_letter_ids.translation_status", "translated_letter_ids.translate_done") + @api.depends( + "translated_letter_ids.translation_status", + "translated_letter_ids.translate_done", + ) def _compute_nb_translated_letters_last_year(self): last_year = fields.Datetime.now().year - 1 groups = self.env["correspondence"].read_group( @@ -108,7 +119,7 @@ def _compute_nb_translated_letters_last_year(self): ("translate_done", "<=", f"{last_year}-12-31 23:59:59"), ], ["new_translator_id"], - ["new_translator_id"] + ["new_translator_id"], ) mapped_data = { g["new_translator_id"][0]: g["new_translator_id_count"] @@ -116,7 +127,9 @@ def _compute_nb_translated_letters_last_year(self): if g["new_translator_id"] } for translator in self: - translator.nb_translated_letters_last_year = mapped_data.get(translator.id, 0) + translator.nb_translated_letters_last_year = mapped_data.get( + translator.id, 0 + ) @api.model_create_multi def create(self, vals_list): From ac0c91a15add4ca063ea4b4c74c732fac716d0d6 Mon Sep 17 00:00:00 2001 From: jordyBSK Date: Thu, 25 Jun 2026 16:20:05 +0200 Subject: [PATCH 5/7] feat: Added a migration file to recalculate the number of letters translated by the translators --- .../migrations/18.0.1.1.0/post-migration.py | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 sbc_translation/migrations/18.0.1.1.0/post-migration.py diff --git a/sbc_translation/migrations/18.0.1.1.0/post-migration.py b/sbc_translation/migrations/18.0.1.1.0/post-migration.py new file mode 100644 index 000000000..1605b27c1 --- /dev/null +++ b/sbc_translation/migrations/18.0.1.1.0/post-migration.py @@ -0,0 +1,26 @@ +# sbc_translation/migrations/18.0.1.1.0/post-migration.py + +from odoo import api, SUPERUSER_ID + + +def migrate(cr, version): + """ + Migration script to force the recalculation of translation statistics + for existing users when updating the module. + """ + env = api.Environment(cr, SUPERUSER_ID, {}) + + translators = env["translation.user"].search([]) + + if not translators: + return + + env.add_to_compute(env["translation.user"]._fields["nb_translated_letters"], translators) + env.add_to_compute(env["translation.user"]._fields["nb_translated_letters_this_year"], translators) + env.add_to_compute(env["translation.user"]._fields["nb_translated_letters_last_year"], translators) + + translators.flush_model([ + "nb_translated_letters", + "nb_translated_letters_this_year", + "nb_translated_letters_last_year" + ]) \ No newline at end of file From 098d5e7b2f657cef2b9df84a0f6db2e2a2ded4a4 Mon Sep 17 00:00:00 2001 From: jordyBSK Date: Thu, 25 Jun 2026 16:27:44 +0200 Subject: [PATCH 6/7] refactor: refactor the code --- sbc_translation/models/translation_user.py | 24 +++++----------------- 1 file changed, 5 insertions(+), 19 deletions(-) diff --git a/sbc_translation/models/translation_user.py b/sbc_translation/models/translation_user.py index ed8fc34d0..644edb416 100644 --- a/sbc_translation/models/translation_user.py +++ b/sbc_translation/models/translation_user.py @@ -64,17 +64,11 @@ def _compute_nb_translated_letters(self): ["new_translator_id"], ) mapped_data = { - g["new_translator_id"][0]: g["new_translator_id_count"] - for g in groups - if g["new_translator_id"] + g["new_translator_id"][0]: g["new_translator_id_count"] for g in groups } for translator in self: translator.nb_translated_letters = mapped_data.get(translator.id, 0) - @api.depends( - "translated_letter_ids.translation_status", - "translated_letter_ids.translate_done", - ) @api.depends( "translated_letter_ids.translation_status", "translated_letter_ids.translate_done", @@ -86,25 +80,19 @@ def _compute_nb_translated_letters_this_year(self): ("new_translator_id", "in", self.ids), ("translation_status", "=", "done"), ("translate_done", ">=", f"{current_year}-01-01 00:00:00"), - ("translate_done", "<=", f"{current_year}-12-31 23:59:59"), + ("translate_done", "<", f"{current_year + 1}-01-01 00:00:00"), ], ["new_translator_id"], ["new_translator_id"], ) mapped_data = { - g["new_translator_id"][0]: g["new_translator_id_count"] - for g in groups - if g["new_translator_id"] + g["new_translator_id"][0]: g["new_translator_id_count"] for g in groups } for translator in self: translator.nb_translated_letters_this_year = mapped_data.get( translator.id, 0 ) - @api.depends( - "translated_letter_ids.translation_status", - "translated_letter_ids.translate_done", - ) @api.depends( "translated_letter_ids.translation_status", "translated_letter_ids.translate_done", @@ -116,15 +104,13 @@ def _compute_nb_translated_letters_last_year(self): ("new_translator_id", "in", self.ids), ("translation_status", "=", "done"), ("translate_done", ">=", f"{last_year}-01-01 00:00:00"), - ("translate_done", "<=", f"{last_year}-12-31 23:59:59"), + ("translate_done", "<", f"{last_year + 1}-01-01 00:00:00"), ], ["new_translator_id"], ["new_translator_id"], ) mapped_data = { - g["new_translator_id"][0]: g["new_translator_id_count"] - for g in groups - if g["new_translator_id"] + g["new_translator_id"][0]: g["new_translator_id_count"] for g in groups } for translator in self: translator.nb_translated_letters_last_year = mapped_data.get( From 1940974208c0b2c83252fc10a48cb2bc9b93b68c Mon Sep 17 00:00:00 2001 From: jordyBSK Date: Mon, 29 Jun 2026 09:37:56 +0200 Subject: [PATCH 7/7] feat: add the migration file to calculate fields --- sbc_translation/__manifest__.py | 2 +- .../migrations/18.0.1.1.0/post-migration.py | 26 ++++++++++++------- 2 files changed, 18 insertions(+), 10 deletions(-) diff --git a/sbc_translation/__manifest__.py b/sbc_translation/__manifest__.py index 6f214f104..219f83b4e 100644 --- a/sbc_translation/__manifest__.py +++ b/sbc_translation/__manifest__.py @@ -28,7 +28,7 @@ # pylint: disable=C8101 { "name": "SBC Translation Platform", - "version": "18.0.1.0.0", + "version": "18.0.1.1.0", "category": "Compassion", "summary": "SBC - Translation Platform", "sequence": 150, diff --git a/sbc_translation/migrations/18.0.1.1.0/post-migration.py b/sbc_translation/migrations/18.0.1.1.0/post-migration.py index 1605b27c1..83a12b085 100644 --- a/sbc_translation/migrations/18.0.1.1.0/post-migration.py +++ b/sbc_translation/migrations/18.0.1.1.0/post-migration.py @@ -1,6 +1,6 @@ # sbc_translation/migrations/18.0.1.1.0/post-migration.py -from odoo import api, SUPERUSER_ID +from odoo import SUPERUSER_ID, api def migrate(cr, version): @@ -15,12 +15,20 @@ def migrate(cr, version): if not translators: return - env.add_to_compute(env["translation.user"]._fields["nb_translated_letters"], translators) - env.add_to_compute(env["translation.user"]._fields["nb_translated_letters_this_year"], translators) - env.add_to_compute(env["translation.user"]._fields["nb_translated_letters_last_year"], translators) + env.add_to_compute( + env["translation.user"]._fields["nb_translated_letters"], translators + ) + env.add_to_compute( + env["translation.user"]._fields["nb_translated_letters_this_year"], translators + ) + env.add_to_compute( + env["translation.user"]._fields["nb_translated_letters_last_year"], translators + ) - translators.flush_model([ - "nb_translated_letters", - "nb_translated_letters_this_year", - "nb_translated_letters_last_year" - ]) \ No newline at end of file + translators.flush_model( + [ + "nb_translated_letters", + "nb_translated_letters_this_year", + "nb_translated_letters_last_year", + ] + )