changeset 982:492b66482f12

pagination: Fix bad bug where all pages triggered pagination.
author Ludovic Chabant <ludovic@chabant.com>
date Mon, 30 Oct 2017 00:08:12 -0700
parents 45ad976712ec
children 7fe1151595bf
files piecrust/data/paginator.py piecrust/dataproviders/blog.py piecrust/dataproviders/pageiterator.py
diffstat 3 files changed, 11 insertions(+), 14 deletions(-) [+]
line wrap: on
line diff
--- a/piecrust/data/paginator.py	Sun Oct 29 22:51:57 2017 -0700
+++ b/piecrust/data/paginator.py	Mon Oct 30 00:08:12 2017 -0700
@@ -1,6 +1,7 @@
 import math
 import logging
 from werkzeug.utils import cached_property
+from piecrust.sources.base import ContentSource
 
 
 logger = logging.getLogger(__name__)
@@ -29,6 +30,7 @@
         self._pgn_filter = pgn_filter
         self._items_per_page = items_per_page
         self._pgn_set_on_ctx = False
+        self._is_content_source = isinstance(source, ContentSource)
 
     @property
     def is_loaded(self):
@@ -91,8 +93,7 @@
             if ipp is not None:
                 return ipp
 
-        from piecrust.sources.base import ContentSource
-        if isinstance(self._source, ContentSource):
+        if self._is_content_source:
             ipp = self._source.config.get('items_per_page')
             if ipp is not None:
                 return ipp
@@ -191,7 +192,6 @@
         from piecrust.data.filters import PaginationFilter
         from piecrust.dataproviders.pageiterator import (
             PageIterator, HardCodedFilterIterator)
-        from piecrust.sources.base import ContentSource
 
         self._iterator = PageIterator(
             self._source,
@@ -207,11 +207,10 @@
         limit = self.items_per_page
         self._iterator.slice(offset, limit)
 
-        self._iterator._lockIterator()
-        self._iterator._load()
+        if self._is_content_source:
+            self._iterator._iter_event += self._onIteration
 
-        if isinstance(self._source, ContentSource):
-            self._onIteration(self._iterator)
+        self._iterator._lockIterator()
 
     def _getPageUri(self, index):
         return self._page.getUri(index)
--- a/piecrust/dataproviders/blog.py	Sun Oct 29 22:51:57 2017 -0700
+++ b/piecrust/dataproviders/blog.py	Mon Oct 30 00:08:12 2017 -0700
@@ -70,7 +70,7 @@
     def _buildPosts(self):
         if self._posts is None:
             it = PageIterator(self._sources[0], current_page=self._page)
-            it._iter_event += self._onIteration
+            it._load_event += self._onIteration
             self._posts = it
 
     def _buildArchives(self):
--- a/piecrust/dataproviders/pageiterator.py	Sun Oct 29 22:51:57 2017 -0700
+++ b/piecrust/dataproviders/pageiterator.py	Mon Oct 30 00:08:12 2017 -0700
@@ -77,7 +77,7 @@
 
         combined_source = _CombinedSource(list(reversed(self._sources)))
         self._it = PageIterator(combined_source, current_page=self._page)
-        self._it._iter_event += self._onIteration
+        self._it._load_event += self._onIteration
 
     def _onIteration(self, it):
         if not self._iterated:
@@ -106,6 +106,7 @@
         self._next_page = None
         self._prev_page = None
         self._locked = False
+        self._load_event = Event()
         self._iter_event = Event()
         self._current_page = current_page
         self._initIterator()
@@ -137,6 +138,7 @@
 
     def __iter__(self):
         self._load()
+        self._iter_event.fire(self)
         return iter(self._cache)
 
     def __getattr__(self, name):
@@ -203,10 +205,6 @@
             return self._pagination_slicer.has_more
         return False
 
-    @property
-    def _is_loaded_and_has_more(self):
-        return self._is_loaded and self._has_more
-
     def _simpleWrap(self, it_class, *args, **kwargs):
         self._ensureUnlocked()
         self._ensureUnloaded()
@@ -296,7 +294,7 @@
             pn_it = PaginationDataBuilderIterator(iter(pn))
             self._prev_page, self._next_page = (list(pn_it))
 
-        self._iter_event.fire(self)
+        self._load_event.fire(self)
 
     def _debugRenderDoc(self):
         return "Contains %d items" % len(self)