Mercurial > piecrust2
diff piecrust/data/paginator.py @ 352:498a917cd2d4
pagination: Make pagination use routes to generate proper URLs.
This fixes incorrect URLs when using custom sub-page suffixes, for instance.
Add tests.
author | Ludovic Chabant <ludovic@chabant.com> |
---|---|
date | Fri, 17 Apr 2015 16:09:30 -0700 |
parents | eb958151c8dc |
children | 4b1019bb2533 |
line wrap: on
line diff
--- a/piecrust/data/paginator.py Fri Apr 17 16:08:23 2015 -0700 +++ b/piecrust/data/paginator.py Fri Apr 17 16:09:30 2015 -0700 @@ -10,23 +10,25 @@ class Paginator(object): - debug_render = ['has_more', 'items', 'has_items', 'items_per_page', - 'items_this_page', 'prev_page_number', 'this_page_number', - 'next_page_number', 'prev_page', 'next_page', - 'total_item_count', 'total_page_count', - 'next_item', 'prev_item'] - debug_render_invoke = ['has_more', 'items', 'has_items', 'items_per_page', - 'items_this_page', 'prev_page_number', 'this_page_number', - 'next_page_number', 'prev_page', 'next_page', - 'total_item_count', 'total_page_count', - 'next_item', 'prev_item'] + debug_render = [ + 'has_more', 'items', 'has_items', 'items_per_page', + 'items_this_page', 'prev_page_number', 'this_page_number', + 'next_page_number', 'prev_page', 'next_page', + 'total_item_count', 'total_page_count', + 'next_item', 'prev_item'] + debug_render_invoke = [ + 'has_more', 'items', 'has_items', 'items_per_page', + 'items_this_page', 'prev_page_number', 'this_page_number', + 'next_page_number', 'prev_page', 'next_page', + 'total_item_count', 'total_page_count', + 'next_item', 'prev_item'] - def __init__(self, page, source, uri, page_num=1, pgn_filter=None, - items_per_page=-1): + def __init__(self, page, source, page_num=1, pgn_filter=None, + items_per_page=-1): self._parent_page = page self._source = source - self._uri = uri self._page_num = page_num + self._route = None self._iterator = None self._pgn_filter = pgn_filter self._items_per_page = items_per_page @@ -185,11 +187,13 @@ return if self._source is None: - raise Exception("Can't load pagination data: no source has been defined.") + raise Exception("Can't load pagination data: no source has " + "been defined.") pag_filter = self._getPaginationFilter() offset = (self._page_num - 1) * self.items_per_page - self._iterator = PageIterator(self._source, + self._iterator = PageIterator( + self._source, current_page=self._parent_page, pagination_filter=pag_filter, offset=offset, limit=self.items_per_page, @@ -210,12 +214,17 @@ return f def _getPageUri(self, index): - uri = self._uri - if index > 1: - if len(uri) > 0 and not uri.endswith('/'): - uri += '/' - uri += str(index) - return uri + if self._route is None: + app = self._source.app + self._route = app.getRoute(self._parent_page.source.name, + self._parent_page.source_metadata) + if self._route is None: + raise Exception("Can't get route for page: %s" % + self._parent_page.path) + + return self._route.getUri(self._parent_page.source_metadata, + provider=self._parent_page, + sub_num=index) def _onIteration(self): if self._parent_page is not None and not self._pgn_set_on_ctx: