Skip to content

Commit a32d00a

Browse files
committed
When removing reviewers from a review team, change the state of only that team's assignments. Check to make sure the person being removed doesn't have another reviewer Role (with a different Email) in the same team. Change the disposition of any assignments from that team for the removed reviewer to 'withdrawn' rather than 'rejected'. Fixes ietf-tools#3320. Commit ready for merge.
- Legacy-Id: 19151
1 parent 76a8a29 commit a32d00a

2 files changed

Lines changed: 59 additions & 29 deletions

File tree

ietf/group/tests_info.py

Lines changed: 44 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -762,11 +762,20 @@ def _test_field(group, field_name, field_content, prohibited_form_names):
762762

763763
def test_edit_reviewers(self):
764764
group=GroupFactory(type_id='review',parent=GroupFactory(type_id='area'))
765+
other_group=GroupFactory(type_id='review',parent=GroupFactory(type_id='area'))
765766
review_req = ReviewRequestFactory(team=group)
766-
ad_email = Email.objects.get(address='ad2@example.org')
767+
other_review_req = ReviewRequestFactory(team=other_group)
767768

768-
url = urlreverse('ietf.group.views.edit', kwargs=dict(group_type=group.type_id, acronym=group.acronym, action="edit"))
769-
login_testing_unauthorized(self, "secretary", url)
769+
# Set up a reviewer that has two email addresses
770+
reviewer = PersonFactory()
771+
EmailFactory(person=reviewer)
772+
first_email = reviewer.email_set.first()
773+
last_email = reviewer.email_set.last()
774+
775+
RoleFactory(group=other_group, name_id='reviewer', person=reviewer, email=first_email)
776+
777+
url = urlreverse('ietf.group.views.edit', kwargs=dict(group_type=group.type_id, acronym=group.acronym, action='edit'))
778+
login_testing_unauthorized(self, 'secretary', url)
770779

771780
# normal get
772781
r = self.client.get(url)
@@ -780,33 +789,36 @@ def test_edit_reviewers(self):
780789
name=group.name,
781790
acronym=group.acronym,
782791
parent=group.parent_id,
783-
ad=Person.objects.get(name="Areað Irector").pk,
792+
ad=Person.objects.get(name='Areað Irector').pk,
784793
state=group.state_id,
785794
list_email=group.list_email,
786795
list_subscribe=group.list_subscribe,
787796
list_archive=group.list_archive,
788-
urls=""
797+
urls=''
789798
)
790-
r = self.client.post(url, dict(post_data, reviewer_roles=ad_email.address))
799+
r = self.client.post(url, dict(post_data, reviewer_roles=first_email.address))
791800
self.assertEqual(r.status_code, 302)
792801

793-
group = reload_db_objects(group)
794-
self.assertEqual(list(group.role_set.filter(name="reviewer").values_list("email", flat=True)), [ad_email.address])
802+
self.assertEqual(group.role_set.get(name='reviewer').email.address, first_email.address)
795803
self.assertTrue('Personnel change' in outbox[0]['Subject'])
796804

797-
# Assign a review to the reviewer, then remove the reviewer from the group
798-
# As the request deadline has not passed, the assignment should be set to rejected
799-
review_assignment = ReviewAssignmentFactory(review_request=review_req, state_id='assigned', reviewer=ad_email)
805+
# Assign reviews to the reviewer, then remove the reviewer from the group
806+
# As the request deadline has not passed, the assignment should be set to withdrawn
807+
# Reviews assigned to other groups must not be affected
808+
review_assignment = ReviewAssignmentFactory(review_request=review_req, state_id='assigned', reviewer=first_email)
809+
other_review_assignment = ReviewAssignmentFactory(review_request=other_review_req, state_id='assigned', reviewer=first_email)
800810
r = self.client.post(url, post_data)
801811
self.assertEqual(r.status_code, 302)
802812

