Skip to content

Commit 4b98743

Browse files
committed
Fix a missing HttpResponseForbidden in review statistics, make the
review test code use a separate reviewer and reviewsecretary user to avoid confounding things - also let these use Unicode in their names to check for Unicode trouble. - Legacy-Id: 12175
1 parent 95bbabf commit 4b98743

6 files changed

Lines changed: 94 additions & 71 deletions

File tree

ietf/doc/tests_review.py

Lines changed: 39 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ def test_request_review(self):
6262
"team": review_team.pk,
6363
"deadline": deadline.isoformat(),
6464
"requested_rev": "01",
65-
"requested_by": Person.objects.get(user__username="plain").pk,
65+
"requested_by": Person.objects.get(user__username="reviewsecretary").pk,
6666
})
6767
self.assertEqual(r.status_code, 302)
6868

@@ -112,14 +112,14 @@ def test_close_request(self):
112112

113113
# follow link
114114
req_url = urlreverse('ietf.doc.views_review.review_request', kwargs={ "name": doc.name, "request_id": review_req.pk })
115-
self.client.login(username="secretary", password="secretary+password")
115+
self.client.login(username="reviewsecretary", password="reviewsecretary+password")
116116
r = self.client.get(req_url)
117117
self.assertEqual(r.status_code, 200)
118118
self.assertTrue(close_url in unicontent(r))
119119
self.client.logout()
120120

121121
# get close page
122-
login_testing_unauthorized(self, "secretary", close_url)
122+
login_testing_unauthorized(self, "reviewsecretary", close_url)
123123
r = self.client.get(close_url)
124124
self.assertEqual(r.status_code, 200)
125125

@@ -134,7 +134,7 @@ def test_close_request(self):
134134
self.assertEqual(e.type, "closed_review_request")
135135
self.assertTrue("closed" in e.desc.lower())
136136
self.assertEqual(len(outbox), 1)
137-
self.assertTrue("closed" in unicode(outbox[0]).lower())
137+
self.assertTrue("closed" in outbox[0].get_payload(decode=True).decode("utf-8").lower())
138138

139139
def test_possibly_advance_next_reviewer_for_team(self):
140140
doc = make_test_data()
@@ -225,21 +225,21 @@ def get_skip_next(person):
225225
def test_assign_reviewer(self):
226226
doc = make_test_data()
227227

228+
# review to assign to
229+
review_req = make_review_data(doc)
230+
review_req.state = ReviewRequestStateName.objects.get(slug="requested")
231+
review_req.reviewer = None
232+
review_req.save()
233+
228234
# set up some reviewer-suitability factors
229-
plain_email = Email.objects.filter(person__user__username="plain").first()
235+
reviewer_email = Email.objects.get(person__user__username="reviewer")
230236
DocumentAuthor.objects.create(
231-
author=plain_email,
237+
author=reviewer_email,
232238
document=doc,
233239
)
234240
doc.rev = "10"
235241
doc.save_with_history([DocEvent.objects.create(doc=doc, type="changed_document", by=Person.objects.get(user__username="secretary"), desc="Test")])
236242

237-
# review to assign to
238-
review_req = make_review_data(doc)
239-
review_req.state = ReviewRequestStateName.objects.get(slug="requested")
240-
review_req.reviewer = None
241-
review_req.save()
242-
243243
# previous review
244244
ReviewRequest.objects.create(
245245
time=datetime.datetime.now() - datetime.timedelta(days=100),
@@ -250,55 +250,55 @@ def test_assign_reviewer(self):
250250
state=ReviewRequestStateName.objects.get(slug="completed"),
251251
reviewed_rev="01",
252252
deadline=datetime.date.today() - datetime.timedelta(days=80),
253-
reviewer=plain_email,
253+
reviewer=reviewer_email,
254254
)
255255

256-
reviewer_settings = ReviewerSettings.objects.get(person__email=plain_email, team=review_req.team)
256+
reviewer_settings = ReviewerSettings.objects.get(person__email=reviewer_email, team=review_req.team)
257257
reviewer_settings.filter_re = doc.name
258258
reviewer_settings.skip_next = 1
259259
reviewer_settings.save()
260260

