diff --git a/metacore/forms.py b/metacore/forms.py index 2563a3c7c11a22b895e81d4658c54741fabd25e0..c9f95322f8772b89f9fa5a74cf260ad360a5c287 100644 --- a/metacore/forms.py +++ b/metacore/forms.py @@ -1,7 +1,10 @@ from django import forms +import logging + from .models import Citable, CitableWithDOI +logger = logging.getLogger(__name__) class CitableSearchForm(forms.Form): omni = forms.CharField(max_length=100, required=False, label="Authors / title (text search)") @@ -12,7 +15,10 @@ class CitableSearchForm(forms.Form): def search_results(self): """Return all Citable objects according to search""" - if not self.cleaned_data.get('omni'): + if not self.cleaned_data.get('omni', False): + if self.is_empty: + return None + return Citable.objects.simple().filter( title__icontains=self.cleaned_data.get('title', ''), authors__icontains=self.cleaned_data.get('author', ''), @@ -20,6 +26,7 @@ class CitableSearchForm(forms.Form): **{'metadata__container-title__icontains': self.cleaned_data.get('journal', '')}, ) else: + """If a text index is present, search using the authors/title box is enables""" return Citable.objects.simple().filter( title__icontains=self.cleaned_data.get('title', ''), @@ -28,3 +35,12 @@ class CitableSearchForm(forms.Form): **{'metadata__container-title__icontains': self.cleaned_data.get('journal', '')}, ).omni_search(self.cleaned_data.get('omni'), 'and') + def is_empty(self): + form_empty = True + for field_value in self.cleaned_data.values(): + if field_value is not None and field_value != '': + form_empty = False + break + + if form_empty: + return None diff --git a/metacore/views.py b/metacore/views.py index 712de954dc938755e99aac6f7a573a4c73579350..0269bc6f19046348f0db5b6d53c1b7f508a1b5a9 100644 --- a/metacore/views.py +++ b/metacore/views.py @@ -18,10 +18,14 @@ class CitableListView(ListView): if self.form.is_valid() and self.form.has_changed(): queryset = self.form.search_results() - else: - # queryset = Citable.objects.simple().limit(100) - queryset = Citable.objects.simple().order_by('-metadata.is-referenced-by-count').limit(10) + # search_results() returns None when all form fields are empty + if queryset is not None: + return queryset + + # If there's no search or the search form is empty: + # queryset = Citable.objects.simple().limit(100) + queryset = Citable.objects.simple().order_by('-metadata.is-referenced-by-count').limit(10) return queryset def get_context_data(self, **kwargs): @@ -31,13 +35,23 @@ class CitableListView(ListView): # Form into the context! context['form'] = self.form - if self.form.is_valid() and self.form.has_changed(): + if self.search_active(): context['search'] = True else: context['browse'] = True return context + def search_active(self): + """ + Helper method to figure out whether there is a search going on, + meaning that the form is not empty, or not. + """ + if self.form.is_valid() and self.form.has_changed() and not self.form.is_empty(): + return True + else: + return False + def get_paginate_by(self, queryset): """ Dynamically compute pagination setting. @@ -48,7 +62,7 @@ class CitableListView(ListView): Also you can add an extra parameter to specify pagination size, like so: return self.request.GET.get('paginate_by', self.paginate_by) """ - if self.request.GET: + if self.search_active(): return self.paginate_by else: return None