comparison 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
comparison
equal deleted inserted replaced
853:f070a4fc033c 854:08e02c2a2a1a
88 88
89 ipp = self._page.config.get('items_per_page') 89 ipp = self._page.config.get('items_per_page')
90 if ipp is not None: 90 if ipp is not None:
91 return ipp 91 return ipp
92 92
93 ipp = self._source.config.get('items_per_page')
94 if ipp is not None:
95 return ipp
96
93 raise Exception("No way to figure out how many items to display " 97 raise Exception("No way to figure out how many items to display "
94 "per page.") 98 "per page.")
95 99
96 @property 100 @property
97 def items_this_page(self): 101 def items_this_page(self):
180 def _load(self): 184 def _load(self):
181 if self._iterator is not None: 185 if self._iterator is not None:
182 return 186 return
183 187
184 from piecrust.data.filters import PaginationFilter 188 from piecrust.data.filters import PaginationFilter
185 from piecrust.dataproviders.page_iterator import PageIterator 189 from piecrust.dataproviders.pageiterator import (
186 190 PageIterator, HardCodedFilterIterator)
187 pag_filter = PaginationFilter()
188 if self._pgn_filter is not None:
189 pag_filter.addClause(self._pgn_filter.root_clause)
190 191
191 self._iterator = PageIterator( 192 self._iterator = PageIterator(
192 self._source, 193 self._source,
193 current_page=self._page, 194 current_page=self._page)
194 pagination_filter=pag_filter, 195 #self._iterator._iter_event += self._onIteration
195 locked=True) 196
196 self._iterator._iter_event += self._onIteration 197 if self._pgn_filter is not None:
198 pag_fil = PaginationFilter()
199 pag_fil.addClause(self._pgn_filter.root_clause)
200 self._iterator._simpleNonSortedWrap(
201 HardCodedFilterIterator, pag_fil)
197 202
198 offset = (self._sub_num - 1) * self.items_per_page 203 offset = (self._sub_num - 1) * self.items_per_page
199 limit = self.items_per_page 204 limit = self.items_per_page
200 self._iterator.slice(offset, limit) 205 self._iterator.slice(offset, limit)
201 206
207 self._iterator._lockIterator()
208
209 self._onIteration(self._iterator)
210
202 def _getPageUri(self, index): 211 def _getPageUri(self, index):
203 return self._page.getUri(index) 212 return self._page.getUri(index)
204 213
205 def _onIteration(self): 214 def _onIteration(self, it):
206 if not self._pgn_set_on_ctx: 215 if not self._pgn_set_on_ctx:
207 eis = self._page.app.env.exec_info_stack 216 rcs = self._page.app.env.render_ctx_stack
208 eis.current_page_info.render_ctx.setPagination(self) 217 rcs.current_ctx.setPagination(self)
209 self._pgn_set_on_ctx = True 218 self._pgn_set_on_ctx = True
210 219