261261
UnavailablePeriod.objects.create(
262262
team=review_req.team,
263-
person=plain_email.person,
263+
person=reviewer_email.person,
264264
start_date=datetime.date.today() - datetime.timedelta(days=10),
265265
availability="unavailable",
266266
)
267267

268-
ReviewWish.objects.create(person=plain_email.person, team=review_req.team, doc=doc)
268+
ReviewWish.objects.create(person=reviewer_email.person, team=review_req.team, doc=doc)
269269

270270
# pick a non-existing reviewer as next to see that we can
271271
# handle reviewers who have left
272272
NextReviewerInTeam.objects.filter(team=review_req.team).delete()
273273
NextReviewerInTeam.objects.create(
274274
team=review_req.team,
275-
next_reviewer=Person.objects.exclude(pk=plain_email.person_id).first(),
275+
next_reviewer=Person.objects.exclude(pk=reviewer_email.person_id).first(),
276276
)
277277

278278
assign_url = urlreverse('ietf.doc.views_review.assign_reviewer', kwargs={ "name": doc.name, "request_id": review_req.pk })
279279

280280

281281
# follow link
282282
req_url = urlreverse('ietf.doc.views_review.review_request', kwargs={ "name": doc.name, "request_id": review_req.pk })
283-
self.client.login(username="secretary", password="secretary+password")
283+
self.client.login(username="reviewsecretary", password="reviewsecretary+password")
284284
r = self.client.get(req_url)
285285
self.assertEqual(r.status_code, 200)
286286
self.assertTrue(assign_url in unicontent(r))
287287
self.client.logout()
288288

289289
# get assign page
290-
login_testing_unauthorized(self, "secretary", assign_url)
290+
login_testing_unauthorized(self, "reviewsecretary", assign_url)
291291
r = self.client.get(assign_url)
292292
self.assertEqual(r.status_code, 200)
293293
q = PyQuery(r.content)
294-
plain_label = q("option[value=\"{}\"]".format(plain_email.address)).text().lower()
295-
self.assertIn("reviewed document before", plain_label)
296-
self.assertIn("wishes to review", plain_label)
297-
self.assertIn("is author", plain_label)
298-
self.assertIn("regexp matches", plain_label)
299-
self.assertIn("unavailable indefinitely", plain_label)
300-
self.assertIn("skip next 1", plain_label)
301-
self.assertIn("#1", plain_label)
294+
reviewer_label = q("option[value=\"{}\"]".format(reviewer_email.address)).text().lower()
295+
self.assertIn("reviewed document before", reviewer_label)
296+
self.assertIn("wishes to review", reviewer_label)
297+
self.assertIn("is author", reviewer_label)
298+
self.assertIn("regexp matches", reviewer_label)
299+
self.assertIn("unavailable indefinitely", reviewer_label)
300+
self.assertIn("skip next 1", reviewer_label)
301+
self.assertIn("#1", reviewer_label)
302302

303303
# assign
304304
empty_outbox()
@@ -311,7 +311,7 @@ def test_assign_reviewer(self):
311311
self.assertEqual(review_req.state_id, "requested")
312312
self.assertEqual(review_req.reviewer, reviewer)
313313
self.assertEqual(len(outbox), 1)
314-
self.assertTrue("assigned" in unicode(outbox[0]))
314+
self.assertTrue("assigned" in outbox[0].get_payload(decode=True).decode("utf-8"))
315315
self.assertEqual(NextReviewerInTeam.objects.get(team=review_req.team).next_reviewer, rotation_list[1])
316316

317317
# re-assign
@@ -326,8 +326,8 @@ def test_assign_reviewer(self):
326326
self.assertEqual(review_req.state_id, "requested") # check that state is reset
327327
self.assertEqual(review_req.reviewer, reviewer)
328328
self.assertEqual(len(outbox), 2)
329-
self.assertTrue("cancelled your assignment" in unicode(outbox[0]))
330-
self.assertTrue("assigned" in unicode(outbox[1]))
329+
self.assertTrue("cancelled your assignment" in outbox[0].get_payload(decode=True).decode("utf-8"))
330+
self.assertTrue("assigned" in outbox[1].get_payload(decode=True).decode("utf-8"))
331331

332332
def test_accept_reviewer_assignment(self):
333333
doc = make_test_data()
@@ -361,14 +361,14 @@ def test_reject_reviewer_assignment(self):
361361

