diff --git a/functions/custom_views.py b/functions/custom_views.py index 781626cc..01e0ac25 100644 --- a/functions/custom_views.py +++ b/functions/custom_views.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- from django.shortcuts import render_to_response -from django.http import HttpResponseRedirect, HttpResponse +from django.http import HttpResponseRedirect, HttpResponse, Http404 from django.core.context_processors import csrf from django.conf import settings from django.contrib.auth.decorators import login_required @@ -20,8 +20,11 @@ import random from django.views.generic import ListView as OldListView + class ListView(OldListView): """ + Default Django generic ListView with few overrided methods for redirecting + onto first page of pagination in case of entering big page number(for search engines) List of modules, where overrided ListView is used: - accounts.views - article.views @@ -34,7 +37,37 @@ class ListView(OldListView): - specialist_catalog.views - translator.views """ - paginator_class = settings.DEFAULT_PAGINATOR + def paginate_queryset(self, queryset, page_size): + """ + Paginate the queryset, if needed. + """ + paginator = self.get_paginator(queryset, page_size, allow_empty_first_page=self.get_allow_empty()) + page_kwarg = self.page_kwarg + page = self.kwargs.get(page_kwarg) or self.request.GET.get(page_kwarg) or 1 + try: + page_number = int(page) + except ValueError: + if page == 'last': + page_number = paginator.num_pages + else: + raise Http404(_("Page is not 'last', nor can it be converted to an int.")) + try: + page = paginator.page(page_number) + self.kwargs['home'] = False + + except EmptyPage as e: + page = paginator.page(1) + self.kwargs['home'] = True + return (paginator, page, page.object_list, page.has_other_pages()) + + def get(self, request, *args, **kwargs): + response = super(ListView, self).get(request, *args, **kwargs) + if self.kwargs.get("home"): + path = self.request.path + return HttpResponseRedirect(path[:path.find('page')]) + else: + return response + @login_required def filtered_list(request, objects, template, item_per_page=settings.ADMIN_PAGINATION):