Skip to content

Commit d0877a0

Browse files
committed
Change default of ReviewerSettings.min_interval to null - if it's not
specified for a reviewer, we don't take it into account - Legacy-Id: 12168
1 parent 78e4fa6 commit d0877a0

7 files changed

Lines changed: 43 additions & 35 deletions

File tree

ietf/doc/tests_review.py

Lines changed: 15 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,9 @@ def test_close_request(self):
136136
self.assertEqual(len(outbox), 1)
137137
self.assertTrue("closed" in unicode(outbox[0]).lower())
138138

139-
def make_data_for_rotation_tests(self, doc):
139+
def test_possibly_advance_next_reviewer_for_team(self):
140+
doc = make_test_data()
141+
140142
team = Group.objects.create(state_id="active", acronym="rotationteam", name="Review Team", type_id="dir",
141143
list_email="rotationteam@ietf.org", parent=Group.objects.get(acronym="farfut"))
142144

@@ -148,36 +150,29 @@ def make_data_for_rotation_tests(self, doc):
148150

149151
self.assertEqual(reviewers, reviewer_rotation_list(team))
150152

151-
return team, reviewers
152-
153-
def test_possibly_advance_next_reviewer_for_team(self):
154-
doc = make_test_data()
155-
156-
team, reviewers = self.make_data_for_rotation_tests(doc)
157-
158153
def get_skip_next(person):
159154
settings = (ReviewerSettings.objects.filter(team=team, person=person).first()
160155
or ReviewerSettings(team=team))
161156
return settings.skip_next
162157

163-
possibly_advance_next_reviewer_for_team(team, reviewers[0].pk)
158+
possibly_advance_next_reviewer_for_team(team, assigned_review_to_person_id=reviewers[0].pk)
164159
self.assertEqual(NextReviewerInTeam.objects.get(team=team).next_reviewer, reviewers[1])
165160
self.assertEqual(get_skip_next(reviewers[0]), 0)
166161
self.assertEqual(get_skip_next(reviewers[1]), 0)
167162

168-
possibly_advance_next_reviewer_for_team(team, reviewers[1].pk)
163+
possibly_advance_next_reviewer_for_team(team, assigned_review_to_person_id=reviewers[1].pk)
169164
self.assertEqual(NextReviewerInTeam.objects.get(team=team).next_reviewer, reviewers[2])
170165

171166
# skip reviewer 2
172-
possibly_advance_next_reviewer_for_team(team, reviewers[3].pk)
167+
possibly_advance_next_reviewer_for_team(team, assigned_review_to_person_id=reviewers[3].pk)
173168
self.assertEqual(NextReviewerInTeam.objects.get(team=team).next_reviewer, reviewers[2])
174169
self.assertEqual(get_skip_next(reviewers[0]), 0)
175170
self.assertEqual(get_skip_next(reviewers[1]), 0)
176171
self.assertEqual(get_skip_next(reviewers[2]), 0)
177172
self.assertEqual(get_skip_next(reviewers[3]), 1)
178173

179174
# pick reviewer 2, use up reviewer 3's skip_next
180-
possibly_advance_next_reviewer_for_team(team, reviewers[2].pk)
175+
possibly_advance_next_reviewer_for_team(team, assigned_review_to_person_id=reviewers[2].pk)
181176
self.assertEqual(NextReviewerInTeam.objects.get(team=team).next_reviewer, reviewers[4])
182177
self.assertEqual(get_skip_next(reviewers[0]), 0)
183178
self.assertEqual(get_skip_next(reviewers[1]), 0)
@@ -186,7 +181,7 @@ def get_skip_next(person):
186181
self.assertEqual(get_skip_next(reviewers[4]), 0)
187182

188183
# check wrap-around
189-
possibly_advance_next_reviewer_for_team(team, reviewers[4].pk)
184+
possibly_advance_next_reviewer_for_team(team, assigned_review_to_person_id=reviewers[4].pk)
190185
self.assertEqual(NextReviewerInTeam.objects.get(team=team).next_reviewer, reviewers[0])
191186
self.assertEqual(get_skip_next(reviewers[0]), 0)
192187
self.assertEqual(get_skip_next(reviewers[1]), 0)
@@ -197,7 +192,7 @@ def get_skip_next(person):
197192
# unavailable
198193
today = datetime.date.today()
199194
UnavailablePeriod.objects.create(team=team, person=reviewers[1], start_date=today, end_date=today, availability="unavailable")
200-
possibly_advance_next_reviewer_for_team(team, reviewers[0].pk)
195+
possibly_advance_next_reviewer_for_team(team, assigned_review_to_person_id=reviewers[0].pk)
201196
self.assertEqual(NextReviewerInTeam.objects.get(team=team).next_reviewer, reviewers[2])
202197
self.assertEqual(get_skip_next(reviewers[0]), 0)
203198
self.assertEqual(get_skip_next(reviewers[1]), 0)
@@ -206,17 +201,20 @@ def get_skip_next(person):
206201
self.assertEqual(get_skip_next(reviewers[4]), 0)
207202

