Skip to content

Commit 8bb6955

Browse files
author
Sasha Romijn
committed
Fix ietf-tools#2418 - Account for previous rejected reviews in recommended assignment order
- Legacy-Id: 17053
1 parent abedd2d commit 8bb6955

3 files changed

Lines changed: 12 additions & 9 deletions

File tree

ietf/doc/tests_review.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -232,7 +232,6 @@ def test_close_request(self):
232232
self.assertIn("review_request_close_comment", mail_content)
233233

234234
def test_assign_reviewer(self):
235-
# TODO: this test overlaps way too much with the reviewer policy
236235
doc = WgDraftFactory(pages=2)
237236
review_team = ReviewTeamFactory(acronym="reviewteam", name="Review Team", type_id="review", list_email="reviewteam@ietf.org", parent=Group.objects.get(acronym="farfut"))
238237
rev_role = RoleFactory(group=review_team,person__user__username='reviewer',person__user__email='reviewer@example.com',person__name='Some Reviewer',name_id='reviewer')

ietf/review/policies.py

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -182,7 +182,8 @@ def _collect_context(self):
182182
self.rotation_index = {p.pk: i for i, p in enumerate(self.rotation_list)}
183183

184184
# This data is collected as a set of person IDs.
185-
self.has_reviewed_previous = self._persons_with_previous_review(self.review_req, self.possible_person_ids)
185+
self.has_completed_review_previous = self._persons_with_previous_review(self.review_req, self.possible_person_ids, 'completed')
186+
self.has_rejected_review_previous = self._persons_with_previous_review(self.review_req, self.possible_person_ids, 'rejected')
186187
self.wish_to_review = set(ReviewWish.objects.filter(team=self.team, person__in=self.possible_person_ids,
187188
doc=self.doc).values_list("person", flat=True))
188189

@@ -227,7 +228,7 @@ def add_boolean_score(direction, expr, explanation=None):
227228
# If a reviewer is unavailable, they are ignored.
228229
periods = self.unavailable_periods.get(email.person_id, [])
229230
unavailable_at_the_moment = periods and not (
230-
email.person_id in self.has_reviewed_previous and
231+
email.person_id in self.has_completed_review_previous and
231232
all(p.availability == "canfinish" for p in periods)
232233
)
233234
if unavailable_at_the_moment:
@@ -242,8 +243,9 @@ def format_period(p):
242243
if periods:
243244
explanations.append(", ".join(format_period(p) for p in periods))
244245

246+
add_boolean_score(-1, email.person_id in self.has_rejected_review_previous, "rejected review of document before")
245247
add_boolean_score(+1, settings.request_assignment_next, "requested to be selected next for assignment")
246-
add_boolean_score(+1, email.person_id in self.has_reviewed_previous, "reviewed document before")
248+
add_boolean_score(+1, email.person_id in self.has_completed_review_previous, "reviewed document before")
247249
add_boolean_score(+1, email.person_id in self.wish_to_review, "wishes to review document")
248250
add_boolean_score(-1, email.person_id in self.connections,
249251
self.connections.get(email.person_id)) # reviewer is somehow connected: bad
@@ -324,7 +326,7 @@ def _connections_with_doc(self, doc, person_ids):
324326
connections[author] = "is author of document"
325327
return connections
326328

327-
def _persons_with_previous_review(self, review_req, possible_person_ids):
329+
def _persons_with_previous_review(self, review_req, possible_person_ids, state_id):
328330
"""
329331
Collect anyone in possible_person_ids that have reviewed the document before,
330332
or an ancestor document.
@@ -334,7 +336,7 @@ def _persons_with_previous_review(self, review_req, possible_person_ids):
334336
has_reviewed_previous = ReviewRequest.objects.filter(
335337
doc__name__in=doc_names,
336338
reviewassignment__reviewer__person__in=possible_person_ids,
337-
reviewassignment__state="completed",
339+
reviewassignment__state=state_id,
338340
team=self.team,
339341
).distinct()
340342
if review_req.pk is not None:

ietf/review/test_policies.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -301,6 +301,8 @@ def test_determine_ranking(self):
301301
start_date='2000-01-01',
302302
availability='canfinish',
303303
)
304+
# Trigger "reviewer has rejected before"
305+
ReviewAssignmentFactory(review_request__team=team, review_request__doc=doc, reviewer=reviewer_low.email(), state_id='rejected')
304306

305307
# Trigger max frequency and open review stats
306308
ReviewAssignmentFactory(review_request__team=team, reviewer=reviewer_low.email(), state_id='assigned', review_request__doc__pages=10)
@@ -324,7 +326,7 @@ def test_determine_ranking(self):
324326
self.assertEqual(len(ranking), 2)
325327
self.assertEqual(ranking[0]['email'], reviewer_high.email())
326328
self.assertEqual(ranking[1]['email'], reviewer_low.email())
327-
self.assertEqual(ranking[0]['scores'], [ 1, 1, 1, 1, 1, 0, 0, -1])
328-
self.assertEqual(ranking[1]['scores'], [-1, -1, -1, -1, -1, -91, -2, 0])
329+
self.assertEqual(ranking[0]['scores'], [ 1, 1, 1, 1, 1, 1, 0, 0, -1])
330+
self.assertEqual(ranking[1]['scores'], [-1, -1, -1, -1, -1, -1, -91, -2, 0])
329331
self.assertEqual(ranking[0]['label'], 'Test Reviewer-high: unavailable indefinitely (Can do follow-ups); requested to be selected next for assignment; reviewed document before; wishes to review document; #2; 1 no response, 1 partially complete, 1 fully completed')
330-
self.assertEqual(ranking[1]['label'], 'Test Reviewer-low: is author of document; filter regexp matches; max frequency exceeded, ready in 91 days; skip next 2; #1; currently 1 open, 10 pages')
332+
self.assertEqual(ranking[1]['label'], 'Test Reviewer-low: rejected review of document before; is author of document; filter regexp matches; max frequency exceeded, ready in 91 days; skip next 2; #1; currently 1 open, 10 pages')

0 commit comments

Comments
 (0)