diff --git a/base_tier_validation/models/tier_definition.py b/base_tier_validation/models/tier_definition.py index e3700e5b73..7ef4404058 100644 --- a/base_tier_validation/models/tier_definition.py +++ b/base_tier_validation/models/tier_definition.py @@ -73,6 +73,9 @@ def _get_tier_validation_model_names(self): default=False, help="Approval order by the specified sequence number", ) + approve_sequence_bypass = fields.Boolean( + help="Bypassed (auto validated), if previous tier was validated by same reviewer", + ) @api.onchange("review_type") def onchange_review_type(self): diff --git a/base_tier_validation/models/tier_review.py b/base_tier_validation/models/tier_review.py index 95e4f757c8..375c2fefef 100644 --- a/base_tier_validation/models/tier_review.py +++ b/base_tier_validation/models/tier_review.py @@ -55,6 +55,9 @@ class TierReview(models.Model): approve_sequence = fields.Boolean( related="definition_id.approve_sequence", readonly=True ) + approve_sequence_bypass = fields.Boolean( + related="definition_id.approve_sequence_bypass", readonly=True + ) @api.depends("definition_id.approve_sequence") def _compute_can_review(self): diff --git a/base_tier_validation/models/tier_validation.py b/base_tier_validation/models/tier_validation.py index 2a0d199df8..980490f735 100644 --- a/base_tier_validation/models/tier_validation.py +++ b/base_tier_validation/models/tier_validation.py @@ -327,7 +327,9 @@ def _add_comment(self, validate_reject, reviews): def validate_tier(self): self.ensure_one() sequences = self._get_sequences_to_approve(self.env.user) - reviews = self.review_ids.filtered(lambda l: l.sequence in sequences) + reviews = self.review_ids.filtered( + lambda l: l.sequence in sequences or l.approve_sequence_bypass + ) if self.has_comment: return self._add_comment("validate", reviews) self._validate_tier(reviews) diff --git a/base_tier_validation/tests/test_tier_validation.py b/base_tier_validation/tests/test_tier_validation.py index 67760900a5..0c8354ece1 100644 --- a/base_tier_validation/tests/test_tier_validation.py +++ b/base_tier_validation/tests/test_tier_validation.py @@ -305,6 +305,51 @@ def test_12_approve_sequence_same_user(self): 0, len(record1.review_ids.filtered(lambda l: l.status == "pending")) ) + def test_12_approve_sequence_same_user_bypassed(self): + """Similar to test_12_approve_sequence, with all same users, + but approve_sequence_bypass is True""" + # Create new test record + test_record = self.test_model.create({"test_field": 2.5}) + # Create tier definitions + 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, + "approve_sequence_bypass": True, + "sequence": 20, + } + ) + 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, + "approve_sequence_bypass": True, + "sequence": 10, + } + ) + # Request validation + self.assertFalse(self.test_record.review_ids) + reviews = test_record.with_user(self.test_user_1.id).request_validation() + self.assertTrue(reviews) + + record1 = test_record.with_user(self.test_user_1.id) + record1.invalidate_cache() + self.assertTrue(record1.can_review) + # When the first tier is validated, all the rest will be approved. + self.assertEqual( + 3, len(record1.review_ids.filtered(lambda l: l.status == "pending")) + ) + record1.validate_tier() + self.assertEqual( + 0, len(record1.review_ids.filtered(lambda l: l.status == "pending")) + ) + def test_13_onchange_review_type(self): tier_def_id = self.tier_def_obj.create( { diff --git a/base_tier_validation/views/tier_definition_view.xml b/base_tier_validation/views/tier_definition_view.xml index 6e68a06a60..64e0227aa8 100644 --- a/base_tier_validation/views/tier_definition_view.xml +++ b/base_tier_validation/views/tier_definition_view.xml @@ -71,6 +71,16 @@ /> +