Skip to content

Commit 6da25e6

Browse files
committed
Add personal review overview page for reviewers, add page for editing
reviewer availability settings, emailing the reviewer/secretary as necessary, add tests for these pages. Fix a bunch of bugs. - Legacy-Id: 11998
1 parent 0a8f3db commit 6da25e6

26 files changed

Lines changed: 1021 additions & 91 deletions

ietf/doc/tests_review.py

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

1313
import debug # pyflakes:ignore
1414

15-
from ietf.review.models import ReviewRequest, ReviewTeamResult, ReviewerSettings
15+
from ietf.review.models import ReviewRequest, ReviewTeamResult, ReviewerSettings, ReviewWish, UnavailablePeriod
1616
import ietf.review.mailarch
1717
from ietf.person.models import Email, Person
1818
from ietf.name.models import ReviewResultName, ReviewRequestStateName, ReviewTypeName, DocRelationshipName
@@ -166,9 +166,17 @@ def test_assign_reviewer(self):
166166

167167
reviewer_settings = ReviewerSettings.objects.get(person__email=plain_email)
168168
reviewer_settings.filter_re = doc.name
169-
reviewer_settings.unavailable_until = datetime.datetime.now() + datetime.timedelta(days=10)
170169
reviewer_settings.save()
171170

171+
UnavailablePeriod.objects.create(
172+
team=review_req.team,
173+
person=plain_email.person,
174+
start_date=datetime.date.today() - datetime.timedelta(days=10),
175+
availability="unavailable",
176+
)
177+
178+
ReviewWish.objects.create(person=plain_email.person, team=review_req.team, doc=doc)
179+
172180
assign_url = urlreverse('ietf.doc.views_review.assign_reviewer', kwargs={ "name": doc.name, "request_id": review_req.pk })
173181

174182

@@ -188,9 +196,10 @@ def test_assign_reviewer(self):
188196
plain_label = q("option[value=\"{}\"]".format(plain_email.address)).text().lower()
189197
self.assertIn("ready for", plain_label)
190198
self.assertIn("reviewed document before", plain_label)
199+
self.assertIn("wishes to review", plain_label)
191200
self.assertIn("is author", plain_label)
192201
self.assertIn("regexp matches", plain_label)
193-
self.assertIn("unavailable until", plain_label)
202+
self.assertIn("unavailable", plain_label)
194203

195204
# assign
196205
empty_outbox()
@@ -422,6 +431,15 @@ def test_complete_review_upload_content(self):
422431

423432
self.assertTrue(settings.MAILING_LIST_ARCHIVE_URL in review_req.review.external_url)
424433

434+
# check the review document page
435+
url = urlreverse('doc_view', kwargs={ "name": review_req.review.name })
436+
r = self.client.get(url)
437+
self.assertEqual(r.status_code, 200)
438+
content = unicontent(r)
439+
self.assertTrue("{} Review".format(review_req.type.name) in content)
440+
self.assertTrue("This is a review" in content)
441+
442+
425443
def test_complete_review_enter_content(self):
426444
review_req, url = self.setup_complete_review_test()
427445

ietf/group/tests_review.py

Lines changed: 83 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,10 @@
66

77
from ietf.utils.test_data import make_test_data, make_review_data
88
from ietf.utils.test_utils import login_testing_unauthorized, TestCase, unicontent, reload_db_objects
9-
from ietf.review.models import ReviewRequest, ReviewRequestStateName
109
from ietf.doc.models import TelechatDocEvent
1110
from ietf.iesg.models import TelechatDate
1211
from ietf.person.models import Email, Person
12+
from ietf.review.models import ReviewRequest, ReviewRequestStateName, ReviewerSettings, UnavailablePeriod
1313
from ietf.review.utils import suggested_review_requests_for_team
1414
import ietf.group.views_review
1515
from ietf.utils.mail import outbox, empty_outbox
@@ -190,3 +190,85 @@ def test_email_open_review_assignments(self):
190190
self.assertEqual(outbox[0]["subject"], "Test subject")
191191
self.assertTrue("Test body" in unicode(outbox[0]))
192192

