Skip to content

Commit b5a31c3

Browse files
author
Sasha Romijn
committed
Update some terminology and docstrings.
- Legacy-Id: 16983
1 parent e518824 commit b5a31c3

8 files changed

Lines changed: 57 additions & 24 deletions

File tree

ietf/doc/tests_review.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@
3333
from ietf.review.factories import ReviewRequestFactory, ReviewAssignmentFactory
3434
from ietf.review.models import (ReviewRequest, ReviewerSettings,
3535
ReviewWish, UnavailablePeriod, NextReviewerInTeam)
36-
from ietf.review.policies import policy_for_team
36+
from ietf.review.policies import get_reviewer_queue_policy
3737

3838
from ietf.utils.test_utils import TestCase
3939
from ietf.utils.test_utils import login_testing_unauthorized, reload_db_objects
@@ -325,7 +325,7 @@ def test_assign_reviewer(self):
325325

326326
# assign
327327
empty_outbox()
328-
rotation_list = policy_for_team(review_req.team).default_reviewer_rotation_list()
328+
rotation_list = get_reviewer_queue_policy(review_req.team).default_reviewer_rotation_list()
329329
reviewer = Email.objects.filter(role__name="reviewer", role__group=review_req.team, person=rotation_list[0]).first()
330330
r = self.client.post(assign_url, { "action": "assign", "reviewer": reviewer.pk })
331331
self.assertEqual(r.status_code, 302)