208203
# pick unavailable anyway
209-
possibly_advance_next_reviewer_for_team(team, reviewers[1].pk)
204+
possibly_advance_next_reviewer_for_team(team, assigned_review_to_person_id=reviewers[1].pk)
210205
self.assertEqual(NextReviewerInTeam.objects.get(team=team).next_reviewer, reviewers[2])
211206
self.assertEqual(get_skip_next(reviewers[0]), 0)
212207
self.assertEqual(get_skip_next(reviewers[1]), 1)
213208
self.assertEqual(get_skip_next(reviewers[2]), 0)
214209
self.assertEqual(get_skip_next(reviewers[3]), 0)
215210
self.assertEqual(get_skip_next(reviewers[4]), 0)
216211

217-
# not through min_interval
212+
# not through min_interval so advance past reviewer[2]
213+
settings, _ = ReviewerSettings.objects.get_or_create(team=team, person=reviewers[2])
214+
settings.min_interval = 30
215+
settings.save()
218216
ReviewRequest.objects.create(team=team, doc=doc, type_id="early", state_id="accepted", deadline=today, requested_by=reviewers[0], reviewer=reviewers[2].email_set.first())
219-
possibly_advance_next_reviewer_for_team(team, reviewers[3].pk)
217+
possibly_advance_next_reviewer_for_team(team, assigned_review_to_person_id=reviewers[3].pk)
220218
self.assertEqual(NextReviewerInTeam.objects.get(team=team).next_reviewer, reviewers[4])
221219
self.assertEqual(get_skip_next(reviewers[0]), 0)
222220
self.assertEqual(get_skip_next(reviewers[1]), 1)

ietf/group/views_review.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -429,7 +429,7 @@ def change_reviewer_settings(request, acronym, reviewer_email, group_type=None):
429429

430430
changes = []
431431
if settings.get_min_interval_display() != prev_min_interval:
432-
changes.append("Frequency changed to \"{}\" from \"{}\".".format(settings.get_min_interval_display(), prev_min_interval))
432+
changes.append("Frequency changed to \"{}\" from \"{}\".".format(settings.get_min_interval_display() or "Not specified", prev_min_interval or "Not specified"))
433433
if settings.skip_next != prev_skip_next:
434434
changes.append("Skip next assignments changed to {} from {}.".format(settings.skip_next, prev_skip_next))
435435

ietf/review/import_from_review_tool.py

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -114,22 +114,23 @@ def parse_timestamp(t):
114114
if created:
115115
print "created role", unicode(role).encode("utf-8")
116116

117-
reviewer, created = ReviewerSettings.objects.get_or_create(
117+
reviewer_settings, created = ReviewerSettings.objects.get_or_create(
118118
team=team,
119119
person=email.person,
120120
)
121121
if created:
122-
print "created reviewer", reviewer.pk, unicode(reviewer).encode("utf-8")
122+
print "created reviewer settings", reviewer_settings.pk, unicode(reviewer_settings).encode("utf-8")
123123

124+
reviewer_settings.min_interval = None
124125
if autopolicy_days.get(row.autopolicy):
125-
reviewer.min_interval = autopolicy_days.get(row.autopolicy)
126+
reviewer_settings.min_interval = autopolicy_days.get(row.autopolicy)
126127

127-
reviewer.filter_re = row.donotassign
128+
reviewer_settings.filter_re = row.donotassign
128129
try:
129-
reviewer.skip_next = int(row.autopolicy)
130+
reviewer_settings.skip_next = int(row.autopolicy)
130131
except ValueError:
131132
pass
132-
reviewer.save()
133+
reviewer_settings.save()
133134

134135
unavailable_until = parse_timestamp(row.available)
135136
if unavailable_until:

ietf/review/models.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ class ReviewerSettings(models.Model):
2020
(61, "Once per two months"),
2121
(91, "Once per quarter"),
2222
]
23-
min_interval = models.IntegerField(default=30, verbose_name="Can review at most", choices=INTERVALS)
23+
min_interval = models.IntegerField(verbose_name="Can review at most", choices=INTERVALS, blank=True, null=True)
2424
filter_re = models.CharField(max_length=255, verbose_name="Filter regexp", blank=True, help_text="Draft names matching regular expression should not be assigned")
2525
skip_next = models.IntegerField(default=0, verbose_name="Skip next assignments")
2626
remind_days_before_deadline = models.IntegerField(null=True, blank=True, help_text="To get an email reminder in case you forget to do an assigned review, enter the number of days before a review deadline you want to receive it. Clear the field if you don't want a reminder.")