803-
group = reload_db_objects(group)
804-
self.assertFalse(group.role_set.filter(name="reviewer"))
805-
review_assignment = reload_db_objects(review_assignment)
806-
self.assertEqual(review_assignment.state_id, 'rejected')
813+
self.assertFalse(group.role_set.filter(name='reviewer').exists())
814+
self.assertEqual(other_group.role_set.get(name='reviewer').email.address, first_email.address)
815+
816+
review_assignment, other_review_assignment = reload_db_objects(review_assignment, other_review_assignment)
817+
self.assertEqual(review_assignment.state_id, 'withdrawn')
818+
self.assertEqual(other_review_assignment.state_id, 'assigned')
807819

808820
# Repeat after adding reviewer again, but now beyond request deadline
809-
r = self.client.post(url, dict(post_data, reviewer_roles=ad_email.address))
821+
r = self.client.post(url, dict(post_data, reviewer_roles=first_email.address))
810822
self.assertEqual(r.status_code, 302)
811823
review_assignment.state_id = 'accepted'
812824
review_assignment.save()
@@ -816,8 +828,23 @@ def test_edit_reviewers(self):
816828
r = self.client.post(url, post_data)
817829
self.assertEqual(r.status_code, 302)
818830

819-
review_assignment = reload_db_objects(review_assignment)
831+
review_assignment, other_review_assignment = reload_db_objects(review_assignment, other_review_assignment)
820832
self.assertEqual(review_assignment.state_id, 'no-response')
833+
self.assertEqual(other_review_assignment.state_id, 'assigned')
834+
835+
# Configure group with two reviewer Roles for the same person with different email addresses
836+
# then remove one of the roles. The result should be no change to the review assignments
837+
group.role_set.filter(name_id='reviewer').delete()
838+
for email in reviewer.email_set.all():
839+
group.role_set.create(name_id='reviewer', person=reviewer, email=email)
840+
review_assignment.state_id = 'accepted'
841+
review_assignment.save()
842+
r = self.client.post(url, dict(post_data, reviewer_roles=last_email.address))
843+
self.assertEqual(group.role_set.get(name='reviewer').email.address, last_email.address)
844+
review_assignment, other_review_assignment = reload_db_objects(review_assignment, other_review_assignment)
845+
self.assertEqual(review_assignment.state_id, 'accepted')
846+
self.assertEqual(other_review_assignment.state_id, 'assigned')
847+
821848

822849
def test_conclude(self):
823850
group = GroupFactory(acronym="mars")

ietf/group/views.py

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -974,18 +974,21 @@ def diff(attr, name):
974974

975975
today = datetime.date.today()
976976
for deleted_email in deleted:
977-
active_assignments = ReviewAssignment.objects.filter(
978-
reviewer__person=deleted_email.person,
979-
state_id__in=['accepted', 'assigned'],
980-
)
981-
for assignment in active_assignments:
982-
if assignment.review_request.deadline > today:
983-
assignment.state_id = 'rejected'
984-
else:
985-
assignment.state_id = 'no-response'
986-
# save() will update review_request state to 'requested'
987-
# if needed, so that the review can be assigned to someone else
988-
assignment.save()
977+
# Verify the person doesn't have a separate reviewer role for the group with a different address
978+
if not group.role_set.filter(name_id='reviewer',person=deleted_email.person).exists():
979+
active_assignments = ReviewAssignment.objects.filter(
980+
review_request__team=group,
981+
reviewer__person=deleted_email.person,
982+
state_id__in=['accepted', 'assigned'],
983+
)
984+
for assignment in active_assignments:
985+
if assignment.review_request.deadline > today:
986+
assignment.state_id = 'withdrawn'
987+
else:
988+
assignment.state_id = 'no-response'
989+
# save() will update review_request state to 'requested'
990+
# if needed, so that the review can be assigned to someone else
991+
assignment.save()
989992

990993
changed_personnel.update(set(old)^set(new))
991994

0 commit comments

Comments
 (0)