From b5a6e93a53dda06ed7542fe9b1fbc7ea882760a3 Mon Sep 17 00:00:00 2001 From: Jorran de Wit <jorrandewit@outlook.com> Date: Sun, 26 Feb 2017 23:03:25 +0100 Subject: [PATCH] Commentaries list view to CBV --- commentaries/forms.py | 12 ++++++------ commentaries/urls.py | 2 +- commentaries/views.py | 45 +++++++++++++++++++++++++++++-------------- comments/managers.py | 1 + 4 files changed, 39 insertions(+), 21 deletions(-) diff --git a/commentaries/forms.py b/commentaries/forms.py index 6f781e535..8d95c58d8 100644 --- a/commentaries/forms.py +++ b/commentaries/forms.py @@ -214,13 +214,13 @@ class VetCommentaryForm(forms.Form): class CommentarySearchForm(forms.Form): """Search for Commentary specified by user""" - pub_author = forms.CharField(max_length=100, required=False, label="Author(s)") - pub_title_keyword = forms.CharField(max_length=100, required=False, label="Title") - pub_abstract_keyword = forms.CharField(max_length=1000, required=False, label="Abstract") + author = forms.CharField(max_length=100, required=False, label="Author(s)") + title = forms.CharField(max_length=100, required=False, label="Title") + abstract = forms.CharField(max_length=1000, required=False, label="Abstract") def search_results(self): """Return all Commentary objects according to search""" return Commentary.objects.vetted( - pub_title__icontains=self.cleaned_data['pub_title_keyword'], - pub_abstract__icontains=self.cleaned_data['pub_abstract_keyword'], - author_list__icontains=self.cleaned_data['pub_author']).order_by('-pub_date') + pub_title__icontains=self.cleaned_data['title'], + pub_abstract__icontains=self.cleaned_data['abstract'], + author_list__icontains=self.cleaned_data['author']).order_by('-pub_date') diff --git a/commentaries/urls.py b/commentaries/urls.py index 2f203ac38..c9569a1be 100644 --- a/commentaries/urls.py +++ b/commentaries/urls.py @@ -5,7 +5,7 @@ from . import views urlpatterns = [ # Commentaries - url(r'^$', views.commentaries, name='commentaries'), + url(r'^$', views.CommentaryListView.as_view(), name='commentaries'), url(r'^browse/(?P<discipline>[a-z]+)/(?P<nrweeksback>[0-9]+)/$', views.browse, name='browse'), url(r'^howto$', TemplateView.as_view(template_name='commentaries/howto.html'), name='howto'), diff --git a/commentaries/views.py b/commentaries/views.py index 1ae2de1ce..dd72d085f 100644 --- a/commentaries/views.py +++ b/commentaries/views.py @@ -13,6 +13,7 @@ from django.core.urlresolvers import reverse, reverse_lazy from django.shortcuts import redirect from django.template.loader import render_to_string from django.views.generic.edit import CreateView, FormView +from django.views.generic.list import ListView from django.utils.decorators import method_decorator from .models import Commentary @@ -267,21 +268,37 @@ def vet_commentary_request_ack(request, commentary_id): return render(request, 'scipost/acknowledgement.html', context) -def commentaries(request): - """List and search all commentaries""" - form = CommentarySearchForm(request.POST or None) - if form.is_valid() and form.has_changed(): - commentary_search_list = form.search_results() - else: - commentary_search_list = [] +class CommentaryListView(ListView): + model = Commentary + form = CommentarySearchForm + paginate_by = 10 - comment_recent_list = Comment.objects.filter(status='1').order_by('-date_submitted')[:10] - commentary_recent_list = Commentary.objects.vetted().order_by('-latest_activity')[:10] - context = { - 'form': form, 'commentary_search_list': commentary_search_list, - 'comment_recent_list': comment_recent_list, - 'commentary_recent_list': commentary_recent_list} - return render(request, 'commentaries/commentaries.html', context) + def get_queryset(self): + '''Perform search form here already to get the right pagination numbers.''' + self.form = self.form(self.request.GET) + if self.form.is_valid(): + return self.form.search_results() + return self.model.objects.vetted().order_by('-latest_activity') + + def get_context_data(self, **kwargs): + # Call the base implementation first to get a context + context = super().get_context_data(**kwargs) + + # Get newest comments + context['comment_list'] = Comment.objects.vetted().order_by('-date_submitted')[:10] + + # Form into the context! + context['form'] = self.form + + # To customize display in the template + if 'discipline' in self.kwargs: + context['discipline'] = self.kwargs['discipline'] + context['nrweeksback'] = self.kwargs['nrweeksback'] + context['browse'] = True + elif not any(argument in ['title', 'author', 'abstract'] for argument in self.request.GET): + context['recent'] = True + + return context def browse(request, discipline, nrweeksback): diff --git a/comments/managers.py b/comments/managers.py index 7b71d0454..2875a7030 100644 --- a/comments/managers.py +++ b/comments/managers.py @@ -1,5 +1,6 @@ from django.db import models + class CommentManager(models.Manager): def vetted(self): return self.filter(status__gte=1) -- GitLab