193+
def test_change_reviewer_settings(self):
194+
doc = make_test_data()
195+
196+
reviewer = Person.objects.get(name="Plain Man")
197+
198+
review_req = make_review_data(doc)
199+
review_req.reviewer = reviewer.email_set.first()
200+
review_req.save()
201+
202+
url = urlreverse(ietf.group.views_review.change_reviewer_settings, kwargs={
203+
"group_type": review_req.team.type_id,
204+
"acronym": review_req.team.acronym,
205+
"reviewer_email": review_req.reviewer_id,
206+
})
207+
208+
login_testing_unauthorized(self, reviewer.user.username, url)
209+
210+
# get
211+
r = self.client.get(url)
212+
self.assertEqual(r.status_code, 200)
213+
214+
# set settings
215+
empty_outbox()
216+
r = self.client.post(url, {
217+
"action": "change_settings",
218+
"min_interval": "7",
219+
"filter_re": "test-[regexp]",
220+
"skip_next": "2",
221+
})
222+
self.assertEqual(r.status_code, 302)
223+
settings = ReviewerSettings.objects.get(person=reviewer, team=review_req.team)
224+
self.assertEqual(settings.min_interval, 7)
225+
self.assertEqual(settings.filter_re, "test-[regexp]")
226+
self.assertEqual(settings.skip_next, 2)
227+
self.assertEqual(len(outbox), 1)
228+
self.assertTrue("reviewer availability" in outbox[0]["subject"].lower())
229+
self.assertTrue("frequency changed", unicode(outbox[0]).lower())
230+
self.assertTrue("skip next", unicode(outbox[0]).lower())
231+
232+
# add unavailable period
233+
start_date = datetime.date.today() + datetime.timedelta(days=10)
234+
empty_outbox()
235+
r = self.client.post(url, {
236+
"action": "add_period",
237+
'start_date': start_date.isoformat(),
238+
'end_date': "",
239+
'availability': "unavailable",
240+
})
241+
self.assertEqual(r.status_code, 302)
242+
period = UnavailablePeriod.objects.get(person=reviewer, team=review_req.team, start_date=start_date)
243+
self.assertEqual(period.end_date, None)
244+
self.assertEqual(period.availability, "unavailable")
245+
self.assertEqual(len(outbox), 1)
246+
self.assertTrue(start_date.isoformat(), unicode(outbox[0]).lower())
247+
self.assertTrue("indefinite", unicode(outbox[0]).lower())
248+
249+
# end unavailable period
250+
empty_outbox()
251+
end_date = start_date + datetime.timedelta(days=10)
252+
r = self.client.post(url, {
253+
"action": "end_period",
254+
'period_id': period.pk,
255+
'end_date': end_date.isoformat(),
256+
})
257+
self.assertEqual(r.status_code, 302)
258+
period = reload_db_objects(period)
259+
self.assertEqual(period.end_date, end_date)
260+
self.assertEqual(len(outbox), 1)
261+
self.assertTrue(start_date.isoformat(), unicode(outbox[0]).lower())
262+
self.assertTrue("indefinite", unicode(outbox[0]).lower())
263+
264+
# delete unavailable period
265+
empty_outbox()
266+
r = self.client.post(url, {
267+
"action": "delete_period",
268+
'period_id': period.pk,
269+
})
270+
self.assertEqual(r.status_code, 302)
271+
self.assertEqual(UnavailablePeriod.objects.filter(person=reviewer, team=review_req.team, start_date=start_date).count(), 0)
272+
self.assertEqual(len(outbox), 1)
273+
self.assertTrue(start_date.isoformat(), unicode(outbox[0]).lower())
274+
self.assertTrue(end_date.isoformat(), unicode(outbox[0]).lower())

ietf/group/urls_info.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
from django.views.generic import RedirectView
55
from django.conf import settings
66

7-
from ietf.group import views, views_edit, views_review
7+
from ietf.group import views, views_edit
88

99
urlpatterns = patterns('',
1010
(r'^$', views.active_groups),
@@ -21,7 +21,5 @@
2121
(r'^email-aliases/$', 'ietf.group.views.email_aliases'),
2222
(r'^bofs/create/$', views_edit.edit, {'action': "create", }, "bof_create"),
2323
(r'^photos/$', views.chair_photos),
24-
(r'^reviews/$', views.review_requests),
25-
(r'^reviews/manage/$', views_review.manage_review_requests),
2624
(r'^%(acronym)s/' % settings.URL_REGEXPS, include('ietf.group.urls_info_details')),
2725
)

ietf/group/urls_info_details.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,5 +33,7 @@
3333
(r'^reviews/$', views.review_requests),
3434
(r'^reviews/manage/$', views_review.manage_review_requests),
3535
(r'^reviews/email-assignments/$', views_review.email_open_review_assignments),
36+
(r'^reviewers/$', views_review.reviewer_overview),
37+
(r'^reviewers/(?P<reviewer_email>[\w%+-.@]+)/settings/$', views_review.change_reviewer_settings),
3638
url(r'^email-aliases/$', RedirectView.as_view(pattern_name='ietf.group.views.email',permanent=False),name='old_group_email_aliases'),
3739
)

ietf/group/views.py

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,9 @@
7070
from ietf.meeting.utils import group_sessions
7171
from ietf.meeting.helpers import get_meeting
7272
from ietf.review.models import ReviewRequest
73-
from ietf.review.utils import can_manage_review_requests_for_team, suggested_review_requests_for_team
73+
from ietf.review.utils import (can_manage_review_requests_for_team,
74+
suggested_review_requests_for_team,
75+
current_unavailable_periods_for_reviewers)
7476

7577
def roles(group, role_name):
7678
return Role.objects.filter(group=group, name=role_name).select_related("email", "person")
@@ -669,12 +671,17 @@ def review_requests(request, acronym, group_type=None):
669671
team=group, state__in=("requested", "accepted")
670672
).prefetch_related("reviewer", "type", "state").order_by("-time", "-id"))
671673

672-
open_review_requests += suggested_review_requests_for_team(group)
674+
unavailable_periods = current_unavailable_periods_for_reviewers(group)
675+
for review_req in open_review_requests:
676+
if review_req.reviewer:
677+
review_req.reviewer_unavailable = any(p.availability == "unavailable"
678+
for p in unavailable_periods.get(review_req.reviewer.person_id, []))
679+
680+
open_review_requests = suggested_review_requests_for_team(group) + open_review_requests
673681

674682
today = datetime.date.today()
675683
for r in open_review_requests:
676-
delta = today - r.deadline
677-
r.due = max(0, delta.days)
684+
r.due = max(0, (today - r.deadline).days)
678685

679686
closed_review_requests = ReviewRequest.objects.filter(
680687
team=group,

0 commit comments

Comments
 (0)