From 6fc577e5051eff7a748dd3124d618984cffa61b1 Mon Sep 17 00:00:00 2001 From: Martin Trigaux Date: Sat, 1 Jul 2023 10:29:22 +0200 Subject: [PATCH] Allow to cap the pagination This way one could only generate one page of content by using MAX_PAGINATION = 1 --- docs/settings.rst | 5 +++++ pelican/paginator.py | 2 ++ pelican/settings.py | 1 + pelican/tests/test_paginator.py | 18 ++++++++++++++++++ 4 files changed, 26 insertions(+) diff --git a/docs/settings.rst b/docs/settings.rst index 8417e209..85aed34f 100644 --- a/docs/settings.rst +++ b/docs/settings.rst @@ -1038,6 +1038,11 @@ You can use the following settings to configure the pagination. The maximum number of articles to include on a page, not including orphans. False to disable pagination. +.. data:: MAX_PAGINATION = False + + The maximum number of pages generated. ``False`` to paginate all available + pages. + .. data:: PAGINATED_TEMPLATES = {'index': None, 'tag': None, 'category': None, 'author': None} The templates to use pagination with, and the number of articles to include diff --git a/pelican/paginator.py b/pelican/paginator.py index 4231e67b..c60c16f4 100644 --- a/pelican/paginator.py +++ b/pelican/paginator.py @@ -47,6 +47,8 @@ class Paginator: if self._num_pages is None: hits = max(1, self.count - self.orphans) self._num_pages = int(ceil(hits / (float(self.per_page) or 1))) + if self.settings["MAX_PAGINATION"]: + self._num_pages = min(self.settings["MAX_PAGINATION"], self._num_pages) return self._num_pages num_pages = property(_get_num_pages) diff --git a/pelican/settings.py b/pelican/settings.py index 5b495e86..3c5be0a1 100644 --- a/pelican/settings.py +++ b/pelican/settings.py @@ -90,6 +90,7 @@ DEFAULT_CONFIG = { (1, '{name}{extension}', '{name}{extension}'), (2, '{name}{number}{extension}', '{name}{number}{extension}'), ], + 'MAX_PAGINATION': False, 'YEAR_ARCHIVE_URL': '', 'YEAR_ARCHIVE_SAVE_AS': '', 'MONTH_ARCHIVE_URL': '', diff --git a/pelican/tests/test_paginator.py b/pelican/tests/test_paginator.py index f8233eb4..7697e4b8 100644 --- a/pelican/tests/test_paginator.py +++ b/pelican/tests/test_paginator.py @@ -102,3 +102,21 @@ class TestPage(unittest.TestCase): page3 = paginator.page(3) self.assertEqual(page3.save_as, 'blog/index.html') self.assertEqual(page3.url, '//blog.my.site/') + + def test_max_pagination(self): + from pelican.paginator import PaginationRule + settings = get_settings() + settings['MAX_PAGINATION'] = 2 + settings['PAGINATION_PATTERNS'] = [PaginationRule(*r) for r in [ + (1, '/{url}{number}/', '{base_name}/{number}/index.html') + ]] + + self.page_kwargs['metadata']['author'] = Author('Blogger', settings) + object_list = [Article(**self.page_kwargs), + Article(**self.page_kwargs), + Article(**self.page_kwargs)] + paginator = Paginator('blog/index.html', '//blog.my.site/', + object_list, settings, 1) + self.assertEqual(paginator.count, 3) + self.assertEqual(paginator.per_page, 1) + self.assertEqual(paginator.num_pages, 2)