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))