diff piecrust/data/paginator.py @ 854:08e02c2a2a1a

core: Keep refactoring, this time to prepare for generator sources. - Make a few APIs simpler. - Content pipelines create their own jobs, so that generator sources can keep aborting in `getContents`, but rely on their pipeline to generate pages for baking.
author Ludovic Chabant <ludovic@chabant.com>
date Sun, 04 Jun 2017 23:34:28 -0700
parents f070a4fc033c
children 757fba54bfd3
line wrap: on
line diff
--- a/piecrust/data/paginator.py	Sun May 21 00:06:59 2017 -0700
+++ b/piecrust/data/paginator.py	Sun Jun 04 23:34:28 2017 -0700
@@ -90,6 +90,10 @@
         if ipp is not None:
             return ipp
 
+        ipp = self._source.config.get('items_per_page')
+        if ipp is not None:
+            return ipp
+
         raise Exception("No way to figure out how many items to display "
                         "per page.")
 
@@ -182,29 +186,34 @@
             return
 
         from piecrust.data.filters import PaginationFilter
-        from piecrust.dataproviders.page_iterator import PageIterator
-
-        pag_filter = PaginationFilter()
-        if self._pgn_filter is not None:
-            pag_filter.addClause(self._pgn_filter.root_clause)
+        from piecrust.dataproviders.pageiterator import (
+            PageIterator, HardCodedFilterIterator)
 
         self._iterator = PageIterator(
             self._source,
-            current_page=self._page,
-            pagination_filter=pag_filter,
-            locked=True)
-        self._iterator._iter_event += self._onIteration
+            current_page=self._page)
+        #self._iterator._iter_event += self._onIteration
+
+        if self._pgn_filter is not None:
+            pag_fil = PaginationFilter()
+            pag_fil.addClause(self._pgn_filter.root_clause)
+            self._iterator._simpleNonSortedWrap(
+                HardCodedFilterIterator, pag_fil)
 
         offset = (self._sub_num - 1) * self.items_per_page
         limit = self.items_per_page
         self._iterator.slice(offset, limit)
 
+        self._iterator._lockIterator()
+
+        self._onIteration(self._iterator)
+
     def _getPageUri(self, index):
         return self._page.getUri(index)
 
-    def _onIteration(self):
+    def _onIteration(self, it):
         if not self._pgn_set_on_ctx:
-            eis = self._page.app.env.exec_info_stack
-            eis.current_page_info.render_ctx.setPagination(self)
+            rcs = self._page.app.env.render_ctx_stack
+            rcs.current_ctx.setPagination(self)
             self._pgn_set_on_ctx = True