362362
# follow link
363363
req_url = urlreverse('ietf.doc.views_review.review_request', kwargs={ "name": doc.name, "request_id": review_req.pk })
364-
self.client.login(username="secretary", password="secretary+password")
364+
self.client.login(username="reviewsecretary", password="reviewsecretary+password")
365365
r = self.client.get(req_url)
366366
self.assertEqual(r.status_code, 200)
367367
self.assertTrue(reject_url in unicontent(r))
368368
self.client.logout()
369369

370370
# get reject page
371-
login_testing_unauthorized(self, "secretary", reject_url)
371+
login_testing_unauthorized(self, "reviewsecretary", reject_url)
372372
r = self.client.get(reject_url)
373373
self.assertEqual(r.status_code, 200)
374374
self.assertTrue(unicode(review_req.reviewer.person) in unicontent(r))
@@ -385,7 +385,7 @@ def test_reject_reviewer_assignment(self):
385385
self.assertTrue("rejected" in e.desc)
386386
self.assertEqual(ReviewRequest.objects.filter(doc=review_req.doc, team=review_req.team, state="requested").count(), 1)
387387
self.assertEqual(len(outbox), 1)
388-
self.assertTrue("Test message" in unicode(outbox[0]))
388+
self.assertTrue("Test message" in outbox[0].get_payload(decode=True).decode("utf-8"))
389389

390390
def make_test_mbox_tarball(self, review_req):
391391
mbox_path = os.path.join(self.review_dir, "testmbox.tar.gz")
@@ -444,7 +444,7 @@ def test_search_mail_archive(self):
444444
ietf.review.mailarch.construct_query_urls = lambda review_req, query=None: { "query_data_url": "file://" + os.path.abspath(mbox_path) }
445445

446446
url = urlreverse('ietf.doc.views_review.search_mail_archive', kwargs={ "name": doc.name, "request_id": review_req.pk })
447-
login_testing_unauthorized(self, "secretary", url)
447+
login_testing_unauthorized(self, "reviewsecretary", url)
448448

449449
r = self.client.get(url)
450450
self.assertEqual(r.status_code, 200)
@@ -534,7 +534,7 @@ def test_complete_review_upload_content(self):
534534

535535
self.assertEqual(len(outbox), 1)
536536
self.assertTrue(review_req.team.list_email in outbox[0]["To"])
537-
self.assertTrue("This is a review" in unicode(outbox[0]))
537+
self.assertTrue("This is a review" in outbox[0].get_payload(decode=True).decode("utf-8"))
538538

539539
self.assertTrue(settings.MAILING_LIST_ARCHIVE_URL in review_req.review.external_url)
540540

@@ -574,7 +574,7 @@ def test_complete_review_enter_content(self):
574574

575575
self.assertEqual(len(outbox), 1)
576576
self.assertTrue(review_req.team.list_email in outbox[0]["To"])
577-
self.assertTrue("This is a review" in unicode(outbox[0]))
577+
self.assertTrue("This is a review" in outbox[0].get_payload(decode=True).decode("utf-8"))
578578

579579
self.assertTrue(settings.MAILING_LIST_ARCHIVE_URL in review_req.review.external_url)
580580

@@ -628,13 +628,13 @@ def test_partially_complete_review(self):
628628
self.assertTrue(review_req.doc.rev in review_req.review.name)
629629

630630
self.assertEqual(len(outbox), 2)
631-
self.assertTrue("secretary" in outbox[0]["To"])
631+
self.assertTrue("reviewsecretary@example.com" in outbox[0]["To"])
632632
self.assertTrue("partially" in outbox[0]["Subject"].lower())
633-
self.assertTrue("new review request" in unicode(outbox[0]))
633+
self.assertTrue("new review request" in outbox[0].get_payload(decode=True).decode("utf-8"))
634634

635635
self.assertTrue(review_req.team.list_email in outbox[1]["To"])
636636
self.assertTrue("partial review" in outbox[1]["Subject"].lower())
637-
self.assertTrue("This is a review" in unicode(outbox[1]))
637+
self.assertTrue("This is a review" in outbox[1].get_payload(decode=True).decode("utf-8"))
638638

639639
first_review = review_req.review
640640
first_reviewer = review_req.reviewer

ietf/group/tests_review.py

