Skip to content

Commit d105f8b

Browse files
committed
Filter out reviewers who have rejected reviewing this document in the past from the list of suggested reviewers. Fixes ietf-tools#2996. Commit ready for merge.
- Legacy-Id: 18373
1 parent 8bde162 commit d105f8b

File tree

2 files changed

+34
-2
lines changed

2 files changed

+34
-2
lines changed

ietf/review/policies.py

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
import re
55

6+
from django.db.models import Q
67
from django.db.models.aggregates import Max
78

89
from ietf.doc.models import DocumentAuthor, DocAlias
@@ -126,8 +127,26 @@ def setup_reviewer_field(self, field, review_req):
126127
The field should be an instance similar to
127128
PersonEmailChoiceField(label="Assign Reviewer", empty_label="(None)")
128129
"""
129-
field.queryset = field.queryset.filter(role__name="reviewer", role__group=review_req.team)
130-
one_assignment = review_req.reviewassignment_set.first()
130+
131+
# Collect a set of person IDs for people who have either not responded
132+
# to or outright rejected reviewing this document in the past
133+
rejecting_reviewer_ids = review_req.doc.reviewrequest_set.filter(
134+
reviewassignment__state__slug__in=('rejected', 'no-response')
135+
).values_list(
136+
'reviewassignment__reviewer__person_id', flat=True
137+
)
138+
139+
# Query the Email objects for reviewers who haven't rejected or
140+
# not responded to this document in the past
141+
field.queryset = field.queryset.filter(
142+
role__name="reviewer",
143+
role__group=review_req.team
144+
).filter(
145+
~Q( person_id__in=rejecting_reviewer_ids )
146+
)
147+
one_assignment = review_req.reviewassignment_set.filter(
148+
~Q(state__slug__in = ('rejected', 'no-response') )
149+
).first()
131150
if one_assignment:
132151
field.initial = one_assignment.reviewer_id
133152

ietf/review/tests_policies.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,11 +91,24 @@ def test_setup_reviewer_field(self):
9191
policy = RotateAlphabeticallyReviewerQueuePolicy(team)
9292
reviewer_0 = create_person(team, "reviewer", name="Test Reviewer-0", username="testreviewer0")
9393
reviewer_1 = create_person(team, "reviewer", name="Test Reviewer-1", username="testreviewer1")
94+
reviewer_2 = create_person(team, "reviewer", name="Test Reviewer-2", username="testreviewer2")
95+
reviewer_3 = create_person(team, "reviewer", name="Test Reviewer-3", username="testreviewer3")
9496
review_req = ReviewRequestFactory(team=team, type_id='early')
97+
review_req_2 = ReviewRequestFactory(team=team, type_id='early', doc=review_req.doc)
98+
review_req_3 = ReviewRequestFactory(team=team, type_id='early', doc=review_req.doc)
9599
ReviewAssignmentFactory(review_request=review_req, reviewer=reviewer_1.email(), state_id='part-completed')
100+
ReviewAssignmentFactory(review_request=review_req_2, reviewer=reviewer_2.email(), state_id='rejected')
101+
ReviewAssignmentFactory(review_request=review_req_3, reviewer=reviewer_3.email(), state_id='no-response')
96102
field = PersonEmailChoiceField(label="Assign Reviewer", empty_label="(None)", required=False)
97103

98104
policy.setup_reviewer_field(field, review_req)
105+
addresses = list( map( lambda choice: choice[0], field.choices ) )
106+
self.assertNotIn(
107+
str(reviewer_2.email()), addresses,
108+
"Reviews should not suggest people who have rejected this request in the past")
109+
self.assertNotIn(
110+
str(reviewer_3.email()), addresses,
111+
"Reviews should not suggest people who have not responded to this request in the past.")
99112
self.assertEqual(field.choices[0], ('', '(None)'))
100113
self.assertEqual(field.choices[1][0], str(reviewer_0.email()))
101114
self.assertEqual(field.choices[2][0], str(reviewer_1.email()))

0 commit comments

Comments
 (0)