Skip to content

Commit 632423a

Browse files
committed
Merged in [16670] from sasha@dashcare.nl:
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: 16791 Note: SVN reference [16670] has been migrated to Git commit 3942f9a
2 parents 24ede9a + 3942f9a commit 632423a

2 files changed

Lines changed: 88 additions & 15 deletions

File tree

ietf/doc/tests_review.py

Lines changed: 60 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -688,21 +688,67 @@ 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.assertIn(assignment.review_request.team.list_email, outbox[0]["To"])
708+
self.assertIn("This is a review", outbox[0].get_payload(decode=True).decode("utf-8"))
709+
710+
self.assertIn(settings.MAILING_LIST_ARCHIVE_URL, 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()
717+
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)
697730

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

701747
self.assertEqual(len(outbox), 1)
702-
self.assertTrue(assignment.review_request.team.list_email in outbox[0]["To"])
703-
self.assertTrue("This is a review" in outbox[0].get_payload(decode=True).decode("utf-8"))
748+
self.assertIn(assignment.review_request.team.list_email, outbox[0]["To"])
749+
self.assertIn("This is a review", outbox[0].get_payload(decode=True).decode("utf-8"))
704750

705-
self.assertTrue(settings.MAILING_LIST_ARCHIVE_URL in assignment.review.external_url)
751+
self.assertIn(settings.MAILING_LIST_ARCHIVE_URL, assignment.review.external_url)
706752

707753
def test_complete_notify_ad_because_team_settings(self):
708754
assignment, url = self.setup_complete_review_test()
@@ -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
@@ -522,7 +522,7 @@ def format_submission_choice(label):
522522

523523
if revising_review:
524524
del self.fields["cc"]
525-
else:
525+
elif is_reviewer:
526526
del self.fields["completion_date"]
527527
del self.fields["completion_time"]
528528

@@ -649,6 +649,7 @@ def complete_review(request, name, assignment_id):
649649

650650
need_to_email_review = review_submission != "link" and assignment.review_request.team.list_email and not revising_review
651651

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

674695
if assignment.state_id == "part-completed" and not revising_review:
675696
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)