Merged in [16819] from sasha@dashcare.nl:

Fix #2186 - Return review req to 'requested' status if no review assignments are open.
If a review assignment is rejected, withdrawn, marked no response, etc.,
and this leaves a review request without any assigned/accepted/completed
review assignments, return the request state to 'requested', which means
it will be shown as an unassigned review in all interfaces.
 - Legacy-Id: 16881
Note: SVN reference [16819] has been migrated to Git commit fdb4c2a055
This commit is contained in:
Henrik Levkowetz 2019-10-21 13:45:03 +00:00
commit 1656b0012c
3 changed files with 49 additions and 2 deletions

View file

@ -1290,7 +1290,7 @@ def get_open_review_requests_for_team(team, assignment_status=None):
Q(state_id='requested') | Q(state_id='assigned',reviewassignment__state__in=('assigned','accepted'))
).prefetch_related(
"type", "state", "doc", "doc__states",
).order_by("-time", "-id")
).order_by("-time", "-id").distinct()
if assignment_status == "unassigned":
open_review_requests = suggested_review_requests_for_team(team) + list(open_review_requests.filter(state_id='requested'))

View file

@ -158,6 +158,19 @@ class ReviewAssignment(models.Model):
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)
def save(self, *args, **kwargs):
"""
Save the assignment, and check whether the review request status needs to be updated.
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()
def get_default_review_types():
return ReviewTypeName.objects.filter(slug__in=['early','lc','telechat'])

View file

@ -4,7 +4,8 @@
from __future__ import absolute_import, print_function, unicode_literals
from ietf.utils.test_utils import TestCase
from ietf.review.factories import ReviewAssignmentFactory, ReviewRequestFactory
from ietf.utils.test_utils import TestCase, reload_db_objects
from .mailarch import hash_list_message_id
class HashTest(TestCase):
@ -23,3 +24,36 @@ class HashTest(TestCase):
):
self.assertEqual(hash, hash_list_message_id(list, msgid))
class ReviewAssignmentTest(TestCase):
def test_update_review_req_status(self):
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.save()
review_req = reload_db_objects(review_req)
self.assertEqual(review_req.state_id, 'requested')
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
review_req = ReviewRequestFactory(state_id='assigned')
ReviewAssignmentFactory(review_request=review_req, state_id='assigned')
assignment = ReviewAssignmentFactory(review_request=review_req)
assignment.state_id = 'no-response'
assignment.save()
review_req = reload_db_objects(review_req)
self.assertEqual(review_req.state_id, 'assigned')
def test_no_update_review_req_status_when_review_req_withdrawn(self):
# review_req state must only be changed to "requested", if old state was "assigned",
# to prevent reviving dead review requests
review_req = ReviewRequestFactory(state_id='withdrawn')
assignment = ReviewAssignmentFactory(review_request=review_req)
assignment.state_id = 'no-response'
assignment.save()
review_req = reload_db_objects(review_req)
self.assertEqual(review_req.state_id, 'withdrawn')