Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 12 additions & 2 deletions base_tier_validation/models/tier_validation.py
Original file line number Diff line number Diff line change
Expand Up @@ -537,9 +537,19 @@ def _validate_tier(self, tiers=False):
}
)

user_reviews = tier_reviews.filtered(
lambda r: r.status == "pending" and (self.env.user in r.reviewer_ids)
# Only approve consecutive pending reviews (by sequence) for the
# current user. Stop at the first review not assigned to the user,
# so intermediate reviewers are not skipped.
sorted_pending = tier_reviews.filtered(lambda r: r.status == "pending").sorted(
"sequence"
)
user_reviews = self.env["tier.review"]
for review in sorted_pending:
if self.env.user in review.reviewer_ids:
user_reviews |= review
else:
break

user_reviews.write(
{
"status": "approved",
Expand Down
66 changes: 62 additions & 4 deletions base_tier_validation/tests/test_tier_validation.py
Original file line number Diff line number Diff line change
Expand Up @@ -313,10 +313,26 @@ def test_12_approve_sequence_same_user(self):

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"""
but approve_sequence_bypass is True
Sequence of reviewers: A, A, B, A.
When A validates, it should only validate the first two (A, A) and stop at B.
"""
# Create new test record
test_record = self.test_model.create({"test_field": 2.5})
# Create tier definitions
# sequence 40 (User 1)
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": 40,
}
)
# sequence 30 (User 1)
self.tier_def_obj.create(
{
"model_id": self.tester_model.id,
Expand All @@ -325,9 +341,22 @@ def test_12_approve_sequence_same_user_bypassed(self):
"definition_domain": "[('test_field', '>', 1.0)]",
"approve_sequence": True,
"approve_sequence_bypass": True,
"sequence": 30,
}
)
# sequence 20 (User 2)
self.tier_def_obj.create(
{
"model_id": self.tester_model.id,
"review_type": "individual",
"reviewer_id": self.test_user_2.id,
"definition_domain": "[('test_field', '>', 1.0)]",
"approve_sequence": True,
"approve_sequence_bypass": True,
"sequence": 20,
}
)
# sequence 10 (User 1)
self.tier_def_obj.create(
{
"model_id": self.tester_model.id,
Expand All @@ -347,23 +376,52 @@ def test_12_approve_sequence_same_user_bypassed(self):
record1 = test_record.with_user(self.test_user_1.id)
self.assertTrue(record1.can_review)
# When the first tier is validated, all the rest will be approved.
self.assertEqual(len(record1.review_ids), 2)
self.assertEqual(len(record1.review_ids), 4)
self.assertEqual(
1, len(record1.review_ids.filtered(lambda x: x.status == "waiting"))
3, len(record1.review_ids.filtered(lambda x: x.status == "waiting"))
)
self.assertEqual(
1, len(record1.review_ids.filtered(lambda x: x.status == "pending"))
)
record1.validate_tier()
# After user 1 validates, they should have approved exactly 2 tiers: 40 and 30
# 20 and 10 should be pending.
self.assertEqual(
0, len(record1.review_ids.filtered(lambda x: x.status == "pending"))
2, len(record1.review_ids.filtered(lambda x: x.status == "pending"))
)
self.assertEqual(
0, len(record1.review_ids.filtered(lambda x: x.status == "waiting"))
)
self.assertEqual(
2, len(record1.review_ids.filtered(lambda x: x.status == "approved"))
)
self.assertFalse(record1.can_review)
# User 2 validates.
record2 = test_record.with_user(self.test_user_2.id)
self.assertTrue(record2.can_review)
record2.validate_tier()
self.assertEqual(
1, len(record1.review_ids.filtered(lambda x: x.status == "pending"))
)
self.assertEqual(
0, len(record1.review_ids.filtered(lambda x: x.status == "waiting"))
)
self.assertEqual(
3, len(record1.review_ids.filtered(lambda x: x.status == "approved"))
)
# User 1 validates the final tier.
self.assertTrue(record1.can_review)
record1.validate_tier()
self.assertEqual(
0, len(record1.review_ids.filtered(lambda x: x.status == "pending"))
)
self.assertEqual(
0, len(record1.review_ids.filtered(lambda x: x.status == "waiting"))
)
self.assertEqual(
4, len(record1.review_ids.filtered(lambda x: x.status == "approved"))
)
self.assertEqual(record1.validation_status, "validated")

def test_13_onchange_review_type(self):
tier_def_id = self.tier_def_obj.create(
Expand Down