Lines changed: 23 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ def test_reviewer_overview(self):
114114
deadline=datetime.date.today() + datetime.timedelta(days=30),
115115
state_id="accepted",
116116
reviewer=review_req1.reviewer,
117-
requested_by=Person.objects.get(user__username="plain"),
117+
requested_by=Person.objects.get(user__username="reviewer"),
118118
)
119119

120120
UnavailablePeriod.objects.create(
@@ -161,7 +161,7 @@ def test_manage_review_requests(self):
161161
deadline=datetime.date.today() + datetime.timedelta(days=30),
162162
state_id="accepted",
163163
reviewer=review_req1.reviewer,
164-
requested_by=Person.objects.get(user__username="plain"),
164+
requested_by=Person.objects.get(user__username="reviewer"),
165165
)
166166

167167
review_req3 = ReviewRequest.objects.create(
@@ -170,7 +170,7 @@ def test_manage_review_requests(self):
170170
type_id="early",
171171
deadline=datetime.date.today() + datetime.timedelta(days=30),
172172
state_id="requested",
173-
requested_by=Person.objects.get(user__username="plain"),
173+
requested_by=Person.objects.get(user__username="reviewer"),
174174
)
175175

176176
# previous reviews
@@ -290,17 +290,17 @@ def test_email_open_review_assignments(self):
290290
self.assertEqual(len(outbox), 1)
291291
self.assertTrue(group.list_email in outbox[0]["To"])
292292
self.assertEqual(outbox[0]["subject"], "Test subject")
293-
self.assertTrue("Test body" in unicode(outbox[0]))
293+
self.assertTrue("Test body" in outbox[0].get_payload(decode=True).decode("utf-8"))
294294

295295
def test_change_reviewer_settings(self):
296296
doc = make_test_data()
297297