ietf/doc/views_review.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@
3333
from ietf.message.models import Message
3434
from ietf.message.utils import infer_message
3535
from ietf.person.fields import PersonEmailChoiceField, SearchablePersonField
36-
from ietf.review.policies import policy_for_team
36+
from ietf.review.policies import get_reviewer_queue_policy
3737
from ietf.review.utils import (active_review_teams, assign_review_request_to_reviewer,
3838
can_request_review_of_doc, can_manage_review_requests_for_team,
3939
email_review_assignment_change, email_review_request_change,
@@ -294,7 +294,7 @@ class AssignReviewerForm(forms.Form):
294294

295295
def __init__(self, review_req, *args, **kwargs):
296296
super(AssignReviewerForm, self).__init__(*args, **kwargs)
297-
policy_for_team(review_req.team).setup_reviewer_field(self.fields["reviewer"], review_req)
297+
get_reviewer_queue_policy(review_req.team).setup_reviewer_field(self.fields["reviewer"], review_req)
298298

299299

300300
@login_required

ietf/group/forms.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
from ietf.person.fields import SearchableEmailsField, PersonEmailChoiceField
2020
from ietf.person.models import Person
2121
from ietf.review.models import ReviewerSettings, UnavailablePeriod, ReviewSecretarySettings
22-
from ietf.review.policies import policy_for_team
22+
from ietf.review.policies import get_reviewer_queue_policy
2323
from ietf.review.utils import close_review_request_states
2424
from ietf.utils.textupload import get_cleaned_text_file_content
2525
from ietf.utils.text import strip_suffix
@@ -255,7 +255,7 @@ def __init__(self, review_req, *args, **kwargs):
255255

256256
self.fields["close"].widget.attrs["class"] = "form-control input-sm"
257257

258-
policy_for_team(review_req.team).setup_reviewer_field(self.fields["reviewer"], review_req)
258+
get_reviewer_queue_policy(review_req.team).setup_reviewer_field(self.fields["reviewer"], review_req)
259259
self.fields["reviewer"].widget.attrs["class"] = "form-control input-sm"
260260

261261
if self.is_bound:

ietf/group/tests_review.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212

1313
from django.urls import reverse as urlreverse
1414

15-
from ietf.review.policies import policy_for_team
15+
from ietf.review.policies import get_reviewer_queue_policy
1616
from ietf.utils.test_utils import login_testing_unauthorized, TestCase, reload_db_objects
1717
from ietf.doc.models import TelechatDocEvent
1818
from ietf.group.models import Role
@@ -655,7 +655,7 @@ def test_rotation_queue_update(self):
655655
secretary = RoleFactory.create(group=group,name_id='secr')
656656
docs = [DocumentFactory.create(type_id='draft',group=None) for i in range(4)]
657657
requests = [ReviewRequestFactory(team=group,doc=docs[i]) for i in range(4)]
658-
policy = policy_for_team(group)
658+
policy = get_reviewer_queue_policy(group)
659659
rot_list = policy.default_reviewer_rotation_list()
660660

661661
expected_ending_head_of_rotation = rot_list[3]

ietf/group/views.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@
9292
from ietf.name.models import GroupTypeName, StreamName
9393
from ietf.person.models import Email
9494
from ietf.review.models import ReviewRequest, ReviewAssignment, ReviewerSettings, ReviewSecretarySettings
95-
from ietf.review.policies import policy_for_team
95+
from ietf.review.policies import get_reviewer_queue_policy
9696
from ietf.review.utils import (can_manage_review_requests_for_team,
9797
can_access_review_stats_for_team,
9898

@@ -1391,7 +1391,7 @@ def reviewer_overview(request, acronym, group_type=None):
13911391

13921392
can_manage = can_manage_review_requests_for_team(request.user, group)
13931393

1394-
reviewers = policy_for_team(group).default_reviewer_rotation_list()
1394+
reviewers = get_reviewer_queue_policy(group).default_reviewer_rotation_list()
13951395

13961396
reviewer_settings = { s.person_id: s for s in ReviewerSettings.objects.filter(team=group) }
13971397
unavailable_periods = defaultdict(list)
@@ -1541,7 +1541,7 @@ def manage_review_requests(request, acronym, group_type=None, assignment_status=
15411541
# Make sure the any assignments to the person at the head
15421542
# of the rotation queue are processed first so that the queue
15431543
# rotates before any more assignments are processed
1544-
reviewer_policy = policy_for_team(group)
1544+
reviewer_policy = get_reviewer_queue_policy(group)
15451545
head_of_rotation = reviewer_policy.default_reviewer_rotation_list()[0]
15461546
while head_of_rotation in assignments_by_person:
15471547
for review_req in assignments_by_person[head_of_rotation]:
@@ -1661,7 +1661,7 @@ def should_be_replicated_in_last_call_section(r):
16611661

16621662
partial_msg = render_to_string(template.path, {
16631663
"review_assignments": review_assignments,
1664-
"rotation_list": policy_for_team(group).default_reviewer_rotation_list()[:10],
1664+
"rotation_list": get_reviewer_queue_policy(group).default_reviewer_rotation_list()[:10],
16651665
"group" : group,
16661666
})
16671667

ietf/review/policies.py

Lines changed: 41 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,19 @@
1616
get_default_filter_re,
1717
latest_review_assignments_for_reviewers)
1818

19+
"""
20+
This file contains policies regarding reviewer queues.
21+
The policies are documented in more detail on:
22+
https://trac.tools.ietf.org/tools/ietfdb/wiki/ReviewerQueuePolicy
23+
Terminology used here should match terminology used in that document.
24+
"""
1925

20-
def policy_for_team(team):
21-
return RotateWithSkipReviewerPolicy(team)
2226

27+
def get_reviewer_queue_policy(team):
28+
return RotateWithSkipReviewerQueuePolicy(team)
2329

24-
class AbstractReviewerPolicy:
30+
31+
class AbstractReviewerQueuePolicy:
2532
def __init__(self, team):
2633
self.team = team
2734

@@ -32,6 +39,12 @@ def default_reviewer_rotation_list(self, skip_unavailable=False, dont_skip=[]):
3239
"""
3340
raise NotImplementedError
3441

42+
def update_policy_state_for_assignment(self, assignee_person_id, add_skip=False):
43+
"""
44+
Update the internal state of a policy to reflect an assignment.
45+
"""
46+
raise NotImplementedError
47+
3548
# TODO : Change this field to deal with multiple already assigned reviewers???
3649
def setup_reviewer_field(self, field, review_req):
3750
"""
@@ -57,7 +70,7 @@ def _recommended_assignment_order(self, email_queryset, review_req):
5770
returning Email objects.
5871
"""
5972
if review_req.team != self.team:
60-
raise ValueError('Reviewer policy was passed review request belonging to different team.')
73+
raise ValueError('Reviewer queue policy was passed review request belonging to different team.')
6174
resolver = AssignmentOrderResolver(email_queryset, review_req, self.default_reviewer_rotation_list())
6275
return resolver.determine_ranking()
6376

@@ -90,7 +103,7 @@ def __init__(self, email_queryset, review_req, rotation_list):
90103
self._collect_context()
91104

92105
def _collect_context(self):
93-
# Collect all relevant data about this team, document and review request.
106+
"""Collect all relevant data about this team, document and review request."""
94107

95108
self.doc_aliases = DocAlias.objects.filter(docs=self.doc).values_list("name", flat=True)
96109

@@ -109,6 +122,10 @@ def _collect_context(self):
109122
self.assignment_data_for_reviewers = latest_review_assignments_for_reviewers(self.team)
110123

111124
def determine_ranking(self):
125+
"""
126+
Determine the ranking of reviewers.
127+
Returns a list of tuples, each tuple containing an Email pk and an explanation label.
128+
"""
112129
ranking = []
113130
for e in self.possible_emails:
114131
ranking.append(self._ranking_for_email(e))
@@ -118,6 +135,12 @@ def determine_ranking(self):
118135
return [(r["email"].pk, r["label"]) for r in ranking]
119136

120137
def _ranking_for_email(self, email):
138+
"""
139+
Determine the ranking for a specific Email.
140+
Returns a dict with an email object, the scores and an explanation label.
141+
The scores are a list of individual scores, i.e. they are prioritised, not
142+
cumulative.
143+
"""
121144
settings = self.reviewer_settings.get(email.person_id)
122145
scores = []
123146
explanations = []
@@ -183,6 +206,7 @@ def format_period(p):
183206
}
184207

185208
def _collect_reviewer_stats(self, email):
209+
"""Collect statistics on past reviews for a particular Email."""
186210
stats = []
187211
assignment_data = self.assignment_data_for_reviewers.get(email.person_id, [])
188212
currently_open = sum(1 for d in assignment_data if d.state in ["assigned", "accepted"])
@@ -206,8 +230,13 @@ def _collect_reviewer_stats(self, email):
206230
return stats
207231

208232
def _connections_with_doc(self, doc, person_ids):
233+
"""
234+
Collect any connections any Person in person_ids has with a document.
235+
Returns a dict containing Person IDs that have a connection as keys,
236+
values being an explanation string,
237+
"""
209238
connections = {}
210-
# examine the closest connections last to let them override
239+
# examine the closest connections last to let them override the label
211240
connections[doc.ad_id] = "is associated Area Director"
212241
for r in Role.objects.filter(group=doc.group_id,
213242
person__in=person_ids).select_related("name"):
@@ -221,6 +250,10 @@ def _connections_with_doc(self, doc, person_ids):
221250
return connections
222251

223252
def _persons_with_previous_review(self, review_req, possible_person_ids):
253+
"""
254+
Collect anyone in possible_person_ids that have reviewed the request before.
255+
Returns a set with Person IDs of anyone who has.
256+
"""
224257
has_reviewed_previous = ReviewRequest.objects.filter(
225258
doc=review_req.doc,
226259
reviewassignment__reviewer__person__in=possible_person_ids,
@@ -232,7 +265,7 @@ def _persons_with_previous_review(self, review_req, possible_person_ids):
232265
has_reviewed_previous = set(
233266
has_reviewed_previous.values_list("reviewassignment__reviewer__person", flat=True))
234267
return has_reviewed_previous
235-
268+
236269
def _reviewer_settings_for_person_ids(self, person_ids):
237270
reviewer_settings = {
238271
r.person_id: r
@@ -245,7 +278,7 @@ def _reviewer_settings_for_person_ids(self, person_ids):
245278
return reviewer_settings
246279

247280

248-
class RotateWithSkipReviewerPolicy(AbstractReviewerPolicy):
281+
class RotateWithSkipReviewerQueuePolicy(AbstractReviewerQueuePolicy):
249282

250283
def update_policy_state_for_assignment(self, assignee_person_id, add_skip=False):
251284
assert assignee_person_id is not None

ietf/review/test_policies.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
from ietf.review.factories import ReviewAssignmentFactory
99
from ietf.review.models import ReviewerSettings, NextReviewerInTeam, UnavailablePeriod, \
1010
ReviewRequest
11-
from ietf.review.policies import policy_for_team
11+
from ietf.review.policies import get_reviewer_queue_policy
1212
from ietf.utils.test_data import create_person
1313
from ietf.utils.test_utils import TestCase
1414

@@ -17,7 +17,7 @@ class RotateWithSkipReviewerPolicyTests(TestCase):
1717
def test_possibly_advance_next_reviewer_for_team(self):
1818

1919
team = ReviewTeamFactory(acronym="rotationteam", name="Review Team", list_email="rotationteam@ietf.org", parent=Group.objects.get(acronym="farfut"))
20-
policy = policy_for_team(team)
20+
policy = get_reviewer_queue_policy(team)
2121
doc = WgDraftFactory()
2222

2323
# make a bunch of reviewers

ietf/review/utils.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -380,8 +380,8 @@ def assign_review_request_to_reviewer(request, review_req, reviewer, add_skip=Fa
380380

381381
assignment = review_req.reviewassignment_set.create(state_id='assigned', reviewer = reviewer, assigned_on = datetime.datetime.now())
382382

383-
from ietf.review.policies import policy_for_team
384-
policy_for_team(review_req.team).update_policy_state_for_assignment(reviewer.person_id, add_skip)
383+
from ietf.review.policies import get_reviewer_queue_policy
384+
get_reviewer_queue_policy(review_req.team).update_policy_state_for_assignment(reviewer.person_id, add_skip)
385385

386386
ReviewRequestDocEvent.objects.create(
387387
type="assigned_review_request",

0 commit comments

Comments
 (0)