Skip to content

Commit 3942f9a

Browse files
author
Sasha Romijn
committed
Fix ietf-tools#2590 - Allow secretary to adjust date when completing a review.
This also fixes other issues identified in ietf-tools#2590, around the modification of historical document events. The behaviour is now: - When the assigned reviewer posts a review, a single event is created, set to current date/time. - When the secretary records a review in the datatracker, they may set a different completion date, which is autofilled if an email is selected. One event is generated for the original completion date, and one for the secretary's action. - Each revision generates a new event, rather than updating previous existing events. - Legacy-Id: 16670
1 parent de9cde9 commit 3942f9a

2 files changed

Lines changed: 85 additions & 12 deletions

File tree

ietf/doc/tests_review.py

Lines changed: 57 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -688,13 +688,59 @@ def test_complete_review_enter_content(self):
688688
"review_content": "This is a review\nwith two lines",
689689
"review_url": "",
690690
"review_file": "",
691+
# Custom completion should be ignored - review posted by assignee is always set to now
692+
"completion_date": "2012-12-24",
693+
"completion_time": "12:13:14",
691694
})
692695
self.assertEqual(r.status_code, 302)
693696

694697
assignment = reload_db_objects(assignment)
695698
self.assertEqual(assignment.state_id, "completed")
696-
self.assertNotEqual(assignment.completed_on, None)
699+
# Completed time should be close to now, but will not be exactly, so check within 10s margin
700+
completed_time_diff = datetime.datetime.now() - assignment.completed_on
701+
self.assertLess(completed_time_diff, datetime.timedelta(seconds=10))
702+
703+
with io.open(os.path.join(self.review_subdir, assignment.review.name + ".txt")) as f:
704+
self.assertEqual(f.read(), "This is a review\nwith two lines")
705+
706+
self.assertEqual(len(outbox), 1)
707+
self.assertTrue(assignment.review_request.team.list_email in outbox[0]["To"])
708+
self.assertTrue("This is a review" in outbox[0].get_payload(decode=True).decode("utf-8"))
709+
710+
self.assertTrue(settings.MAILING_LIST_ARCHIVE_URL in assignment.review.external_url)
711+
712+
def test_complete_review_enter_content_by_secretary(self):
713+
assignment, url = self.setup_complete_review_test()
714+
login_testing_unauthorized(self, 'reviewsecretary', url)
715+
716+
empty_outbox()
697717

718+
r = self.client.post(url, data={
719+
"result": ReviewResultName.objects.get(reviewteamsettings_review_results_set__group=assignment.review_request.team, slug="ready").pk,
720+
"state": ReviewAssignmentStateName.objects.get(slug="completed").pk,
721+
"reviewed_rev": assignment.review_request.doc.rev,
722+
"review_submission": "enter",
723+
"review_content": "This is a review\nwith two lines",
724+
"review_url": "",
725+
"review_file": "",
726+
"completion_date": "2012-12-24",
727+
"completion_time": "12:13:14",
728+
})
729+
self.assertEqual(r.status_code, 302)
730+
731+
# The secretary is allowed to set a custom completion date (#2590)
732+
assignment = reload_db_objects(assignment)
733+
self.assertEqual(assignment.state_id, "completed")
734+
self.assertEqual(assignment.completed_on, datetime.datetime(2012, 12, 24, 12, 13, 14))
735+
736+
# There should be two events:
737+
# - the event logging when the change when it was entered, i.e. very close to now.
738+
# - the completion of the review, set to the provided date/time
739+
events = ReviewAssignmentDocEvent.objects.filter(doc=assignment.review_request.doc).order_by('-time')
740+
event0_time_diff = datetime.datetime.now() - events[0].time
741+
self.assertLess(event0_time_diff, datetime.timedelta(seconds=10))
742+
self.assertEqual(events[1].time, datetime.datetime(2012, 12, 24, 12, 13, 14))
743+
698744
with io.open(os.path.join(self.review_subdir, assignment.review.name + ".txt")) as f:
699745
self.assertEqual(f.read(), "This is a review\nwith two lines")
700746

@@ -879,8 +925,11 @@ def test_revise_review_enter_content(self):
879925

