From 89a31141ff51377ca97cde0f3da2f3651f46079d Mon Sep 17 00:00:00 2001 From: Tom Adler Date: Sun, 13 Jul 2014 08:59:09 +0200 Subject: [PATCH] Support last page pattern in PAGINATION_PATTERNS --- docs/settings.rst | 5 +++++ pelican/paginator.py | 9 +++++++-- pelican/tests/test_paginator.py | 26 ++++++++++++++++++++++++++ 3 files changed, 38 insertions(+), 2 deletions(-) diff --git a/docs/settings.rst b/docs/settings.rst index e7eae66a..080856e3 100644 --- a/docs/settings.rst +++ b/docs/settings.rst @@ -1067,6 +1067,11 @@ as follows:: ) +If you want a pattern to apply to the last page in the list, use ``-1`` +as the ``minimum_page`` value:: + + (-1, '{base_name}/last/', '{base_name}/last/index.html'), + Translations ============ diff --git a/pelican/paginator.py b/pelican/paginator.py index 9d169045..7e738fe3 100644 --- a/pelican/paginator.py +++ b/pelican/paginator.py @@ -118,8 +118,13 @@ class Page: # find the last matching pagination rule for p in self.settings['PAGINATION_PATTERNS']: - if p.min_page <= self.number: - rule = p + if p.min_page == -1: + if not self.has_next(): + rule = p + break + else: + if p.min_page <= self.number: + rule = p if not rule: return '' diff --git a/pelican/tests/test_paginator.py b/pelican/tests/test_paginator.py index 5dc285ae..f8233eb4 100644 --- a/pelican/tests/test_paginator.py +++ b/pelican/tests/test_paginator.py @@ -76,3 +76,29 @@ class TestPage(unittest.TestCase): page2 = paginator.page(2) self.assertEqual(page2.save_as, 'blog/2/index.html') self.assertEqual(page2.url, '//blog.my.site/2/') + + def test_custom_pagination_pattern_last_page(self): + from pelican.paginator import PaginationRule + settings = get_settings() + settings['PAGINATION_PATTERNS'] = [PaginationRule(*r) for r in [ + (1, '/{url}1/', '{base_name}/1/index.html'), + (2, '/{url}{number}/', '{base_name}/{number}/index.html'), + (-1, '/{url}', '{base_name}/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) + # The URL *has to* stay absolute (with // in the front), so verify that + page1 = paginator.page(1) + self.assertEqual(page1.save_as, 'blog/1/index.html') + self.assertEqual(page1.url, '//blog.my.site/1/') + page2 = paginator.page(2) + self.assertEqual(page2.save_as, 'blog/2/index.html') + self.assertEqual(page2.url, '//blog.my.site/2/') + page3 = paginator.page(3) + self.assertEqual(page3.save_as, 'blog/index.html') + self.assertEqual(page3.url, '//blog.my.site/')