From e03e4734b2089c96fdfabea15a48d6f3f90eaba4 Mon Sep 17 00:00:00 2001
From: Todd Dembrey <todd.dembrey@torchbox.com>
Date: Thu, 16 Aug 2018 15:00:31 +0100
Subject: [PATCH] Make the users sortable in the become form

---
 opentech/apply/users/forms.py                 | 11 ++++++++++
 .../apply/users/templates/users/account.html  | 22 +++++--------------
 opentech/apply/users/views.py                 | 12 +++++-----
 3 files changed, 23 insertions(+), 22 deletions(-)

diff --git a/opentech/apply/users/forms.py b/opentech/apply/users/forms.py
index 8338010a6..d89f45a9c 100644
--- a/opentech/apply/users/forms.py
+++ b/opentech/apply/users/forms.py
@@ -4,6 +4,7 @@ from django.utils.translation import gettext_lazy as _
 
 from wagtail.users.forms import UserEditForm, UserCreationForm
 
+from django_select2.forms import Select2Widget
 
 User = get_user_model()
 
@@ -53,3 +54,13 @@ class ProfileForm(forms.ModelForm):
                 slack = '@' + slack
 
         return slack
+
+
+class BecomeUserForm(forms.Form):
+    user = forms.ModelChoiceField(
+        widget=Select2Widget,
+        help_text="Only includes active, non-superusers",
+        queryset=User.objects.filter(is_active=True, is_superuser=False),
+        label='',
+        required=False,
+    )
diff --git a/opentech/apply/users/templates/users/account.html b/opentech/apply/users/templates/users/account.html
index 6d27ddddd..0f9c73f4b 100644
--- a/opentech/apply/users/templates/users/account.html
+++ b/opentech/apply/users/templates/users/account.html
@@ -30,25 +30,15 @@
     {% endif %}
 
     <div class="profile__column">
-        {% if swappable %}
+        {% if swappable_form %}
+            <h3>Become:</h3>
             <form action="{% url 'users:become' %}" method="post" class="form">
+                {{ swappable_form.media }}
                 {% csrf_token %}
-                {% for user in swappable %}
-                    {% if forloop.first %}
-                    <h3>Become:</h3>
-                    <p class="form__help">Only includes active, non-superusers</p>
-                    <div class="form__item">
-                    <div class="form__select">
-                        <select name="user" id="user">
-                    {% endif %}
-                        <option value="{{ user.id }}">{{ user }}</option>
-                    {% if forloop.last %}
-                        </select>
-                    </div>
-                    </div>
-                    {% endif %}
+                {% for field in swappable_form %}
+                    {% include "funds/includes/field.html" %}
                 {% endfor %}
-                <button class="button button--primary button--top-space" type="submit">Become</button>
+                <button class="button button--primary" type="submit">Become</button>
             </form>
         {% endif %}
 
diff --git a/opentech/apply/users/views.py b/opentech/apply/users/views.py
index 7dadd850d..02e1c8f15 100644
--- a/opentech/apply/users/views.py
+++ b/opentech/apply/users/views.py
@@ -17,7 +17,7 @@ from hijack.views import login_with_id
 from wagtail.admin.views.account import password_management_enabled
 
 from .decorators import require_oauth_whitelist
-from .forms import ProfileForm
+from .forms import BecomeUserForm, ProfileForm
 
 
 User = get_user_model()
@@ -36,14 +36,14 @@ class AccountView(UpdateView):
 
     def get_context_data(self, **kwargs):
         if self.request.user.is_superuser:
-            swappable = User.objects.filter(is_active=True, is_superuser=False)
+            swappable_form = BecomeUserForm()
         else:
-            swappable = []
+            swappable_form = None
 
         show_change_password = password_management_enabled() and self.request.user.has_usable_password(),
 
         return super().get_context_data(
-            swappable=swappable,
+            swappable_form=swappable_form,
             show_change_password=show_change_password,
             **kwargs,
         )
@@ -51,8 +51,8 @@ class AccountView(UpdateView):
 
 @login_required()
 def become(request):
-    if request.POST:
-        id = request.POST['user']
+    id = request.POST['user']
+    if request.POST and id:
         return login_with_id(request, id)
     return redirect('users:account')
 
-- 
GitLab