From 7f45b1bd56b01ade7518fb0e2f5178be6859fcef Mon Sep 17 00:00:00 2001 From: Pani-k-folk Date: Thu, 15 Oct 2026 11:42:49 +0700 Subject: [PATCH] [FIX] base_tier_validation_forward: keep comments of forwarded reviews A forwarded review and the review created for the next reviewer share the same sequence. Forwarding again sent all reviews of that sequence to the comment wizard, which overwrote the comment of every earlier forwarded review with the new '>> reviewer' text. Only take the current user's pending review, as validate_tier does. Assisted-by: Claude Opus 5.5 --- .../models/tier_validation.py | 8 ++- .../tests/test_tier_validation.py | 58 +++++++++++++++++++ 2 files changed, 65 insertions(+), 1 deletion(-) diff --git a/base_tier_validation_forward/models/tier_validation.py b/base_tier_validation_forward/models/tier_validation.py index 47f2c2e0e..d9d46c08d 100644 --- a/base_tier_validation_forward/models/tier_validation.py +++ b/base_tier_validation_forward/models/tier_validation.py @@ -31,7 +31,13 @@ def _get_forwarded_notification_subtype(self): def forward_tier(self): self.ensure_one() sequences = self._get_sequences_to_approve(self.env.user) - reviews = self.review_ids.filtered(lambda r: r.sequence in sequences) + # Forwarded reviews share their sequence: only take the user's own + # pending one, or the wizard overwrites earlier forward comments. + reviews = self.review_ids.filtered( + lambda r: r.sequence in sequences + and r.status == "pending" + and self.env.user in r.reviewer_ids + ) ctx = self._add_comment("forward", reviews)["context"] comment = ( self.env["comment.wizard"].with_context(**ctx).create({"comment": "/"}) diff --git a/base_tier_validation_forward/tests/test_tier_validation.py b/base_tier_validation_forward/tests/test_tier_validation.py index 5f31696c1..e42f0185d 100644 --- a/base_tier_validation_forward/tests/test_tier_validation.py +++ b/base_tier_validation_forward/tests/test_tier_validation.py @@ -13,6 +13,14 @@ def setUpClass(cls): super().setUpClass() cls.other_test_user = new_test_user(cls.env, name="Clarissa", login="forward") + def _forward(self, record, user, target): + action = record.with_user(user).forward_tier() + self.env[action["res_model"]].with_user(user).with_context( + **action["context"] + ).create( + {"forward_reviewer_id": target.id, "forward_description": "Have a look"} + ).add_forward() + def test_01_forward_tier(self): # Create new test record test_record = self.test_model.create({"test_field": 2.5}) @@ -208,3 +216,53 @@ def test_02_forward_tier_multiple_with_comment(self): def test_03_forward_tier_multiple_without_comment(self): """Expected flow with forwards, but without comments""" self._test_forward_tier_multiple(has_comment=False) + + def test_04_forward_a_forwarded_review(self): + """User 1 forwards to user 2, who forwards it back to user 1, who + forwards it on to a third user. Each forwarded review keeps the + comment naming its own next reviewer.""" + self.tier_def_obj.create( + { + "model_id": self.tester_model.id, + "review_type": "individual", + "reviewer_id": self.test_user_1.id, + "definition_domain": "[('test_field', '>', 1.0)]", + "approve_sequence": True, + "has_forward": True, + } + ) + test_record = self.test_model.create({"test_field": 2.5}) + test_record.with_user(self.test_user_2).request_validation() + self._forward(test_record, self.test_user_1, self.test_user_2) + self._forward(test_record, self.test_user_2, self.test_user_1) + self._forward(test_record, self.test_user_1, self.other_test_user) + self.assertRecordValues( + test_record.review_ids, + [ + { + "reviewer_id": self.test_user_1.id, + "status": "forwarded", + "comment": f">> {self.test_user_2.display_name}", + }, + { + "reviewer_id": self.test_user_2.id, + "status": "forwarded", + "comment": f">> {self.test_user_1.display_name}", + }, + { + "reviewer_id": self.test_user_1.id, + "status": "forwarded", + "comment": f">> {self.other_test_user.display_name}", + }, + { + "reviewer_id": self.other_test_user.id, + "status": "pending", + "comment": False, + }, + ], + ) + action = test_record.with_user(self.other_test_user).validate_tier() + self.env[action["res_model"]].with_user(self.other_test_user).with_context( + **action["context"] + ).create({"comment": "Reviewed"}).add_comment() + self.assertEqual(test_record.validation_status, "validated")