From 1bf6db0596cc0dfaf852b4ab7aa8ed5444f86330 Mon Sep 17 00:00:00 2001
From: Erin Mullaney <erin.mullaney@torchbox.com>
Date: Thu, 7 Feb 2019 16:34:58 -0500
Subject: [PATCH] improve view form_valid, set role on widget

---
 opentech/apply/funds/forms.py                     |  3 ++-
 .../funds/includes/delegated_form_base.html       |  4 ++--
 opentech/apply/funds/views.py                     | 15 ++++-----------
 opentech/apply/funds/widgets.py                   |  2 +-
 4 files changed, 9 insertions(+), 15 deletions(-)

diff --git a/opentech/apply/funds/forms.py b/opentech/apply/funds/forms.py
index 9af42b55d..64e10f61b 100644
--- a/opentech/apply/funds/forms.py
+++ b/opentech/apply/funds/forms.py
@@ -84,7 +84,8 @@ class UpdateReviewersForm(forms.ModelForm):
             field_name = 'reviewer_' + str(role.pk)
             self.fields[field_name] = forms.ModelChoiceField(
                 queryset=staff_reviewers,
-                widget=Select2IconWidget(attrs={'data-placeholder': 'Select a reviewer', 'icon': role.icon}),
+                widget=Select2IconWidget(attrs={
+                    'data-placeholder': 'Select a reviewer', 'role': role}),
                 required=False,
                 label=f'{role.name} Reviewer',
             )
diff --git a/opentech/apply/funds/templates/funds/includes/delegated_form_base.html b/opentech/apply/funds/templates/funds/includes/delegated_form_base.html
index 905e28b59..a5e618774 100644
--- a/opentech/apply/funds/templates/funds/includes/delegated_form_base.html
+++ b/opentech/apply/funds/templates/funds/includes/delegated_form_base.html
@@ -8,8 +8,8 @@
             {{ field.errors }}
 
             {# TODO: Add styles around icon later #}
-            {% if field.field.widget.attrs.icon %}
-                {% image field.field.widget.attrs.icon max-20x20 %}
+            {% if field.field.widget.attrs.role and field.field.widget.attrs.role.icon %}
+                {% image field.field.widget.attrs.role.icon max-20x20 %}
             {% endif %}
 
 
diff --git a/opentech/apply/funds/views.py b/opentech/apply/funds/views.py
index 727483682..b5c00f247 100644
--- a/opentech/apply/funds/views.py
+++ b/opentech/apply/funds/views.py
@@ -42,7 +42,6 @@ from .models import (
     ApplicationSubmission,
     AssignedReviewers,
     ApplicationRevision,
-    ReviewerRole,
     RoundsAndLabs,
     RoundBase,
     LabBase
@@ -289,18 +288,12 @@ class UpdateReviewersView(DelegatedViewMixin, UpdateView):
         # Save role reviewers ONLY, we saved others in UpdateReviewersForm.save()
         form.cleaned_data.pop('reviewer_reviewers')
         for key, user in form.cleaned_data.items():
-            role_pk = key[key.rindex("_") + 1:]
-            role = ReviewerRole.objects.get(pk=role_pk)
-            # Create the reviewer/role association to submission if it doesn't exist
-            submission_reviewer, created = AssignedReviewers.objects.get_or_create(
-                submission=form.instance, reviewer=user, role=role)
+            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})
             if created:
                 users_with_roles.append({ 'user': user, 'role': role})
-            # Delete any reviewer/role associations that existed previously
-            AssignedReviewers.objects.filter(
-                Q(submission=form.instance),
-                ~Q(reviewer=user),
-                Q(role=role)).delete()
 
         new_reviewers_external = set(AssignedReviewers.objects.filter(submission=form.instance, role__isnull=True))
         added_external = new_reviewers_external - old_reviewers_external
diff --git a/opentech/apply/funds/widgets.py b/opentech/apply/funds/widgets.py
index 95b81f6d8..ecb2e9ede 100644
--- a/opentech/apply/funds/widgets.py
+++ b/opentech/apply/funds/widgets.py
@@ -25,6 +25,6 @@ class Select2MultiCheckboxesWidget(Select2MultipleWidget):
 class Select2IconWidget(Select2Widget):
     def __init__(self, *args, **kwargs):
         attrs = kwargs.get('attrs', {})
-        attrs.setdefault('icon', '')
+        attrs.setdefault('role', '')
         kwargs['attrs'] = attrs
         super().__init__(*args, **kwargs)
-- 
GitLab