diff --git a/ietf/review/models.py b/ietf/review/models.py index 95d89a740..a33bda065 100644 --- a/ietf/review/models.py +++ b/ietf/review/models.py @@ -8,6 +8,8 @@ from simple_history.models import HistoricalRecords from django.db import models +import debug # pyflakes:ignore + from ietf.doc.models import Document from ietf.group.models import Group from ietf.person.models import Person, Email @@ -152,6 +154,12 @@ class ReviewAssignment(models.Model): result = ForeignKey(ReviewResultName, blank=True, null=True) mailarch_url = models.URLField(blank=True, null = True) + _original_state = None + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self._original_state = self.state_id + def __str__(self): return "Assignment for %s (%s) : %s %s of %s" % (self.reviewer.person, self.state, self.review_request.team.acronym, self.review_request.type, self.review_request.doc) @@ -161,13 +169,15 @@ class ReviewAssignment(models.Model): If the review request has no other active or completed reviews, the review request needs to be treated as an unassigned request, as it will need a new reviewer. """ - super(ReviewAssignment, self).save(*args, **kwargs) - active_states = ['assigned', 'accepted', 'completed'] - review_req_has_active_assignments = self.review_request.reviewassignment_set.filter(state__in=active_states) - if self.review_request.state_id == 'assigned' and not review_req_has_active_assignments: - self.review_request.state_id = 'requested' - self.review_request.save() - + super().save(*args, **kwargs) + if self._original_state != self.state_id: + if self.state_id in ['withdrawn', 'rejected', 'no-response', 'overtaken']: + active_req_states = ['assigned', 'accepted', 'completed'] + review_req_has_active_assignments = self.review_request.reviewassignment_set.filter(state__in=active_req_states) + if self.review_request.state_id == 'assigned' and not review_req_has_active_assignments: + self.review_request.state_id = 'requested' + self.review_request.save() + self._original_state = self.state_id def get_default_review_types(): return ReviewTypeName.objects.filter(slug__in=['early','lc','telechat']) diff --git a/ietf/review/tests.py b/ietf/review/tests.py index bb8cea89e..a1cd017e7 100644 --- a/ietf/review/tests.py +++ b/ietf/review/tests.py @@ -24,15 +24,23 @@ class HashTest(TestCase): class ReviewAssignmentTest(TestCase): - def test_update_review_req_status(self): + def do_test_update_review_req_status(self, assignment_state, expected_state): review_req = ReviewRequestFactory(state_id='assigned') ReviewAssignmentFactory(review_request=review_req, state_id='part-completed') assignment = ReviewAssignmentFactory(review_request=review_req) - assignment.state_id = 'no-response' + assignment.state_id = assignment_state assignment.save() review_req = reload_db_objects(review_req) - self.assertEqual(review_req.state_id, 'requested') + self.assertEqual(review_req.state_id, expected_state) + + def test_update_review_req_status(self): + # Test change + for assignment_state in ['no-response', 'rejected', 'withdrawn', 'overtaken']: + self.do_test_update_review_req_status(assignment_state, 'requested') + # Test no-change + for assignment_state in ['accepted', 'assigned', 'completed', 'part-completed', 'unknown', ]: + self.do_test_update_review_req_status('', 'assigned') def test_no_update_review_req_status_when_other_active_assignment(self): # If there is another still active assignment, do not update review_req state