298-
reviewer = Person.objects.get(name="Plain Man")
299-
300298
review_req = make_review_data(doc)
301-
review_req.reviewer = reviewer.email_set.first()
299+
review_req.reviewer = Email.objects.get(person__user__username="reviewer")
302300
review_req.save()
303-
301+
302+
reviewer = review_req.reviewer.person
303+
304304
url = urlreverse(ietf.group.views_review.change_reviewer_settings, kwargs={
305305
"acronym": review_req.team.acronym,
306306
"reviewer_email": review_req.reviewer_id,
@@ -335,8 +335,9 @@ def test_change_reviewer_settings(self):
335335
self.assertEqual(settings.remind_days_before_deadline, 6)
336336
self.assertEqual(len(outbox), 1)
337337
self.assertTrue("reviewer availability" in outbox[0]["subject"].lower())
338-
self.assertTrue("frequency changed", unicode(outbox[0]).lower())
339-
self.assertTrue("skip next", unicode(outbox[0]).lower())
338+
msg_content = outbox[0].get_payload(decode=True).decode("utf-8").lower()
339+
self.assertTrue("frequency changed", msg_content)
340+
self.assertTrue("skip next", msg_content)
340341

341342
# add unavailable period
342343
start_date = datetime.date.today() + datetime.timedelta(days=10)
@@ -352,8 +353,9 @@ def test_change_reviewer_settings(self):
352353
self.assertEqual(period.end_date, None)
353354
self.assertEqual(period.availability, "unavailable")
354355
self.assertEqual(len(outbox), 1)
355-
self.assertTrue(start_date.isoformat(), unicode(outbox[0]).lower())
356-
self.assertTrue("indefinite", unicode(outbox[0]).lower())
356+
msg_content = outbox[0].get_payload(decode=True).decode("utf-8").lower()
357+
self.assertTrue(start_date.isoformat(), msg_content)
358+
self.assertTrue("indefinite", msg_content)
357359

358360
# end unavailable period
359361
empty_outbox()
@@ -367,8 +369,9 @@ def test_change_reviewer_settings(self):
367369
period = reload_db_objects(period)
368370
self.assertEqual(period.end_date, end_date)
369371
self.assertEqual(len(outbox), 1)
370-
self.assertTrue(start_date.isoformat(), unicode(outbox[0]).lower())
371-
self.assertTrue("indefinite", unicode(outbox[0]).lower())
372+
msg_content = outbox[0].get_payload(decode=True).decode("utf-8").lower()
373+
self.assertTrue(start_date.isoformat(), msg_content)
374+
self.assertTrue("indefinite", msg_content)
372375

373376
# delete unavailable period
374377
empty_outbox()
@@ -379,16 +382,17 @@ def test_change_reviewer_settings(self):
379382
self.assertEqual(r.status_code, 302)
380383
self.assertEqual(UnavailablePeriod.objects.filter(person=reviewer, team=review_req.team, start_date=start_date).count(), 0)
381384
self.assertEqual(len(outbox), 1)
382-
self.assertTrue(start_date.isoformat(), unicode(outbox[0]).lower())
383-
self.assertTrue(end_date.isoformat(), unicode(outbox[0]).lower())
385+
msg_content = outbox[0].get_payload(decode=True).decode("utf-8").lower()
386+
self.assertTrue(start_date.isoformat(), msg_content)
387+
self.assertTrue(end_date.isoformat(), msg_content)
384388

385389
def test_reviewer_reminders(self):
386390
doc = make_test_data()
387391

388-
reviewer = Person.objects.get(name="Plain Man")
389-
390392
review_req = make_review_data(doc)
391393

394+
reviewer = Person.objects.get(user__username="reviewer")
395+
392396
settings = ReviewerSettings.objects.get(team=review_req.team, person=reviewer)
393397
settings.remind_days_before_deadline = 6
394398
settings.save()
@@ -411,4 +415,4 @@ def test_reviewer_reminders(self):
411415
empty_outbox()
412416
email_reviewer_reminder(review_req)
413417
self.assertEqual(len(outbox), 1)
414-
self.assertTrue(review_req.doc_id in unicode(outbox[0]))
418+
self.assertTrue(review_req.doc_id in outbox[0].get_payload(decode=True).decode("utf-8"))

ietf/ietfauth/tests.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -342,12 +342,12 @@ def test_reset_password(self):
342342
def test_review_overview(self):
343343
doc = make_test_data()
344344

345-
reviewer = Person.objects.get(name="Plain Man")
346-
347345
review_req = make_review_data(doc)
348-
review_req.reviewer = reviewer.email_set.first()
346+
review_req.reviewer = Email.objects.get(person__user__username="reviewer")
349347
review_req.save()
350-
348+
349+
reviewer = review_req.reviewer.person
350+
351351
UnavailablePeriod.objects.create(
352352
team=review_req.team,
353353
person=reviewer,

ietf/stats/tests.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,19 @@ def test_review_stats(self):
2121

2222
login_testing_unauthorized(self, "secretary", url)
2323

24+
completion_url = urlreverse(ietf.stats.views.review_stats, kwargs={ "stats_type": "completion" })
25+
2426
r = self.client.get(url)
2527
self.assertEqual(r.status_code, 302)
26-
self.assertTrue(urlreverse(ietf.stats.views.review_stats, kwargs={ "stats_type": "completion" }) in r["Location"])
28+
self.assertTrue(completion_url in r["Location"])
29+
30+
self.client.logout()
31+
self.client.login(username="plain", password="plain+password")
32+
r = self.client.get(completion_url)
33+
self.assertEqual(r.status_code, 403)
2734

2835
# check tabular
36+
self.client.login(username="secretary", password="secretary+password")
2937
for stats_type in ["completion", "results", "states"]:
3038
url = urlreverse(ietf.stats.views.review_stats, kwargs={ "stats_type": stats_type })
3139
r = self.client.get(url)

ietf/stats/views.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
from django.shortcuts import render
44
from django.contrib.auth.decorators import login_required
55
from django.core.urlresolvers import reverse as urlreverse
6-
from django.http import HttpResponseRedirect
6+
from django.http import HttpResponseRedirect, HttpResponseForbidden
77

88
import dateutil.relativedelta
99

@@ -134,6 +134,9 @@ def parse_date(s):
134134
if not r.group_id in secr_access:
135135
reviewer_only_access.add(r.group_id)
136136

137+
if not secr_access and not reviewer_only_access:
138+
return HttpResponseForbidden("You do not have the necessary permissions to view this page")
139+
137140
teams = [t for t in teams if t.pk in secr_access or t.pk in reviewer_only_access]
138141

139142
for t in reviewer_only_access:

0 commit comments

Comments
 (0)