diff --git a/entries/pagination.py b/entries/pagination.py new file mode 100644 index 0000000..04023ef --- /dev/null +++ b/entries/pagination.py @@ -0,0 +1,33 @@ +from django.core.paginator import Paginator +from django.shortcuts import redirect + + +def paginate(queryset, reverse, page): + class Page: + def __init__(self, i): + self.i = i + + @property + def url(self): + return reverse(self.i) + + @property + def current(self): + return self.i == entries.number + + # If the first page was requested, redirect to the clean version of the URL + # with no page suffix. + if page == '1': + return redirect(Page(1).url) + + paginator = Paginator(queryset, 10) + entries = paginator.page(page or 1) + + entries.pages = tuple(Page(i) for i in paginator.page_range) + + if entries.has_previous(): + entries.prev = Page(entries.previous_page_number()) + if entries.has_next(): + entries.next = Page(entries.next_page_number()) + + return entries diff --git a/home/views.py b/home/views.py index 7304dbd..5f8998a 100644 --- a/home/views.py +++ b/home/views.py @@ -1,12 +1,11 @@ from annoying.decorators import render_to -from django.core.paginator import Paginator from django.http import HttpResponse -from django.shortcuts import get_object_or_404, redirect +from django.shortcuts import get_object_or_404 from django.urls import reverse from users.models import User from urllib.parse import urljoin -from entries import kinds +from entries import kinds, pagination from lemoncurry import breadcrumbs, utils breadcrumbs.add('home:index', 'home') @@ -14,33 +13,17 @@ breadcrumbs.add('home:index', 'home') @render_to('home/index.html') def index(request, page): + def url(page): + kwargs = {'page': page} if page != 1 else {} + return reverse('home:index', kwargs=kwargs) query = User.objects.prefetch_related('entries', 'profiles', 'keys') user = get_object_or_404(query, pk=1) - paginator = Paginator(user.entries.filter(kind__in=kinds.on_home), 10) + entries = user.entries.filter(kind__in=kinds.on_home) - # If we explicitly got /page/1 in the URL then redirect to the version with - # no page suffix. - if page == '1': - return redirect('home:index', permanent=True) - entries = paginator.page(page or 1) - - class Page: - def __init__(self, i): - self.i = i - - @property - def url(self): - return reverse('home:index', kwargs={'page': self.i}) - - @property - def current(self): - return self.i == entries.number - - entries.pages = tuple(Page(i) for i in paginator.page_range) - if entries.has_previous(): - entries.prev = Page(entries.previous_page_number()) - if entries.has_next(): - entries.next = Page(entries.next_page_number()) + entries = pagination.paginate(queryset=entries, reverse=url, page=page) + # If we got a valid HTTP response, just return it without rendering. + if hasattr(entries, 'content'): + return entries return { 'user': user, diff --git a/lemoncurry/templates/lemoncurry/layout.html b/lemoncurry/templates/lemoncurry/layout.html index 4d0eb80..ffb8f38 100644 --- a/lemoncurry/templates/lemoncurry/layout.html +++ b/lemoncurry/templates/lemoncurry/layout.html @@ -67,6 +67,7 @@