Mercurial > piecrust2
comparison piecrust/data/provider.py @ 711:ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
* Taxonomies are now implemented one or more `TaxonomyGenerator`s.
* A `BlogArchivesGenerator` stub is there but non-functional.
author | Ludovic Chabant <ludovic@chabant.com> |
---|---|
date | Thu, 26 May 2016 19:52:47 -0700 |
parents | 703ea5d76f33 |
children | e4dcef2d5640 |
comparison
equal
deleted
inserted
replaced
710:e85f29b28b84 | 711:ab5c6a8ae90a |
---|---|
1 import time | 1 import time |
2 import collections.abc | 2 import collections.abc |
3 from piecrust.data.iterators import PageIterator | 3 from piecrust.data.iterators import PageIterator |
4 from piecrust.generation.taxonomy import Taxonomy | |
4 from piecrust.sources.array import ArraySource | 5 from piecrust.sources.array import ArraySource |
5 | 6 |
6 | 7 |
7 class DataProvider(object): | 8 class DataProvider(object): |
8 debug_render_dynamic = [] | 9 debug_render_dynamic = [] |
70 self._yearly = None | 71 self._yearly = None |
71 self._monthly = None | 72 self._monthly = None |
72 self._taxonomies = {} | 73 self._taxonomies = {} |
73 self._ctx_set = False | 74 self._ctx_set = False |
74 | 75 |
76 @property | |
77 def posts(self): | |
78 return self._posts() | |
79 | |
80 @property | |
81 def years(self): | |
82 return self._buildYearlyArchive() | |
83 | |
84 @property | |
85 def months(self): | |
86 return self._buildMonthlyArchive() | |
87 | |
75 def __getitem__(self, name): | 88 def __getitem__(self, name): |
76 if name == 'posts': | 89 if self._source.app.config.get('site/taxonomies/' + name) is not None: |
77 return self._posts() | |
78 elif name == 'years': | |
79 return self._buildYearlyArchive() | |
80 elif name == 'months': | |
81 return self._buildMonthlyArchive() | |
82 elif self._source.app.getTaxonomy(name) is not None: | |
83 return self._buildTaxonomy(name) | 90 return self._buildTaxonomy(name) |
84 raise KeyError("No such item: %s" % name) | 91 raise KeyError("No such item: %s" % name) |
85 | 92 |
86 def __iter__(self): | 93 def __iter__(self): |
87 keys = ['posts', 'years', 'months'] | 94 keys = ['posts', 'years', 'months'] |
88 keys += [t.name for t in self._source.app.taxonomies] | 95 keys += list(self._source.app.config.get('site/taxonomies').keys()) |
89 return iter(keys) | 96 return iter(keys) |
90 | 97 |
91 def __len__(self): | 98 def __len__(self): |
92 return 3 + len(self._source.app.taxonomies) | 99 return 3 + len(self._source.app.config.get('site/taxonomies')) |
93 | 100 |
94 def _debugRenderTaxonomies(self): | 101 def _debugRenderTaxonomies(self): |
95 return [t.name for t in self._source.app.taxonomies] | 102 return list(self._source.app.config.get('site/taxonomies').keys()) |
96 | 103 |
97 def _posts(self): | 104 def _posts(self): |
98 it = PageIterator(self._source, current_page=self._page) | 105 it = PageIterator(self._source, current_page=self._page) |
99 it._iter_event += self._onIteration | 106 it._iter_event += self._onIteration |
100 return it | 107 return it |
150 | 157 |
151 def _buildTaxonomy(self, tax_name): | 158 def _buildTaxonomy(self, tax_name): |
152 if tax_name in self._taxonomies: | 159 if tax_name in self._taxonomies: |
153 return self._taxonomies[tax_name] | 160 return self._taxonomies[tax_name] |
154 | 161 |
155 tax_info = self._page.app.getTaxonomy(tax_name) | 162 tax_cfg = self._page.app.config.get('site/taxonomies/' + tax_name) |
156 setting_name = tax_info.setting_name | 163 tax = Taxonomy(tax_name, tax_cfg) |
157 | 164 |
158 posts_by_tax_value = {} | 165 posts_by_tax_value = {} |
159 for post in self._source.getPages(): | 166 for post in self._source.getPages(): |
160 tax_values = post.config.get(setting_name) | 167 tax_values = post.config.get(tax.setting_name) |
161 if tax_values is None: | 168 if tax_values is None: |
162 continue | 169 continue |
163 if not isinstance(tax_values, list): | 170 if not isinstance(tax_values, list): |
164 tax_values = [tax_values] | 171 tax_values = [tax_values] |
165 for val in tax_values: | 172 for val in tax_values: |
166 posts_by_tax_value.setdefault(val, []) | 173 posts = posts_by_tax_value.setdefault(val, []) |
167 posts_by_tax_value[val].append(post) | 174 posts.append(post) |
168 | 175 |
169 entries = [] | 176 entries = [] |
170 for value, ds in posts_by_tax_value.items(): | 177 for value, ds in posts_by_tax_value.items(): |
171 source = ArraySource(self._page.app, ds) | 178 source = ArraySource(self._page.app, ds) |
172 entries.append(BlogTaxonomyEntry(self._page, source, value)) | 179 entries.append(BlogTaxonomyEntry(self._page, source, value)) |