ietf/review/utils.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -110,33 +110,33 @@ def reviewer_rotation_list(team, skip_unavailable=False, dont_skip=[]):
110110

111111
days_needed_for_reviewers = days_needed_to_fulfill_min_interval_for_reviewers(team)
112112
for person_id, days_needed in days_needed_for_reviewers.iteritems():
113-
if days_needed > 0 and person_id not in dont_skip:
113+
if person_id not in dont_skip:
114114
reviewers_to_skip.add(person_id)
115115

116116
rotation_list = [p.pk for p in rotation_list if p.pk not in reviewers_to_skip]
117117

118118
return rotation_list
119119

120120
def days_needed_to_fulfill_min_interval_for_reviewers(team):
121-
"""Returns person_id -> days needed until min_interval is fulfilled for
122-
reviewer."""
121+
"""Returns person_id -> days needed until min_interval is fulfilled
122+
for reviewer (in case it is necessary to wait, otherwise reviewer
123+
is absent in result)."""
123124
latest_assignments = dict(ReviewRequest.objects.filter(
124125
team=team,
125126
).values_list("reviewer__person").annotate(Max("time")))
126127

127128
min_intervals = dict(ReviewerSettings.objects.filter(team=team).values_list("person_id", "min_interval"))
128129

129-
default_min_interval = ReviewerSettings(team=team).min_interval
130-
131130
now = datetime.datetime.now()
132131

133132
res = {}
134133
for person_id, latest_assignment_time in latest_assignments.iteritems():
135134
if latest_assignment_time is not None:
136-
min_interval = min_intervals.get(person_id, default_min_interval)
135+
min_interval = min_intervals.get(person_id)
136+
if min_interval is None:
137+
continue
137138

138139
days_needed = max(0, min_interval - (now - latest_assignment_time).days)
139-
140140
if days_needed > 0:
141141
res[person_id] = days_needed
142142

ietf/templates/group/reviewer_overview.html

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,17 @@ <h2>Reviewers</h2>
4141
</table>
4242
</td>
4343
<td>
44-
{{ person.settings.get_min_interval_display }} {% if person.settings.skip_next %}(skip: {{ person.settings.skip_next }}){% endif %}<br>
45-
{% if person.settings.filter_re %}Filter: <code title="{{ person.settings.filter_re }}">{{ person.settings.filter_re|truncatechars:15 }}</code><br>{% endif %}
44+
{% if person.settings.min_interval %}
45+
{{ person.settings.get_min_interval_display }}<br>
46+
{% endif %}
47+
48+
{% if person.settings.skip_next %}
49+
Skip: {{ person.settings.skip_next }}<br>
50+
{% endif %}
51+
52+
{% if person.settings.filter_re %}
53+
Filter: <code title="{{ person.settings.filter_re }}">{{ person.settings.filter_re|truncatechars:15 }}</code><br>
54+
{% endif %}
4655

4756
{% if person.unavailable_periods %}
4857
{% include "review/unavailable_table.html" with unavailable_periods=person.unavailable_periods %}

ietf/templates/ietfauth/review_overview.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,7 @@ <h2>Settings for {{ t }}</h2>
126126
<table class="table">
127127
<tr>
128128
<th>Can review</th>
129-
<td>{{ t.reviewer_settings.get_min_interval_display }}</td>
129+
<td>{{ t.reviewer_settings.get_min_interval_display|default:"No max frequency set" }}</td>
130130
</tr>
131131
<tr>
132132
<th>Skip next assignments</th>

0 commit comments

Comments
 (0)