From d21d4bda836aecb3653ec8589d643549ba9de68a Mon Sep 17 00:00:00 2001 From: Danielle McLean Date: Sun, 19 May 2024 15:59:43 +1000 Subject: [PATCH] Paginate without errors if a page doesn't exist --- entries/pagination.py | 45 +++++++++++------------- lemoncurry/jinja2/lemoncurry/layout.html | 16 ++++----- 2 files changed, 29 insertions(+), 32 deletions(-) diff --git a/entries/pagination.py b/entries/pagination.py index aa7c174..67d1897 100644 --- a/entries/pagination.py +++ b/entries/pagination.py @@ -1,35 +1,32 @@ -from django.core.paginator import Paginator +from typing import Callable + +from django.core.paginator import Page, Paginator from django.shortcuts import redirect from lemoncurry.middleware import ResponseException -def paginate(queryset, reverse, page): - class Page: - def __init__(self, i): - self.i = i +def paginate(queryset, reverse: Callable[[int], str], page: int | None) -> Page: + def redirect_to_page(i: int): + raise ResponseException(redirect(reverse(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: - raise ResponseException(redirect(Page(1).url)) + def reversible(p: Page) -> Page: + p.reverse = reverse + return p paginator = Paginator(queryset, 10) - entries = paginator.page(page or 1) - entries.pages = tuple(Page(i) for i in paginator.page_range) + # If no page number was specified, return page one. + if page is None: + return reversible(paginator.page(1)) - if entries.has_previous(): - entries.prev = Page(entries.previous_page_number()) - if entries.has_next(): - entries.next = Page(entries.next_page_number()) + # If the first page was explicitly requested, or the page number was negative, redirect to page one with no URL suffix. + if page <= 1: + redirect_to_page(1) - return entries + # If the page requested is larger than the last page, then redirect to the last page. + if page > paginator.num_pages: + redirect_to_page(paginator.num_pages) + + # Just return the current page! Hooray! + return reversible(paginator.page(page)) diff --git a/lemoncurry/jinja2/lemoncurry/layout.html b/lemoncurry/jinja2/lemoncurry/layout.html index 22308c3..322c461 100644 --- a/lemoncurry/jinja2/lemoncurry/layout.html +++ b/lemoncurry/jinja2/lemoncurry/layout.html @@ -110,29 +110,29 @@