Skip to content

Commit b64066b

Browse files
author
Sasha Romijn
committed
Fix LeastRecentlyUsed policy ordering.
- Legacy-Id: 17092
1 parent 384c0ac commit b64066b

2 files changed

Lines changed: 21 additions & 9 deletions

File tree

ietf/review/policies.py

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
from collections import OrderedDict
77

88
import six
9+
from django.db.models.aggregates import Max
910

1011
from ietf.doc.models import DocumentAuthor, DocAlias
1112
from ietf.doc.utils import extract_complete_replaces_ancestor_mapping_for_docs
@@ -423,17 +424,21 @@ class LeastRecentlyUsedReviewerQueuePolicy(AbstractReviewerQueuePolicy):
423424
"""
424425
def default_reviewer_rotation_list(self, include_unavailable=False, dont_skip_person_ids=None):
425426
reviewers = list(Person.objects.filter(role__name="reviewer", role__group=self.team))
427+
reviewers_dict = {p.pk: p for p in reviewers}
426428
assignments = ReviewAssignment.objects.filter(
427429
review_request__team=self.team,
428430
state__in=['accepted', 'assigned', 'completed'],
429431
reviewer__person__in=reviewers,
430-
).order_by('assigned_on').select_related('reviewer', 'reviewer__person')
431-
432-
reviewers_with_assignment = [assignment.reviewer.person for assignment in assignments]
432+
).values('reviewer__person').annotate(most_recent=Max('assigned_on')).order_by('most_recent')
433+
434+
reviewers_with_assignment = [
435+
reviewers_dict[assignment['reviewer__person']]
436+
for assignment in assignments
437+
]
433438
reviewers_without_assignment = set(reviewers) - set(reviewers_with_assignment)
434439

435440
rotation_list = sorted(list(reviewers_without_assignment), key=lambda r: r.pk)
436-
rotation_list += list(OrderedDict.fromkeys(reviewers_with_assignment))
441+
rotation_list += reviewers_with_assignment
437442

438443
if not include_unavailable:
439444
reviewers_to_skip = self._entirely_unavailable_reviewers(dont_skip_person_ids)

ietf/review/test_policies.py

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -257,27 +257,34 @@ def test_default_reviewer_rotation_list(self):
257257
out_of_team_reviewer = PersonFactory()
258258
ReviewAssignmentFactory(review_request__team=team, reviewer=out_of_team_reviewer.email())
259259

260-
# No known assignments
260+
# No known assignments, order in PK order.
261261
rotation = policy.default_reviewer_rotation_list()
262262
self.assertNotIn(unavailable_reviewer, rotation)
263263
self.assertEqual(rotation, reviewers)
264264

265-
# Regular accepted assignment
265+
# Regular accepted assignments. Note that one is older and one is newer than reviewer 0's,
266+
# the newest one should count for ordering, i.e. reviewer 1 should be later in the list.
266267
ReviewAssignmentFactory(reviewer=reviewers[1].email(), assigned_on='2019-01-01',
267268
state_id='accepted', review_request__team=team)
269+
ReviewAssignmentFactory(reviewer=reviewers[1].email(), assigned_on='2017-01-01',
270+
state_id='accepted', review_request__team=team)
268271
# Rejected assignment, should not affect reviewer 2's position
269-
ReviewAssignmentFactory(reviewer=reviewers[2].email(), state_id='rejected',
270-
review_request__team=team)
271-
# Completed assignment, assigned before reviewer 1,
272+
ReviewAssignmentFactory(reviewer=reviewers[2].email(), assigned_on='2020-01-01',
273+
state_id='rejected', review_request__team=team)
274+
# Completed assignments, assigned before the most recent assignment of reviewer 1,
272275
# but completed after (assign date should count).
273276
ReviewAssignmentFactory(reviewer=reviewers[0].email(), assigned_on='2018-01-01',
274277
completed_on='2020-01-01', state_id='completed',
275278
review_request__team=team)
279+
ReviewAssignmentFactory(reviewer=reviewers[0].email(), assigned_on='2018-05-01',
280+
completed_on='2020-01-01', state_id='completed',
281+
review_request__team=team)
276282
rotation = policy.default_reviewer_rotation_list()
277283
self.assertNotIn(unavailable_reviewer, rotation)
278284
self.assertEqual(rotation, [reviewers[2], reviewers[3], reviewers[4], reviewers[0], reviewers[1]])
279285

280286
def test_return_reviewer_to_top_rotation(self):
287+
# Should do nothing, this is implicit in this policy, no state change is needed.
281288
team = ReviewTeamFactory(acronym="rotationteam", name="Review Team",
282289
list_email="rotationteam@ietf.org",
283290
parent=Group.objects.get(acronym="farfut"))

0 commit comments

Comments
 (0)