From 5ad27afe145f3081340ad26d457c7d4330e4eab9 Mon Sep 17 00:00:00 2001
From: "J.-S. Caux" <J.S.Caux@uva.nl>
Date: Tue, 2 Oct 2018 09:38:18 +0200
Subject: [PATCH] Add search box in Profile list

---
 profiles/forms.py                             |  4 ++
 profiles/templates/profiles/profile_list.html | 50 ++++++++++++-------
 profiles/views.py                             |  5 +-
 scipost/templatetags/add_get_parameters.py    |  2 +
 4 files changed, 41 insertions(+), 20 deletions(-)

diff --git a/profiles/forms.py b/profiles/forms.py
index bcebf4118..d8b9b8e2f 100644
--- a/profiles/forms.py
+++ b/profiles/forms.py
@@ -35,3 +35,7 @@ class AlternativeEmailForm(forms.ModelForm):
     class Meta:
         model = AlternativeEmail
         fields = ['email', 'still_valid']
+
+
+class SearchTextForm(forms.Form):
+    text = forms.CharField(label='')
diff --git a/profiles/templates/profiles/profile_list.html b/profiles/templates/profiles/profile_list.html
index ee574e9d7..f3298656c 100644
--- a/profiles/templates/profiles/profile_list.html
+++ b/profiles/templates/profiles/profile_list.html
@@ -41,27 +41,39 @@
 	<li>Create a Profile for <a href="{% url 'profiles:profile_create' from_type='refereeinvitation' pk=next_refinv_wo_profile.id %}">the next</a> Referee Invitation without one ({{ nr_refinv_wo_profile }} to handle)</li>
 	{% endif %}
       </ul>
-      <br/>
-      <ul class="list-inline">
-	<li class="list-inline-item">
-	  <a href="{% url 'profiles:profiles' %}">View all</a> or view by discipline/subject area:
-	</li>
-	{% for discipline in subject_areas %}
-	<li class="list-inline-item">
-	  <div class="dropdown">
-	    <button class="btn btn-primary dropdown-toggle" type="button" id="dropdownMenuButton{{ discipline.0|cut:" " }}" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">{{ discipline.0 }}</button>
-	    <div class="dropdown-menu" aria-labelledby="dropdownMenuButton{{ discipline.0|cut:" " }}">
-	      <a class="dropdown-item" href="?discipline={{ discipline.0|cut:' '}}">View all in {{ discipline.0 }}</a>
-	      {% for area in discipline.1 %}
-	      <a class="dropdown-item" href="?discipline={{ discipline.0|cut:' '}}&expertise={{ area.0}}">{{ area.0 }}</a>
-	      {% endfor %}
-	    </div>
-	  </div>
-	  </li>
-	{% endfor %}
-      </ul>
+      <h4>Specialize the list:</h4>
       <ul>
+	<li>
+	  <ul class="list-inline">
+	    <li class="list-inline-item">
+	      <a href="{% url 'profiles:profiles' %}">View all</a> or view by discipline/subject area:
+	    </li>
+	    {% for discipline in subject_areas %}
+	    <li class="list-inline-item">
+	      <div class="dropdown">
+		<button class="btn btn-primary dropdown-toggle" type="button" id="dropdownMenuButton{{ discipline.0|cut:" " }}" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">{{ discipline.0 }}</button>
+		<div class="dropdown-menu" aria-labelledby="dropdownMenuButton{{ discipline.0|cut:" " }}">
+		  <a class="dropdown-item" href="?discipline={{ discipline.0|cut:' '}}">View all in {{ discipline.0 }}</a>
+		  {% for area in discipline.1 %}
+		  <a class="dropdown-item" href="?discipline={{ discipline.0|cut:' '}}&expertise={{ area.0}}">{{ area.0 }}</a>
+		  {% endfor %}
+		</div>
+	      </div>
+	    </li>
+	    {% endfor %}
+	  </ul>
+	</li>
 	<li>View only Profiles <a href="{% add_get_parameters contributor=True %}">with</a> or <a href="{% add_get_parameters contributor=False %}">without</a> an associated Contributor</li>
+	<li>
+	  <ul class="list-inline">
+	    <li class="list-inline-item">Last name startswith:</li>
+	    <li class="list-inline-item">
+	      <form action="" method="get">{{ searchform }}
+	    </li>
+	    <li class="list-inline-item"><input class="btn btn-outline-secondary" type="submit" value="Search"></form>
+	    </li>
+	  </ul>
+	</li>
       </ul>
   </div>
 </div>
diff --git a/profiles/views.py b/profiles/views.py
index 7eeb8d297..fecd548f0 100644
--- a/profiles/views.py
+++ b/profiles/views.py
@@ -19,7 +19,7 @@ from invitations.models import RegistrationInvitation
 from submissions.models import RefereeInvitation
 
 from .models import Profile, AlternativeEmail
-from .forms import ProfileForm, AlternativeEmailForm
+from .forms import ProfileForm, AlternativeEmailForm, SearchTextForm
 
 
 
@@ -113,11 +113,14 @@ class ProfileListView(PermissionsMixin, PaginationMixin, ListView):
             queryset = queryset.filter(contributor=None)
         elif self.request.GET.get('contributor', None) == 'True':
             queryset = queryset.exclude(contributor=None)
+        if self.request.GET.get('text', None):
+            queryset = queryset.filter(last_name__startswith=self.request.GET.get('text'))
         return queryset
 
     def get_context_data(self, **kwargs):
         context = super().get_context_data(**kwargs)
         context['subject_areas'] = SCIPOST_SUBJECT_AREAS
+        context['searchform'] = SearchTextForm(initial={'text': self.request.GET.get('text', None)})
         contributors_dup_email = Contributor.objects.have_duplicate_email()
         context['nr_contributors_w_duplicate_email'] = contributors_dup_email.count()
         context['contributors_w_duplicate_email'] = contributors_dup_email
diff --git a/scipost/templatetags/add_get_parameters.py b/scipost/templatetags/add_get_parameters.py
index c471b98a5..fa87ca3ea 100644
--- a/scipost/templatetags/add_get_parameters.py
+++ b/scipost/templatetags/add_get_parameters.py
@@ -13,6 +13,8 @@ def add_get_parameters(context, **kwargs):
     for k, v in kwargs.items():
         if v is not None:
             parameters[k] = v
+        elif k in parameters.keys():
+            del parameters[k]
     if parameters:
         params = '?'
         for k, v in parameters.items():
-- 
GitLab