Skip to content

Commit e145832

Browse files
author
Sasha Romijn
committed
Fix ietf-tools#2185 - Close review assignments when reviewer is removed from team.
If a reviewer is removed from a team, any accepted or assigned review assignments are set to rejected if the request deadline has not passed, or set to no-response when the request deadline has passed. Per [16819], if this scenario happens, and there are no other active or completed review assignments, the request is shown as an unassigned review. Commit ready for merge. - Legacy-Id: 16850 Note: SVN reference [16819] has been migrated to Git commit fdb4c2a
1 parent fdb4c2a commit e145832

2 files changed

Lines changed: 57 additions & 15 deletions

File tree

ietf/group/tests_info.py

Lines changed: 41 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@
3636
from ietf.name.models import DocTagName, GroupStateName, GroupTypeName
3737
from ietf.person.models import Person, Email
3838
from ietf.person.factories import PersonFactory
39-
from ietf.review.factories import ReviewRequestFactory
39+
from ietf.review.factories import ReviewRequestFactory, ReviewAssignmentFactory
4040
from ietf.utils.mail import outbox, empty_outbox
4141
from ietf.utils.test_utils import login_testing_unauthorized, TestCase, unicontent, reload_db_objects
4242

@@ -666,7 +666,8 @@ def test_edit_field(self):
666666

667667
def test_edit_reviewers(self):
668668
group=GroupFactory(type_id='review',parent=GroupFactory(type_id='area'))
669-
ReviewRequestFactory(team=group)
669+
review_req = ReviewRequestFactory(team=group)
670+
ad_email = Email.objects.get(address='ad2@example.org')
670671

671672
url = urlreverse('ietf.group.views.edit', kwargs=dict(group_type=group.type_id, acronym=group.acronym, action="edit"))
672673
login_testing_unauthorized(self, "secretary", url)
@@ -679,23 +680,48 @@ def test_edit_reviewers(self):
679680

680681
# set reviewers
681682
empty_outbox()
682-
r = self.client.post(url,
683-
dict(name=group.name,
684-
acronym=group.acronym,
685-
parent=group.parent_id,
686-
ad=Person.objects.get(name="Areað Irector").pk,
687-
state=group.state_id,
688-
reviewer_roles="ad2@example.org",
689-
list_email=group.list_email,
690-
list_subscribe=group.list_subscribe,
691-
list_archive=group.list_archive,
692-
urls=""
693-
))
683+
post_data = dict(
684+
name=group.name,
685+
acronym=group.acronym,
686+
parent=group.parent_id,
687+
ad=Person.objects.get(name="Areað Irector").pk,
688+
state=group.state_id,
689+
list_email=group.list_email,
690+
list_subscribe=group.list_subscribe,
691+
list_archive=group.list_archive,
692+
urls=""
693+
)
694+
r = self.client.post(url, dict(post_data, reviewer_roles=ad_email.address))
694695
self.assertEqual(r.status_code, 302)
695696

696697
group = reload_db_objects(group)
697-
self.assertEqual(list(group.role_set.filter(name="reviewer").values_list("email", flat=True)), ["ad2@example.org"])
698+
self.assertEqual(list(group.role_set.filter(name="reviewer").values_list("email", flat=True)), [ad_email.address])
698699
self.assertTrue('Personnel change' in outbox[0]['Subject'])
700+
701+
# Assign a review to the reviewer, then remove the reviewer from the group
702+
# As the request deadline has not passed, the assignment should be set to rejected
703+
review_assignment = ReviewAssignmentFactory(review_request=review_req, state_id='assigned', reviewer=ad_email)
704+
r = self.client.post(url, post_data)
705+
self.assertEqual(r.status_code, 302)
706+
707+
group = reload_db_objects(group)
708+
self.assertFalse(group.role_set.filter(name="reviewer"))
709+
review_assignment = reload_db_objects(review_assignment)
710+
self.assertEqual(review_assignment.state_id, 'rejected')
711+
712+
# Repeat after adding reviewer again, but now beyond request deadline
713+
r = self.client.post(url, dict(post_data, reviewer_roles=ad_email.address))
714+
self.assertEqual(r.status_code, 302)
715+
review_assignment.state_id = 'accepted'
716+
review_assignment.save()
717+
review_req.deadline = datetime.date.today() - datetime.timedelta(days=1)
718+
review_req.save()
719+
720+
r = self.client.post(url, post_data)
721+
self.assertEqual(r.status_code, 302)
722+
723+
review_assignment = reload_db_objects(review_assignment)
724+
self.assertEqual(review_assignment.state_id, 'no-response')
699725

700726
def test_conclude(self):
701727
group = GroupFactory(acronym="mars")

ietf/group/views.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -972,6 +972,22 @@ def diff(attr, name):
972972
if deleted:
973973
change_text=title + ' deleted: ' + ", ".join(x.name_and_email() for x in deleted)
974974
personnel_change_text+=change_text+"\n"
975+
976+
today = datetime.date.today()
977+
for deleted_email in deleted:
978+
active_assignments = ReviewAssignment.objects.filter(
979+
reviewer__person=deleted_email.person,
980+
state_id__in=['accepted', 'assigned'],
981+
)
982+
for assignment in active_assignments:
983+
if assignment.review_request.deadline > today:
984+
assignment.state_id = 'rejected'
985+
else:
986+
assignment.state_id = 'no-response'
987+
# save() will update review_request state to 'requested'
988+
# if needed, so that the review can be assigned to someone else
989+
assignment.save()
990+
975991
changed_personnel.update(set(old)^set(new))
976992

977993
if personnel_change_text!="":

0 commit comments

Comments
 (0)