880926
assignment = reload_db_objects(assignment)
881927
self.assertEqual(assignment.state_id, "completed")
882-
event = ReviewAssignmentDocEvent.objects.get(type="closed_review_assignment", review_assignment=assignment)
883-
self.assertEqual(event.time, datetime.datetime(2012, 12, 24, 12, 13, 14))
928+
# The revision event time should be the date the revision was submitted, i.e. not backdated
929+
event1 = assignment.review_request.doc.latest_event(ReviewAssignmentDocEvent)
930+
event_time_diff = datetime.datetime.now() - event1.time
931+
self.assertLess(event_time_diff, datetime.timedelta(seconds=10))
932+
self.assertTrue('revised' in event1.desc.lower())
884933

885934
with io.open(os.path.join(self.review_subdir, assignment.review.name + ".txt")) as f:
886935
self.assertEqual(f.read(), "This is a review\nwith two lines")
@@ -904,8 +953,11 @@ def test_revise_review_enter_content(self):
904953

905954
assignment = reload_db_objects(assignment)
906955
self.assertEqual(assignment.review.rev, "01")
907-
event = ReviewAssignmentDocEvent.objects.get(type="closed_review_assignment", review_assignment=assignment)
908-
self.assertEqual(event.time, datetime.datetime(2013, 12, 24, 11, 11, 11))
956+
event2 = assignment.review_request.doc.latest_event(ReviewAssignmentDocEvent)
957+
event_time_diff = datetime.datetime.now() - event2.time
958+
self.assertLess(event_time_diff, datetime.timedelta(seconds=10))
959+
# Ensure that a new event was created for the new revision (#2590)
960+
self.assertNotEqual(event1.id, event2.id)
909961

910962
self.assertEqual(len(outbox), 0)
911963

ietf/doc/views_review.py

Lines changed: 28 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -520,7 +520,7 @@ def format_submission_choice(label):
520520

521521
if revising_review:
522522
del self.fields["cc"]
523-
else:
523+
elif is_reviewer:
524524
del self.fields["completion_date"]
525525
del self.fields["completion_time"]
526526

@@ -647,6 +647,7 @@ def complete_review(request, name, assignment_id):
647647

648648
need_to_email_review = review_submission != "link" and assignment.review_request.team.list_email and not revising_review
649649

650+
submitted_on_different_date = completion_datetime.date() != datetime.date.today()
650651
desc = "Request for {} review by {} {}: {}. Reviewer: {}.".format(
651652
assignment.review_request.type.name,
652653
assignment.review_request.team.acronym.upper(),
@@ -656,18 +657,38 @@ def complete_review(request, name, assignment_id):
656657
)
657658
if need_to_email_review:
658659
desc += " " + "Sent review to list."
659-
660-
close_event = ReviewAssignmentDocEvent.objects.filter(type="closed_review_assignment", review_assignment=assignment).first()
661-
if not close_event:
662-
close_event = ReviewAssignmentDocEvent(type="closed_review_assignment", review_assignment=assignment)
663-
660+
if revising_review:
661+
desc += " Review has been revised by {}.".format(request.user.person)
662+
elif submitted_on_different_date:
663+
desc += " Submission of review completed at an earlier date."
664+
close_event = ReviewAssignmentDocEvent(type="closed_review_assignment", review_assignment=assignment)
664665
close_event.doc = assignment.review_request.doc
665666
close_event.rev = assignment.review_request.doc.rev
666667
close_event.by = request.user.person
667668
close_event.desc = desc
668669
close_event.state = assignment.state
669-
close_event.time = completion_datetime
670+
close_event.time = datetime.datetime.now()
670671
close_event.save()
672+
673+
# If the completion date is different, record when the initial review was made too.
674+
if not revising_review and submitted_on_different_date:
675+
desc = "Request for {} review by {} {}: {}. Reviewer: {}.".format(
676+
assignment.review_request.type.name,
677+
assignment.review_request.team.acronym.upper(),
678+
assignment.state.name,
679+
assignment.result.name,
680+
assignment.reviewer.person,
681+
)
682+
683+
initial_close_event = ReviewAssignmentDocEvent(type="closed_review_assignment",
684+
review_assignment=assignment)
685+
initial_close_event.doc = assignment.review_request.doc
686+
initial_close_event.rev = assignment.review_request.doc.rev
687+
initial_close_event.by = request.user.person
688+
initial_close_event.desc = desc
689+
initial_close_event.state = assignment.state
690+
initial_close_event.time = completion_datetime
691+
initial_close_event.save()
671692

672693
if assignment.state_id == "part-completed" and not revising_review:
673694
existing_assignments = ReviewAssignment.objects.filter(review_request__doc=assignment.review_request.doc, review_request__team=assignment.review_request.team, state__in=("assigned", "accepted", "completed"))

0 commit comments

Comments
 (0)