Mercurial > piecrust2
comparison piecrust/dataproviders/blog.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 | d231a10d18f9 |
comparison
equal
deleted
inserted
replaced
| 853:f070a4fc033c | 854:08e02c2a2a1a |
|---|---|
| 1 import time | 1 import time |
| 2 import collections.abc | 2 import collections.abc |
| 3 from piecrust.dataproviders.base import DataProvider | 3 from piecrust.dataproviders.base import DataProvider |
| 4 from piecrust.generation.taxonomy import Taxonomy | 4 from piecrust.dataproviders.pageiterator import PageIterator |
| 5 from piecrust.sources.taxonomy import Taxonomy | |
| 5 | 6 |
| 6 | 7 |
| 7 class BlogDataProvider(DataProvider, collections.abc.Mapping): | 8 class BlogDataProvider(DataProvider, collections.abc.Mapping): |
| 8 PROVIDER_NAME = 'blog' | 9 PROVIDER_NAME = 'blog' |
| 9 | 10 |
| 10 debug_render_doc = """Provides a list of blog posts and yearly/monthly | 11 debug_render_doc = """Provides a list of blog posts and yearly/monthly |
| 11 archives.""" | 12 archives.""" |
| 12 debug_render_dynamic = (['_debugRenderTaxonomies'] + | 13 debug_render_dynamic = (['_debugRenderTaxonomies'] + |
| 13 DataProvider.debug_render_dynamic) | 14 DataProvider.debug_render_dynamic) |
| 14 | 15 |
| 15 def __init__(self, source, page, override): | 16 def __init__(self, source, page): |
| 16 super(BlogDataProvider, self).__init__(source, page, override) | 17 super().__init__(source, page) |
| 17 self._yearly = None | 18 self._yearly = None |
| 18 self._monthly = None | 19 self._monthly = None |
| 19 self._taxonomies = {} | 20 self._taxonomies = {} |
| 20 self._ctx_set = False | 21 self._ctx_set = False |
| 21 | 22 |
| 70 year = post.datetime.strftime('%Y') | 71 year = post.datetime.strftime('%Y') |
| 71 | 72 |
| 72 posts_this_year = yearly_index.get(year) | 73 posts_this_year = yearly_index.get(year) |
| 73 if posts_this_year is None: | 74 if posts_this_year is None: |
| 74 timestamp = time.mktime( | 75 timestamp = time.mktime( |
| 75 (post.datetime.year, 1, 1, 0, 0, 0, 0, 0, -1)) | 76 (post.datetime.year, 1, 1, 0, 0, 0, 0, 0, -1)) |
| 76 posts_this_year = BlogArchiveEntry(self._page, year, timestamp) | 77 posts_this_year = BlogArchiveEntry(self._page, year, timestamp) |
| 77 self._yearly.append(posts_this_year) | 78 self._yearly.append(posts_this_year) |
| 78 yearly_index[year] = posts_this_year | 79 yearly_index[year] = posts_this_year |
| 79 | 80 |
| 80 posts_this_year._data_source.append(post) | 81 posts_this_year._data_source.append(post) |
| 81 self._yearly = sorted(self._yearly, | 82 self._yearly = sorted(self._yearly, |
| 82 key=lambda e: e.timestamp, | 83 key=lambda e: e.timestamp, |
| 83 reverse=True) | 84 reverse=True) |
| 84 self._onIteration() | 85 self._onIteration() |
| 85 return self._yearly | 86 return self._yearly |
| 86 | 87 |
| 87 def _buildMonthlyArchive(self): | 88 def _buildMonthlyArchive(self): |
| 88 if self._monthly is not None: | 89 if self._monthly is not None: |
| 91 self._monthly = [] | 92 self._monthly = [] |
| 92 for post in self._source.getPages(): | 93 for post in self._source.getPages(): |
| 93 month = post.datetime.strftime('%B %Y') | 94 month = post.datetime.strftime('%B %Y') |
| 94 | 95 |
| 95 posts_this_month = next( | 96 posts_this_month = next( |
| 96 filter(lambda m: m.name == month, self._monthly), | 97 filter(lambda m: m.name == month, self._monthly), |
| 97 None) | 98 None) |
| 98 if posts_this_month is None: | 99 if posts_this_month is None: |
| 99 timestamp = time.mktime( | 100 timestamp = time.mktime( |
| 100 (post.datetime.year, post.datetime.month, 1, | 101 (post.datetime.year, post.datetime.month, 1, |
| 101 0, 0, 0, 0, 0, -1)) | 102 0, 0, 0, 0, 0, -1)) |
| 102 posts_this_month = BlogArchiveEntry(self._page, month, timestamp) | 103 posts_this_month = BlogArchiveEntry( |
| 104 self._page, month, timestamp) | |
| 103 self._monthly.append(posts_this_month) | 105 self._monthly.append(posts_this_month) |
| 104 | 106 |
| 105 posts_this_month._data_source.append(post) | 107 posts_this_month._data_source.append(post) |
| 106 self._monthly = sorted(self._monthly, | 108 self._monthly = sorted(self._monthly, |
| 107 key=lambda e: e.timestamp, | 109 key=lambda e: e.timestamp, |
| 108 reverse=True) | 110 reverse=True) |
| 109 self._onIteration() | 111 self._onIteration() |
| 110 return self._monthly | 112 return self._monthly |
| 111 | 113 |
| 112 def _buildTaxonomy(self, tax_name): | 114 def _buildTaxonomy(self, tax_name): |
| 113 if tax_name in self._taxonomies: | 115 if tax_name in self._taxonomies: |
