Mercurial > piecrust2
annotate piecrust/dataproviders/pageiterator.py @ 1175:d0f86d9a9d40
wsgi: Better logging for the admin app.
author | Ludovic Chabant <ludovic@chabant.com> |
---|---|
date | Thu, 21 May 2020 21:55:41 -0700 |
parents | a9a592f655e3 |
children |
rev | line source |
---|---|
854
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
1 import logging |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
2 from piecrust.data.filters import PaginationFilter |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
3 from piecrust.data.paginationdata import PaginationData |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
4 from piecrust.events import Event |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
5 from piecrust.dataproviders.base import DataProvider |
877
d6d35b2efd04
bake: Rename "pass" to "step" and make the page pipeline use different steps.
Ludovic Chabant <ludovic@chabant.com>
parents:
867
diff
changeset
|
6 from piecrust.sources.base import ContentSource |
854
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
7 |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
8 |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
9 logger = logging.getLogger(__name__) |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
10 |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
11 |
979
45ad976712ec
tests: Big push to get the tests to pass again.
Ludovic Chabant <ludovic@chabant.com>
parents:
939
diff
changeset
|
12 class _CombinedSource: |
45ad976712ec
tests: Big push to get the tests to pass again.
Ludovic Chabant <ludovic@chabant.com>
parents:
939
diff
changeset
|
13 def __init__(self, sources): |
45ad976712ec
tests: Big push to get the tests to pass again.
Ludovic Chabant <ludovic@chabant.com>
parents:
939
diff
changeset
|
14 self.sources = sources |
45ad976712ec
tests: Big push to get the tests to pass again.
Ludovic Chabant <ludovic@chabant.com>
parents:
939
diff
changeset
|
15 self.app = sources[0].app |
45ad976712ec
tests: Big push to get the tests to pass again.
Ludovic Chabant <ludovic@chabant.com>
parents:
939
diff
changeset
|
16 self.name = None |
45ad976712ec
tests: Big push to get the tests to pass again.
Ludovic Chabant <ludovic@chabant.com>
parents:
939
diff
changeset
|
17 |
45ad976712ec
tests: Big push to get the tests to pass again.
Ludovic Chabant <ludovic@chabant.com>
parents:
939
diff
changeset
|
18 # This is for recursive traversal of the iterator chain. |
45ad976712ec
tests: Big push to get the tests to pass again.
Ludovic Chabant <ludovic@chabant.com>
parents:
939
diff
changeset
|
19 # See later in `PageIterator`. |
854
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
20 self.it = None |
979
45ad976712ec
tests: Big push to get the tests to pass again.
Ludovic Chabant <ludovic@chabant.com>
parents:
939
diff
changeset
|
21 |
45ad976712ec
tests: Big push to get the tests to pass again.
Ludovic Chabant <ludovic@chabant.com>
parents:
939
diff
changeset
|
22 def __iter__(self): |
45ad976712ec
tests: Big push to get the tests to pass again.
Ludovic Chabant <ludovic@chabant.com>
parents:
939
diff
changeset
|
23 sources = self.sources |
45ad976712ec
tests: Big push to get the tests to pass again.
Ludovic Chabant <ludovic@chabant.com>
parents:
939
diff
changeset
|
24 |
45ad976712ec
tests: Big push to get the tests to pass again.
Ludovic Chabant <ludovic@chabant.com>
parents:
939
diff
changeset
|
25 if len(sources) == 1: |
45ad976712ec
tests: Big push to get the tests to pass again.
Ludovic Chabant <ludovic@chabant.com>
parents:
939
diff
changeset
|
26 source = sources[0] |
45ad976712ec
tests: Big push to get the tests to pass again.
Ludovic Chabant <ludovic@chabant.com>
parents:
939
diff
changeset
|
27 self.name = source.name |
45ad976712ec
tests: Big push to get the tests to pass again.
Ludovic Chabant <ludovic@chabant.com>
parents:
939
diff
changeset
|
28 yield from source.getAllPages() |
45ad976712ec
tests: Big push to get the tests to pass again.
Ludovic Chabant <ludovic@chabant.com>
parents:
939
diff
changeset
|
29 self.name = None |
45ad976712ec
tests: Big push to get the tests to pass again.
Ludovic Chabant <ludovic@chabant.com>
parents:
939
diff
changeset
|
30 return |
45ad976712ec
tests: Big push to get the tests to pass again.
Ludovic Chabant <ludovic@chabant.com>
parents:
939
diff
changeset
|
31 |
45ad976712ec
tests: Big push to get the tests to pass again.
Ludovic Chabant <ludovic@chabant.com>
parents:
939
diff
changeset
|
32 # Return the pages from all the combined sources, but skip |
45ad976712ec
tests: Big push to get the tests to pass again.
Ludovic Chabant <ludovic@chabant.com>
parents:
939
diff
changeset
|
33 # those that are "overridden" -- e.g. a theme page that gets |
45ad976712ec
tests: Big push to get the tests to pass again.
Ludovic Chabant <ludovic@chabant.com>
parents:
939
diff
changeset
|
34 # replaced by a user page of the same name. |
45ad976712ec
tests: Big push to get the tests to pass again.
Ludovic Chabant <ludovic@chabant.com>
parents:
939
diff
changeset
|
35 used_uris = set() |
45ad976712ec
tests: Big push to get the tests to pass again.
Ludovic Chabant <ludovic@chabant.com>
parents:
939
diff
changeset
|
36 for source in sources: |
45ad976712ec
tests: Big push to get the tests to pass again.
Ludovic Chabant <ludovic@chabant.com>
parents:
939
diff
changeset
|
37 self.name = source.name |
45ad976712ec
tests: Big push to get the tests to pass again.
Ludovic Chabant <ludovic@chabant.com>
parents:
939
diff
changeset
|
38 for page in source.getAllPages(): |
45ad976712ec
tests: Big push to get the tests to pass again.
Ludovic Chabant <ludovic@chabant.com>
parents:
939
diff
changeset
|
39 page_uri = page.getUri() |
45ad976712ec
tests: Big push to get the tests to pass again.
Ludovic Chabant <ludovic@chabant.com>
parents:
939
diff
changeset
|
40 if page_uri not in used_uris: |
45ad976712ec
tests: Big push to get the tests to pass again.
Ludovic Chabant <ludovic@chabant.com>
parents:
939
diff
changeset
|
41 used_uris.add(page_uri) |
45ad976712ec
tests: Big push to get the tests to pass again.
Ludovic Chabant <ludovic@chabant.com>
parents:
939
diff
changeset
|
42 yield page |
45ad976712ec
tests: Big push to get the tests to pass again.
Ludovic Chabant <ludovic@chabant.com>
parents:
939
diff
changeset
|
43 |
45ad976712ec
tests: Big push to get the tests to pass again.
Ludovic Chabant <ludovic@chabant.com>
parents:
939
diff
changeset
|
44 self.name = None |
854
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
45 |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
46 |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
47 class PageIteratorDataProvider(DataProvider): |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
48 """ A data provider that reads a content source as a list of pages. |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
49 |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
50 This class supports wrapping another `PageIteratorDataProvider` |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
51 instance because several sources may want to be merged under the |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
52 same data endpoint (e.g. `site.pages` which lists both the user |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
53 pages and the theme pages). |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
54 """ |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
55 PROVIDER_NAME = 'page_iterator' |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
56 |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
57 debug_render_doc_dynamic = ['_debugRenderDoc'] |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
58 debug_render_not_empty = True |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
59 |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
60 def __init__(self, source, page): |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
61 super().__init__(source, page) |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
62 self._app = source.app |
979
45ad976712ec
tests: Big push to get the tests to pass again.
Ludovic Chabant <ludovic@chabant.com>
parents:
939
diff
changeset
|
63 self._it = None |
45ad976712ec
tests: Big push to get the tests to pass again.
Ludovic Chabant <ludovic@chabant.com>
parents:
939
diff
changeset
|
64 self._iterated = False |
854
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
65 |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
66 def __len__(self): |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
67 self._load() |
979
45ad976712ec
tests: Big push to get the tests to pass again.
Ludovic Chabant <ludovic@chabant.com>
parents:
939
diff
changeset
|
68 return len(self._it) |
854
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
69 |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
70 def __iter__(self): |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
71 self._load() |
979
45ad976712ec
tests: Big push to get the tests to pass again.
Ludovic Chabant <ludovic@chabant.com>
parents:
939
diff
changeset
|
72 yield from self._it |
854
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
73 |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
74 def _load(self): |
979
45ad976712ec
tests: Big push to get the tests to pass again.
Ludovic Chabant <ludovic@chabant.com>
parents:
939
diff
changeset
|
75 if self._it is not None: |
854
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
76 return |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
77 |
979
45ad976712ec
tests: Big push to get the tests to pass again.
Ludovic Chabant <ludovic@chabant.com>
parents:
939
diff
changeset
|
78 combined_source = _CombinedSource(list(reversed(self._sources))) |
45ad976712ec
tests: Big push to get the tests to pass again.
Ludovic Chabant <ludovic@chabant.com>
parents:
939
diff
changeset
|
79 self._it = PageIterator(combined_source, current_page=self._page) |
982
492b66482f12
pagination: Fix bad bug where all pages triggered pagination.
Ludovic Chabant <ludovic@chabant.com>
parents:
979
diff
changeset
|
80 self._it._load_event += self._onIteration |
854
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
81 |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
82 def _onIteration(self, it): |
979
45ad976712ec
tests: Big push to get the tests to pass again.
Ludovic Chabant <ludovic@chabant.com>
parents:
939
diff
changeset
|
83 if not self._iterated: |
854
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
84 rcs = self._app.env.render_ctx_stack |
1081
d4e0c53aa6e8
serve: Fix debug rendering for page iterators.
Ludovic Chabant <ludovic@chabant.com>
parents:
982
diff
changeset
|
85 if rcs.current_ctx is not None: |
d4e0c53aa6e8
serve: Fix debug rendering for page iterators.
Ludovic Chabant <ludovic@chabant.com>
parents:
982
diff
changeset
|
86 rcs.current_ctx.addUsedSource(it._source) |
979
45ad976712ec
tests: Big push to get the tests to pass again.
Ludovic Chabant <ludovic@chabant.com>
parents:
939
diff
changeset
|
87 self._iterated = True |
45ad976712ec
tests: Big push to get the tests to pass again.
Ludovic Chabant <ludovic@chabant.com>
parents:
939
diff
changeset
|
88 |
45ad976712ec
tests: Big push to get the tests to pass again.
Ludovic Chabant <ludovic@chabant.com>
parents:
939
diff
changeset
|
89 def _addSource(self, source): |
45ad976712ec
tests: Big push to get the tests to pass again.
Ludovic Chabant <ludovic@chabant.com>
parents:
939
diff
changeset
|
90 if self._it is not None: |
45ad976712ec
tests: Big push to get the tests to pass again.
Ludovic Chabant <ludovic@chabant.com>
parents:
939
diff
changeset
|
91 raise Exception("Can't add sources after the data provider " |
45ad976712ec
tests: Big push to get the tests to pass again.
Ludovic Chabant <ludovic@chabant.com>
parents:
939
diff
changeset
|
92 "has been loaded.") |
45ad976712ec
tests: Big push to get the tests to pass again.
Ludovic Chabant <ludovic@chabant.com>
parents:
939
diff
changeset
|
93 super()._addSource(source) |
854
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
94 |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
95 def _debugRenderDoc(self): |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
96 return 'Provides a list of %d items' % len(self) |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
97 |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
98 |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
99 class PageIterator: |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
100 def __init__(self, source, *, current_page=None): |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
101 self._source = source |
979
45ad976712ec
tests: Big push to get the tests to pass again.
Ludovic Chabant <ludovic@chabant.com>
parents:
939
diff
changeset
|
102 self._is_content_source = isinstance( |
45ad976712ec
tests: Big push to get the tests to pass again.
Ludovic Chabant <ludovic@chabant.com>
parents:
939
diff
changeset
|
103 source, (ContentSource, _CombinedSource)) |
854
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
104 self._cache = None |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
105 self._pagination_slicer = None |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
106 self._has_sorter = False |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
107 self._next_page = None |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
108 self._prev_page = None |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
109 self._locked = False |
982
492b66482f12
pagination: Fix bad bug where all pages triggered pagination.
Ludovic Chabant <ludovic@chabant.com>
parents:
979
diff
changeset
|
110 self._load_event = Event() |
854
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
111 self._iter_event = Event() |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
112 self._current_page = current_page |
867
757fba54bfd3
refactor: Improve pagination and iterators to work with other sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
856
diff
changeset
|
113 self._initIterator() |
854
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
114 |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
115 @property |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
116 def total_count(self): |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
117 self._load() |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
118 if self._pagination_slicer is not None: |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
119 return self._pagination_slicer.inner_count |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
120 return len(self._cache) |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
121 |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
122 @property |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
123 def next_page(self): |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
124 self._load() |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
125 return self._next_page |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
126 |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
127 @property |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
128 def prev_page(self): |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
129 self._load() |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
130 return self._prev_page |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
131 |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
132 def __len__(self): |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
133 self._load() |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
134 return len(self._cache) |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
135 |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
136 def __getitem__(self, key): |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
137 self._load() |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
138 return self._cache[key] |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
139 |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
140 def __iter__(self): |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
141 self._load() |
982
492b66482f12
pagination: Fix bad bug where all pages triggered pagination.
Ludovic Chabant <ludovic@chabant.com>
parents:
979
diff
changeset
|
142 self._iter_event.fire(self) |
854
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
143 return iter(self._cache) |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
144 |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
145 def __getattr__(self, name): |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
146 if name[:3] == 'is_' or name[:3] == 'in_': |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
147 def is_filter(value): |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
148 conf = {'is_%s' % name[3:]: value} |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
149 return self._simpleNonSortedWrap(SettingFilterIterator, conf) |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
150 return is_filter |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
151 |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
152 if name[:4] == 'has_': |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
153 def has_filter(value): |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
154 conf = {name: value} |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
155 return self._simpleNonSortedWrap(SettingFilterIterator, conf) |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
156 return has_filter |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
157 |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
158 if name[:5] == 'with_': |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
159 def has_filter(value): |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
160 conf = {'has_%s' % name[5:]: value} |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
161 return self._simpleNonSortedWrap(SettingFilterIterator, conf) |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
162 return has_filter |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
163 |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
164 return self.__getattribute__(name) |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
165 |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
166 def skip(self, count): |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
167 return self._simpleWrap(SliceIterator, count) |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
168 |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
169 def limit(self, count): |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
170 return self._simpleWrap(SliceIterator, 0, count) |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
171 |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
172 def slice(self, skip, limit): |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
173 return self._simpleWrap(SliceIterator, skip, limit) |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
174 |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
175 def filter(self, filter_name): |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
176 if self._current_page is None: |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
177 raise Exception("Can't use `filter()` because no parent page was " |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
178 "set for this page iterator.") |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
179 filter_conf = self._current_page.config.get(filter_name) |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
180 if filter_conf is None: |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
181 raise Exception("Couldn't find filter '%s' in the configuration " |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
182 "header for page: %s" % |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
183 (filter_name, self._current_page.path)) |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
184 return self._simpleNonSortedWrap(SettingFilterIterator, filter_conf) |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
185 |
979
45ad976712ec
tests: Big push to get the tests to pass again.
Ludovic Chabant <ludovic@chabant.com>
parents:
939
diff
changeset
|
186 def sort(self, setting_name=None, reverse=False): |
45ad976712ec
tests: Big push to get the tests to pass again.
Ludovic Chabant <ludovic@chabant.com>
parents:
939
diff
changeset
|
187 if setting_name: |
45ad976712ec
tests: Big push to get the tests to pass again.
Ludovic Chabant <ludovic@chabant.com>
parents:
939
diff
changeset
|
188 self._wrapAsSort(SettingSortIterator, setting_name, reverse) |
45ad976712ec
tests: Big push to get the tests to pass again.
Ludovic Chabant <ludovic@chabant.com>
parents:
939
diff
changeset
|
189 else: |
45ad976712ec
tests: Big push to get the tests to pass again.
Ludovic Chabant <ludovic@chabant.com>
parents:
939
diff
changeset
|
190 self._wrapAsSort(NaturalSortIterator, reverse) |
854
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
191 return self |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
192 |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
193 def reset(self): |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
194 self._ensureUnlocked() |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
195 self._unload() |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
196 return self |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
197 |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
198 @property |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
199 def _is_loaded(self): |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
200 return self._cache is not None |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
201 |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
202 @property |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
203 def _has_more(self): |
979
45ad976712ec
tests: Big push to get the tests to pass again.
Ludovic Chabant <ludovic@chabant.com>
parents:
939
diff
changeset
|
204 self._load() |
854
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
205 if self._pagination_slicer: |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
206 return self._pagination_slicer.has_more |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
207 return False |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
208 |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
209 def _simpleWrap(self, it_class, *args, **kwargs): |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
210 self._ensureUnlocked() |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
211 self._ensureUnloaded() |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
212 self._ensureSorter() |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
213 self._it = it_class(self._it, *args, **kwargs) |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
214 if self._pagination_slicer is None and it_class is SliceIterator: |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
215 self._pagination_slicer = self._it |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
216 self._pagination_slicer.current_page = self._current_page |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
217 return self |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
218 |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
219 def _simpleNonSortedWrap(self, it_class, *args, **kwargs): |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
220 self._ensureUnlocked() |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
221 self._ensureUnloaded() |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
222 self._it = it_class(self._it, *args, **kwargs) |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
223 return self |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
224 |
856
9bb22bbe093c
refactor: Make the blog archives functional again.
Ludovic Chabant <ludovic@chabant.com>
parents:
854
diff
changeset
|
225 def _wrapAsSort(self, sort_it_class, *args, **kwargs): |
9bb22bbe093c
refactor: Make the blog archives functional again.
Ludovic Chabant <ludovic@chabant.com>
parents:
854
diff
changeset
|
226 self._ensureUnlocked() |
9bb22bbe093c
refactor: Make the blog archives functional again.
Ludovic Chabant <ludovic@chabant.com>
parents:
854
diff
changeset
|
227 self._ensureUnloaded() |
9bb22bbe093c
refactor: Make the blog archives functional again.
Ludovic Chabant <ludovic@chabant.com>
parents:
854
diff
changeset
|
228 self._it = sort_it_class(self._it, *args, **kwargs) |
9bb22bbe093c
refactor: Make the blog archives functional again.
Ludovic Chabant <ludovic@chabant.com>
parents:
854
diff
changeset
|
229 self._has_sorter = True |
9bb22bbe093c
refactor: Make the blog archives functional again.
Ludovic Chabant <ludovic@chabant.com>
parents:
854
diff
changeset
|
230 return self |
9bb22bbe093c
refactor: Make the blog archives functional again.
Ludovic Chabant <ludovic@chabant.com>
parents:
854
diff
changeset
|
231 |
854
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
232 def _lockIterator(self): |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
233 self._ensureUnlocked() |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
234 self._locked = True |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
235 |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
236 def _ensureUnlocked(self): |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
237 if self._locked: |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
238 raise Exception( |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
239 "This page iterator has been locked and can't be modified.") |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
240 |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
241 def _ensureUnloaded(self): |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
242 if self._cache: |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
243 raise Exception( |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
244 "This page iterator has already been iterated upon and " |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
245 "can't be modified anymore.") |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
246 |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
247 def _ensureSorter(self): |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
248 if self._has_sorter: |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
249 return |
867
757fba54bfd3
refactor: Improve pagination and iterators to work with other sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
856
diff
changeset
|
250 if self._is_content_source: |
939
abc52a6262a1
bake: Support the `draft` setting.
Ludovic Chabant <ludovic@chabant.com>
parents:
905
diff
changeset
|
251 # For content sources, the default sorting is reverse |
abc52a6262a1
bake: Support the `draft` setting.
Ludovic Chabant <ludovic@chabant.com>
parents:
905
diff
changeset
|
252 # date/time sorting. |
867
757fba54bfd3
refactor: Improve pagination and iterators to work with other sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
856
diff
changeset
|
253 self._it = DateSortIterator(self._it, reverse=True) |
854
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
254 self._has_sorter = True |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
255 |
867
757fba54bfd3
refactor: Improve pagination and iterators to work with other sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
856
diff
changeset
|
256 def _initIterator(self): |
757fba54bfd3
refactor: Improve pagination and iterators to work with other sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
856
diff
changeset
|
257 if self._is_content_source: |
979
45ad976712ec
tests: Big push to get the tests to pass again.
Ludovic Chabant <ludovic@chabant.com>
parents:
939
diff
changeset
|
258 if isinstance(self._source, _CombinedSource): |
45ad976712ec
tests: Big push to get the tests to pass again.
Ludovic Chabant <ludovic@chabant.com>
parents:
939
diff
changeset
|
259 self._it = self._source |
45ad976712ec
tests: Big push to get the tests to pass again.
Ludovic Chabant <ludovic@chabant.com>
parents:
939
diff
changeset
|
260 else: |
45ad976712ec
tests: Big push to get the tests to pass again.
Ludovic Chabant <ludovic@chabant.com>
parents:
939
diff
changeset
|
261 self._it = PageContentSourceIterator(self._source) |
45ad976712ec
tests: Big push to get the tests to pass again.
Ludovic Chabant <ludovic@chabant.com>
parents:
939
diff
changeset
|
262 |
939
abc52a6262a1
bake: Support the `draft` setting.
Ludovic Chabant <ludovic@chabant.com>
parents:
905
diff
changeset
|
263 app = self._source.app |
abc52a6262a1
bake: Support the `draft` setting.
Ludovic Chabant <ludovic@chabant.com>
parents:
905
diff
changeset
|
264 if app.config.get('baker/is_baking'): |
abc52a6262a1
bake: Support the `draft` setting.
Ludovic Chabant <ludovic@chabant.com>
parents:
905
diff
changeset
|
265 # While baking, automatically exclude any page with |
abc52a6262a1
bake: Support the `draft` setting.
Ludovic Chabant <ludovic@chabant.com>
parents:
905
diff
changeset
|
266 # the `draft` setting. |
abc52a6262a1
bake: Support the `draft` setting.
Ludovic Chabant <ludovic@chabant.com>
parents:
905
diff
changeset
|
267 draft_setting = app.config['baker/no_bake_setting'] |
abc52a6262a1
bake: Support the `draft` setting.
Ludovic Chabant <ludovic@chabant.com>
parents:
905
diff
changeset
|
268 self._it = NoDraftsIterator(self._it, draft_setting) |
1153
a9a592f655e3
config: Add setting for enabling baking or serving posts in the future.
Ludovic Chabant <ludovic@chabant.com>
parents:
1081
diff
changeset
|
269 |
a9a592f655e3
config: Add setting for enabling baking or serving posts in the future.
Ludovic Chabant <ludovic@chabant.com>
parents:
1081
diff
changeset
|
270 if not app.config.get('baker/bake_future'): |
a9a592f655e3
config: Add setting for enabling baking or serving posts in the future.
Ludovic Chabant <ludovic@chabant.com>
parents:
1081
diff
changeset
|
271 # Don't bake pages from the future. |
a9a592f655e3
config: Add setting for enabling baking or serving posts in the future.
Ludovic Chabant <ludovic@chabant.com>
parents:
1081
diff
changeset
|
272 self._it = PruneFutureIterator(self._it, |
a9a592f655e3
config: Add setting for enabling baking or serving posts in the future.
Ludovic Chabant <ludovic@chabant.com>
parents:
1081
diff
changeset
|
273 app.env.start_datetime) |
a9a592f655e3
config: Add setting for enabling baking or serving posts in the future.
Ludovic Chabant <ludovic@chabant.com>
parents:
1081
diff
changeset
|
274 elif app.config.get('server/is_serving'): |
a9a592f655e3
config: Add setting for enabling baking or serving posts in the future.
Ludovic Chabant <ludovic@chabant.com>
parents:
1081
diff
changeset
|
275 if not app.config.get('server/serve_future'): |
a9a592f655e3
config: Add setting for enabling baking or serving posts in the future.
Ludovic Chabant <ludovic@chabant.com>
parents:
1081
diff
changeset
|
276 # Don't serve pages from the future. |
a9a592f655e3
config: Add setting for enabling baking or serving posts in the future.
Ludovic Chabant <ludovic@chabant.com>
parents:
1081
diff
changeset
|
277 self._it = PruneFutureIterator(self._it, |
a9a592f655e3
config: Add setting for enabling baking or serving posts in the future.
Ludovic Chabant <ludovic@chabant.com>
parents:
1081
diff
changeset
|
278 app.env.start_datetime) |
867
757fba54bfd3
refactor: Improve pagination and iterators to work with other sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
856
diff
changeset
|
279 else: |
757fba54bfd3
refactor: Improve pagination and iterators to work with other sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
856
diff
changeset
|
280 self._it = GenericSourceIterator(self._source) |
757fba54bfd3
refactor: Improve pagination and iterators to work with other sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
856
diff
changeset
|
281 |
854
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
282 def _unload(self): |
867
757fba54bfd3
refactor: Improve pagination and iterators to work with other sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
856
diff
changeset
|
283 self._initIterator() |
854
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
284 self._cache = None |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
285 self._paginationSlicer = None |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
286 self._has_sorter = False |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
287 self._next_page = None |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
288 self._prev_page = None |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
289 |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
290 def _load(self): |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
291 if self._cache is not None: |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
292 return |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
293 |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
294 self._ensureSorter() |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
295 |
867
757fba54bfd3
refactor: Improve pagination and iterators to work with other sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
856
diff
changeset
|
296 if self._is_content_source: |
757fba54bfd3
refactor: Improve pagination and iterators to work with other sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
856
diff
changeset
|
297 self._it = PaginationDataBuilderIterator(self._it) |
757fba54bfd3
refactor: Improve pagination and iterators to work with other sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
856
diff
changeset
|
298 |
757fba54bfd3
refactor: Improve pagination and iterators to work with other sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
856
diff
changeset
|
299 self._cache = list(self._it) |
854
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
300 |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
301 if (self._current_page is not None and |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
302 self._pagination_slicer is not None): |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
303 pn = [self._pagination_slicer.prev_page, |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
304 self._pagination_slicer.next_page] |
867
757fba54bfd3
refactor: Improve pagination and iterators to work with other sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
856
diff
changeset
|
305 pn_it = PaginationDataBuilderIterator(iter(pn)) |
854
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
306 self._prev_page, self._next_page = (list(pn_it)) |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
307 |
982
492b66482f12
pagination: Fix bad bug where all pages triggered pagination.
Ludovic Chabant <ludovic@chabant.com>
parents:
979
diff
changeset
|
308 self._load_event.fire(self) |
854
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
309 |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
310 def _debugRenderDoc(self): |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
311 return "Contains %d items" % len(self) |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
312 |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
313 |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
314 class SettingFilterIterator: |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
315 def __init__(self, it, fil_conf): |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
316 self.it = it |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
317 self.fil_conf = fil_conf |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
318 self._fil = None |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
319 |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
320 def __iter__(self): |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
321 if self._fil is None: |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
322 self._fil = PaginationFilter() |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
323 self._fil.addClausesFromConfig(self.fil_conf) |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
324 |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
325 for i in self.it: |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
326 if self._fil.pageMatches(i): |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
327 yield i |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
328 |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
329 |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
330 class HardCodedFilterIterator: |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
331 def __init__(self, it, fil): |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
332 self.it = it |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
333 self._fil = fil |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
334 |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
335 def __iter__(self): |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
336 for i in self.it: |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
337 if self._fil.pageMatches(i): |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
338 yield i |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
339 |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
340 |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
341 class SliceIterator: |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
342 def __init__(self, it, offset=0, limit=-1): |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
343 self.it = it |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
344 self.offset = offset |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
345 self.limit = limit |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
346 self.current_page = None |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
347 self.has_more = False |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
348 self.inner_count = -1 |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
349 self.next_page = None |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
350 self.prev_page = None |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
351 self._cache = None |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
352 |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
353 def __iter__(self): |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
354 if self._cache is None: |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
355 inner_list = list(self.it) |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
356 self.inner_count = len(inner_list) |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
357 |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
358 if self.limit > 0: |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
359 self.has_more = self.inner_count > (self.offset + self.limit) |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
360 self._cache = inner_list[self.offset:self.offset + self.limit] |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
361 else: |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
362 self.has_more = False |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
363 self._cache = inner_list[self.offset:] |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
364 |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
365 if self.current_page: |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
366 try: |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
367 idx = inner_list.index(self.current_page) |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
368 except ValueError: |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
369 idx = -1 |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
370 if idx >= 0: |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
371 if idx < self.inner_count - 1: |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
372 self.next_page = inner_list[idx + 1] |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
373 if idx > 0: |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
374 self.prev_page = inner_list[idx - 1] |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
375 |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
376 return iter(self._cache) |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
377 |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
378 |
979
45ad976712ec
tests: Big push to get the tests to pass again.
Ludovic Chabant <ludovic@chabant.com>
parents:
939
diff
changeset
|
379 class NaturalSortIterator: |
45ad976712ec
tests: Big push to get the tests to pass again.
Ludovic Chabant <ludovic@chabant.com>
parents:
939
diff
changeset
|
380 def __init__(self, it, reverse=False): |
45ad976712ec
tests: Big push to get the tests to pass again.
Ludovic Chabant <ludovic@chabant.com>
parents:
939
diff
changeset
|
381 self.it = it |
45ad976712ec
tests: Big push to get the tests to pass again.
Ludovic Chabant <ludovic@chabant.com>
parents:
939
diff
changeset
|
382 self.reverse = reverse |
45ad976712ec
tests: Big push to get the tests to pass again.
Ludovic Chabant <ludovic@chabant.com>
parents:
939
diff
changeset
|
383 |
45ad976712ec
tests: Big push to get the tests to pass again.
Ludovic Chabant <ludovic@chabant.com>
parents:
939
diff
changeset
|
384 def __iter__(self): |
45ad976712ec
tests: Big push to get the tests to pass again.
Ludovic Chabant <ludovic@chabant.com>
parents:
939
diff
changeset
|
385 return iter(sorted(self.it, reverse=self.reverse)) |
45ad976712ec
tests: Big push to get the tests to pass again.
Ludovic Chabant <ludovic@chabant.com>
parents:
939
diff
changeset
|
386 |
45ad976712ec
tests: Big push to get the tests to pass again.
Ludovic Chabant <ludovic@chabant.com>
parents:
939
diff
changeset
|
387 |
854
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
388 class SettingSortIterator: |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
389 def __init__(self, it, name, reverse=False): |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
390 self.it = it |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
391 self.name = name |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
392 self.reverse = reverse |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
393 |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
394 def __iter__(self): |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
395 return iter(sorted(self.it, key=self._key_getter, |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
396 reverse=self.reverse)) |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
397 |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
398 def _key_getter(self, item): |
979
45ad976712ec
tests: Big push to get the tests to pass again.
Ludovic Chabant <ludovic@chabant.com>
parents:
939
diff
changeset
|
399 key = item.config.get(self.name) |
854
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
400 if key is None: |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
401 return 0 |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
402 return key |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
403 |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
404 |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
405 class DateSortIterator: |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
406 def __init__(self, it, reverse=True): |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
407 self.it = it |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
408 self.reverse = reverse |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
409 |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
410 def __iter__(self): |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
411 return iter(sorted(self.it, |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
412 key=lambda x: x.datetime, reverse=self.reverse)) |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
413 |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
414 |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
415 class PageContentSourceIterator: |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
416 def __init__(self, source): |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
417 self.source = source |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
418 |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
419 # This is to permit recursive traversal of the |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
420 # iterator chain. It acts as the end. |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
421 self.it = None |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
422 |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
423 def __iter__(self): |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
424 source = self.source |
905
1d0364614665
internal: Sources can cache their pages in addition to their items.
Ludovic Chabant <ludovic@chabant.com>
parents:
877
diff
changeset
|
425 yield from source.getAllPages() |
854
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
426 |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
427 |
939
abc52a6262a1
bake: Support the `draft` setting.
Ludovic Chabant <ludovic@chabant.com>
parents:
905
diff
changeset
|
428 class NoDraftsIterator: |
abc52a6262a1
bake: Support the `draft` setting.
Ludovic Chabant <ludovic@chabant.com>
parents:
905
diff
changeset
|
429 def __init__(self, source, no_draft_setting): |
abc52a6262a1
bake: Support the `draft` setting.
Ludovic Chabant <ludovic@chabant.com>
parents:
905
diff
changeset
|
430 self.it = source |
abc52a6262a1
bake: Support the `draft` setting.
Ludovic Chabant <ludovic@chabant.com>
parents:
905
diff
changeset
|
431 self.no_draft_setting = no_draft_setting |
abc52a6262a1
bake: Support the `draft` setting.
Ludovic Chabant <ludovic@chabant.com>
parents:
905
diff
changeset
|
432 |
abc52a6262a1
bake: Support the `draft` setting.
Ludovic Chabant <ludovic@chabant.com>
parents:
905
diff
changeset
|
433 def __iter__(self): |
abc52a6262a1
bake: Support the `draft` setting.
Ludovic Chabant <ludovic@chabant.com>
parents:
905
diff
changeset
|
434 nds = self.no_draft_setting |
abc52a6262a1
bake: Support the `draft` setting.
Ludovic Chabant <ludovic@chabant.com>
parents:
905
diff
changeset
|
435 yield from filter(lambda i: not i.config.get(nds), self.it) |
abc52a6262a1
bake: Support the `draft` setting.
Ludovic Chabant <ludovic@chabant.com>
parents:
905
diff
changeset
|
436 |
abc52a6262a1
bake: Support the `draft` setting.
Ludovic Chabant <ludovic@chabant.com>
parents:
905
diff
changeset
|
437 |
1153
a9a592f655e3
config: Add setting for enabling baking or serving posts in the future.
Ludovic Chabant <ludovic@chabant.com>
parents:
1081
diff
changeset
|
438 class PruneFutureIterator: |
a9a592f655e3
config: Add setting for enabling baking or serving posts in the future.
Ludovic Chabant <ludovic@chabant.com>
parents:
1081
diff
changeset
|
439 def __init__(self, source, now_dt): |
a9a592f655e3
config: Add setting for enabling baking or serving posts in the future.
Ludovic Chabant <ludovic@chabant.com>
parents:
1081
diff
changeset
|
440 self.it = source |
a9a592f655e3
config: Add setting for enabling baking or serving posts in the future.
Ludovic Chabant <ludovic@chabant.com>
parents:
1081
diff
changeset
|
441 self.now_dt = now_dt |
a9a592f655e3
config: Add setting for enabling baking or serving posts in the future.
Ludovic Chabant <ludovic@chabant.com>
parents:
1081
diff
changeset
|
442 |
a9a592f655e3
config: Add setting for enabling baking or serving posts in the future.
Ludovic Chabant <ludovic@chabant.com>
parents:
1081
diff
changeset
|
443 def __iter__(self): |
a9a592f655e3
config: Add setting for enabling baking or serving posts in the future.
Ludovic Chabant <ludovic@chabant.com>
parents:
1081
diff
changeset
|
444 now_dt = self.now_dt |
a9a592f655e3
config: Add setting for enabling baking or serving posts in the future.
Ludovic Chabant <ludovic@chabant.com>
parents:
1081
diff
changeset
|
445 for i in self.it: |
a9a592f655e3
config: Add setting for enabling baking or serving posts in the future.
Ludovic Chabant <ludovic@chabant.com>
parents:
1081
diff
changeset
|
446 if i.datetime <= now_dt: |
a9a592f655e3
config: Add setting for enabling baking or serving posts in the future.
Ludovic Chabant <ludovic@chabant.com>
parents:
1081
diff
changeset
|
447 yield i |
a9a592f655e3
config: Add setting for enabling baking or serving posts in the future.
Ludovic Chabant <ludovic@chabant.com>
parents:
1081
diff
changeset
|
448 |
854
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
449 class PaginationDataBuilderIterator: |
867
757fba54bfd3
refactor: Improve pagination and iterators to work with other sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
856
diff
changeset
|
450 def __init__(self, it): |
854
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
451 self.it = it |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
452 |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
453 def __iter__(self): |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
454 for page in self.it: |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
455 if page is not None: |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
456 yield PaginationData(page) |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
457 else: |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
458 yield None |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
459 |
867
757fba54bfd3
refactor: Improve pagination and iterators to work with other sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
856
diff
changeset
|
460 |
757fba54bfd3
refactor: Improve pagination and iterators to work with other sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
856
diff
changeset
|
461 class GenericSourceIterator: |
757fba54bfd3
refactor: Improve pagination and iterators to work with other sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
856
diff
changeset
|
462 def __init__(self, source): |
757fba54bfd3
refactor: Improve pagination and iterators to work with other sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
856
diff
changeset
|
463 self.source = source |
757fba54bfd3
refactor: Improve pagination and iterators to work with other sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
856
diff
changeset
|
464 self.it = None |
757fba54bfd3
refactor: Improve pagination and iterators to work with other sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
856
diff
changeset
|
465 |
757fba54bfd3
refactor: Improve pagination and iterators to work with other sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
856
diff
changeset
|
466 def __iter__(self): |
757fba54bfd3
refactor: Improve pagination and iterators to work with other sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
856
diff
changeset
|
467 yield from self.source |