From 024fd8b1fa36358722388f3dc9ae1976dade8076 Mon Sep 17 00:00:00 2001
From: Erin Mullaney <erin.mullaney@torchbox.com>
Date: Tue, 12 Feb 2019 10:24:29 -0500
Subject: [PATCH] #957 WIP fixing role reviewer saves, with a TODO and a new
 test

---
 opentech/apply/funds/forms.py              |  5 +++--
 opentech/apply/funds/models/submissions.py |  4 ++--
 opentech/apply/funds/tests/test_views.py   | 16 ++++++++++++++++
 3 files changed, 21 insertions(+), 4 deletions(-)

diff --git a/opentech/apply/funds/forms.py b/opentech/apply/funds/forms.py
index f4f0e2f78..5cf6293f9 100644
--- a/opentech/apply/funds/forms.py
+++ b/opentech/apply/funds/forms.py
@@ -68,10 +68,9 @@ class UpdateReviewersForm(forms.ModelForm):
         self.request = kwargs.pop('request', None)
         super().__init__(*args, **kwargs)
 
-        # All submitted reviews by non-role reviewers
         self.submitted_reviewers = User.objects.filter(id__in=self.instance.reviews.values('author'))
         self.submitted_reviewers = self.submitted_reviewers.exclude(
-            id__in=AssignedReviewers.objects.role_reviewers_by_submission(self.instance).values('reviewer'))
+            id__in=self.instance.assigned.with_roles().values('reviewer'))
 
         if self.can_alter_external_reviewers(self.instance, self.user):
             reviewers = self.instance.reviewers.all()
@@ -154,6 +153,8 @@ class UpdateReviewersForm(forms.ModelForm):
         else:
             reviewers = instance.reviewers_not_reviewed
 
+        # TODO, if a reviewer is moved from a role assignment, but they have reviewed the submission
+        # they should keep a record in AssignedReviewers with role=None
         current_reviewers = set(reviewers | self.submitted_reviewers | assigned_staff)
 
         # Clear out old reviewers
diff --git a/opentech/apply/funds/models/submissions.py b/opentech/apply/funds/models/submissions.py
index 55c7a0030..345c9fba4 100644
--- a/opentech/apply/funds/models/submissions.py
+++ b/opentech/apply/funds/models/submissions.py
@@ -678,8 +678,8 @@ class ApplicationRevision(AccessFormData, models.Model):
 
 
 class AssignedReviewersQuerySet(models.QuerySet):
-    def role_reviewers_by_submission(self, submission):
-        return self.filter(role__isnull=False, submission=submission)
+    def with_roles(self):
+        return self.filter(role__isnull=False)
 
 
 class AssignedReviewers(models.Model):
diff --git a/opentech/apply/funds/tests/test_views.py b/opentech/apply/funds/tests/test_views.py
index dedcd1e4a..56fec895d 100644
--- a/opentech/apply/funds/tests/test_views.py
+++ b/opentech/apply/funds/tests/test_views.py
@@ -14,6 +14,7 @@ from opentech.apply.funds.tests.factories import (
     SealedRoundFactory,
     SealedSubmissionFactory,
 )
+from opentech.apply.review.tests.factories import ReviewFactory
 from opentech.apply.stream_forms.testing.factories import flatten_for_form
 from opentech.apply.users.tests.factories import (
     ReviewerFactory,
@@ -278,6 +279,21 @@ class TestReviewersUpdateView(BaseSubmissionViewTestCase):
 
         self.assertCountEqual(submission.reviewers.all(), self.reviewers)
 
+    def test_lead_can_change_role_reviewer_and_review_remains(self):
+        submission = ApplicationSubmissionFactory(lead=self.user)
+
+        self.post_form(submission, reviewer_roles=[self.staff[0]])
+        self.assertCountEqual(submission.reviewers.all(), [self.staff[0]])
+
+        # Add a review from that staff reviewer
+        review = ReviewFactory(submission=submission, author=self.staff[0])
+
+        # Assign a different reviewer to the same role
+        self.post_form(submission, reviewer_roles=[self.staff[1]])
+
+        # TODO: need to test that submission.assigned still contains self.staff[0]
+        # self.assertIn(self.staff[0], submission.reviewers.all())
+
 
 class TestApplicantSubmissionView(BaseSubmissionViewTestCase):
     user_factory = UserFactory
-- 
GitLab