From 9d3ee45bb35831a06959d86abb4a0c3a712461d7 Mon Sep 17 00:00:00 2001
From: Todd Dembrey <todd.dembrey@torchbox.com>
Date: Mon, 11 Feb 2019 07:20:26 +0000
Subject: [PATCH] GH-957: Create the objects in the correct location

---
 opentech/apply/funds/forms.py | 36 +++++++++++++++++++++++++----------
 opentech/apply/funds/views.py | 10 +---------
 2 files changed, 27 insertions(+), 19 deletions(-)

diff --git a/opentech/apply/funds/forms.py b/opentech/apply/funds/forms.py
index 8982f6afb..b95c8d122 100644
--- a/opentech/apply/funds/forms.py
+++ b/opentech/apply/funds/forms.py
@@ -77,9 +77,21 @@ class UpdateReviewersForm(forms.ModelForm):
         else:
             self.fields.pop('reviewer_reviewers')
 
+        self.roles = {}
         staff_reviewers = User.objects.staff()
+
+        assigned_roles = {
+            assigned.role: assigned.reviewer
+            for assigned in AssignedReviewers.objects.filter(
+                submission=self.instance,
+                role__isnull=False
+            )
+        }
+
         for role in ReviewerRole.objects.all().order_by('order'):
-            field_name = 'reviewer_' + str(role.pk)
+            field_name = 'reviewer_' + str(role)
+            self.roles[field_name] = role
+
             self.fields[field_name] = forms.ModelChoiceField(
                 queryset=staff_reviewers,
                 widget=Select2IconWidget(attrs={
@@ -89,9 +101,7 @@ class UpdateReviewersForm(forms.ModelForm):
                 label=f'{role.name} Reviewer',
             )
             # Pre-populate form field
-            existing_submission_reviewer = AssignedReviewers.objects.filter(submission=self.instance, role=role)
-            if existing_submission_reviewer:
-                self.fields[field_name].initial = existing_submission_reviewer[0].reviewer
+            self.fields[field_name].initial = assigned_roles.get(role)
 
     def prepare_field(self, field_name, initial, excluded):
         field = self.fields[field_name]
@@ -123,15 +133,21 @@ class UpdateReviewersForm(forms.ModelForm):
             reviewers = instance.reviewers_not_reviewed
 
         current_reviewers = set(reviewers | self.submitted_reviewers)
-        AssignedReviewers.objects.filter(submission=instance)
         for reviewer in current_reviewers:
-            AssignedReviewers.objects.get_or_create(
+            AssignedReviewers.objects.update_or_create(
                 submission=instance,
-                reviewer=reviewer,
+                role=None,
+                defaults={'reviewer': reviewer},
             )
-        AssignedReviewers.objects.filter(
-            submission=instance).exclude(
-            reviewer__in=current_reviewers).delete()
+
+        for field, role in self.roles.items():
+            reviewer = self.cleaned_data[field]
+            if reviewer:
+                AssignedReviewers.objects.update_or_create(
+                    submission=instance,
+                    role=role,
+                    defaults={'reviewer': reviewer},
+                )
 
         return instance
 
diff --git a/opentech/apply/funds/views.py b/opentech/apply/funds/views.py
index 6f3012c75..67c906fda 100644
--- a/opentech/apply/funds/views.py
+++ b/opentech/apply/funds/views.py
@@ -292,19 +292,11 @@ class UpdateReviewersView(DelegatedViewMixin, UpdateView):
     def form_valid(self, form):
         old = copy(self.get_object())
         old_reviewers = set(
-            copy.copy(reviewer)
+            copy(reviewer)
             for reviewer in AssignedReviewers.objects.filter(submission=old)
         )
         response = super().form_valid(form)
 
-        # Save role reviewers ONLY, we saved others in UpdateReviewersForm.save()
-        form.cleaned_data.pop('reviewer_reviewers', None)
-        for key, user in form.cleaned_data.items():
-            role = form.fields[key].widget.attrs['role']
-            # Create the reviewer/role association to submission if it doesn't exist, or update it
-            obj, created = AssignedReviewers.objects.update_or_create(
-                submission=form.instance, role=role, defaults={'reviewer': user})
-
         new_reviewers = set(AssignedReviewers.objects.filter(submission=form.instance))
         added = new_reviewers - old_reviewers
         removed = old_reviewers - new_reviewers
-- 
GitLab