From 2c2c4e3b02d5ab9cc94986582bd1c8691102932c Mon Sep 17 00:00:00 2001
From: Jorran de Wit <jorrandewit@outlook.com>
Date: Sun, 14 May 2017 17:22:12 +0200
Subject: [PATCH] Add subject area filter to submissions

---
 submissions/forms.py                          | 18 ++++++++++---
 .../templates/submissions/submissions.html    |  2 +-
 submissions/views.py                          | 26 +++++++------------
 3 files changed, 24 insertions(+), 22 deletions(-)

diff --git a/submissions/forms.py b/submissions/forms.py
index e65974bd8..70b2b792e 100644
--- a/submissions/forms.py
+++ b/submissions/forms.py
@@ -14,8 +14,19 @@ from crispy_forms.layout import Layout, Div, Field, HTML, Submit
 
 class SubmissionSearchForm(forms.Form):
     author = forms.CharField(max_length=100, required=False, label="Author(s)")
-    title_keyword = forms.CharField(max_length=100, label="Title", required=False)
-    abstract_keyword = forms.CharField(max_length=1000, required=False, label="Abstract")
+    title = forms.CharField(max_length=100, required=False)
+    abstract = forms.CharField(max_length=1000, required=False)
+    subject_area = forms.CharField(max_length=10, required=False, widget=forms.Select(
+                                   choices=((None, 'Show all'),) + SCIPOST_SUBJECT_AREAS[0][1]))
+
+    def search_results(self):
+        """Return all Submission objects according to search"""
+        return Submission.objects.public_overcomplete().filter(
+            title__icontains=self.cleaned_data.get('title', ''),
+            author_list__icontains=self.cleaned_data.get('author', ''),
+            abstract__icontains=self.cleaned_data.get('abstract', ''),
+            subject_area__icontains=self.cleaned_data.get('subject_area', '')
+        )
 
 
 ###############################
@@ -158,8 +169,7 @@ class ConsiderRefereeInvitationForm(forms.Form):
 
 
 class SetRefereeingDeadlineForm(forms.Form):
-    deadline = forms.DateField(required=False, label='',
-                               widget=forms.SelectDateWidget)
+    deadline = forms.DateField(required=False, label='', widget=forms.SelectDateWidget)
 
 
 class VotingEligibilityForm(forms.Form):
diff --git a/submissions/templates/submissions/submissions.html b/submissions/templates/submissions/submissions.html
index 3ad37262b..380ca755a 100644
--- a/submissions/templates/submissions/submissions.html
+++ b/submissions/templates/submissions/submissions.html
@@ -23,7 +23,7 @@
               <h2 class="card-title">Search SciPost Submissions:</h2>
               <form action="{% url 'submissions:submissions' %}" class="small" method="get">
                 {{ form|bootstrap:'4,8,sm' }}
-                <input class="btn btn-sm btn-secondary" type="submit" name="Submit" />
+                <input class="btn btn-sm btn-secondary" type="submit" value="Search"/>
               </form>
             </div>
         </div>
diff --git a/submissions/views.py b/submissions/views.py
index 343f58ca9..b49f185de 100644
--- a/submissions/views.py
+++ b/submissions/views.py
@@ -27,9 +27,9 @@ from .forms import SubmissionIdentifierForm, SubmissionForm, SubmissionSearchFor
                    SubmissionCycleChoiceForm
 from .utils import SubmissionUtils
 
+from journals.constants import SCIPOST_JOURNALS_SPECIALIZATIONS
 from scipost.forms import ModifyPersonalMessageForm, RemarkForm
 from scipost.models import Contributor, Remark, RegistrationInvitation
-
 from scipost.services import ArxivCaller
 from scipost.utils import Utils
 from strings import arxiv_caller_errormessages_submissions
@@ -186,12 +186,13 @@ class SubmissionCreateView(PermissionRequiredMixin, CreateView):
 class SubmissionListView(ListView):
     model = Submission
     template_name = 'submissions/submissions.html'
-    form = SubmissionSearchForm()
+    form = SubmissionSearchForm
     submission_search_list = []
     paginate_by = 10
 
     def get_queryset(self):
         queryset = Submission.objects.public_overcomplete()
+        self.form = self.form(self.request.GET)
         if 'to_journal' in self.kwargs:
             queryset = queryset.filter(
                 latest_activity__gte=timezone.now() + datetime.timedelta(days=-60),
@@ -204,26 +205,17 @@ class SubmissionListView(ListView):
                 discipline=discipline,
                 latest_activity__gte=timezone.now() + datetime.timedelta(weeks=-int(nrweeksback))
             )
-        elif 'Submit' in self.request.GET:
-            queryset = queryset.filter(
-                title__icontains=self.request.GET.get('title_keyword', ''),
-                author_list__icontains=self.request.GET.get('author', ''),
-                abstract__icontains=self.request.GET.get('abstract_keyword', '')
-            )
+        elif self.form.is_valid() and self.form.has_changed():
+            queryset = self.form.search_results()
 
         return queryset.order_by('-submission_date')
 
     def get_context_data(self, **kwargs):
         # Call the base implementation first to get a context
-        context = super(SubmissionListView, self).get_context_data(**kwargs)
+        context = super().get_context_data(**kwargs)
 
-        # Keep any search fields previously filled
-        initialdata = {
-            'author': self.request.GET.get('author', ''),
-            'title_keyword': self.request.GET.get('title_keyword', ''),
-            'abstract_keyword': self.request.GET.get('abstract_keyword', '')
-        }
-        context['form'] = SubmissionSearchForm(initial=initialdata)
+        # Form into the context!
+        context['form'] = self.form
 
         # To customize display in the template
         if 'to_journal' in self.kwargs:
@@ -232,7 +224,7 @@ class SubmissionListView(ListView):
             context['discipline'] = self.kwargs['discipline']
             context['nrweeksback'] = self.kwargs['nrweeksback']
             context['browse'] = True
-        elif 'Submit' not in self.request.GET:
+        elif not self.form.is_valid() or not self.form.has_changed():
             context['recent'] = True
 
         return context
-- 
GitLab