comparison piecrust/generation/blogarchives.py @ 729:e35407c60e00

templating: Make blog archives generator expose more templating data. In addition to pagination data, also expose a non-paginating iterator that lists all posts in a source by chronological order.
author Ludovic Chabant <ludovic@chabant.com>
date Wed, 01 Jun 2016 22:09:21 -0700
parents 09115f0900f0
children 13ec290bfc13
comparison
equal deleted inserted replaced
728:e7481bbbb29f 729:e35407c60e00
1 import logging 1 import logging
2 import datetime 2 import datetime
3 from piecrust.chefutil import format_timed_scope
3 from piecrust.data.filters import PaginationFilter, IFilterClause 4 from piecrust.data.filters import PaginationFilter, IFilterClause
5 from piecrust.data.iterators import PageIterator
4 from piecrust.generation.base import PageGenerator 6 from piecrust.generation.base import PageGenerator
5 7
6 8
7 logger = logging.getLogger(__name__) 9 logger = logging.getLogger(__name__)
8 10
31 flt = PaginationFilter() 33 flt = PaginationFilter()
32 flt.addClause(IsFromYearFilterClause(year)) 34 flt.addClause(IsFromYearFilterClause(year))
33 ctx.pagination_filter = flt 35 ctx.pagination_filter = flt
34 36
35 ctx.custom_data['year'] = year 37 ctx.custom_data['year'] = year
38
39 flt2 = PaginationFilter()
40 flt2.addClause(IsFromYearFilterClause(year))
41 it = PageIterator(self.source, pagination_filter=flt2,
42 sorter=_date_sorter)
43 ctx.custom_data['archives'] = it
36 44
37 def bake(self, ctx): 45 def bake(self, ctx):
38 if not self.page_ref.exists: 46 if not self.page_ref.exists:
39 logger.debug( 47 logger.debug(
40 "No page found at '%s', skipping %s archives." % 48 "No page found at '%s', skipping %s archives." %
86 if prev_entry and not cur_entry: 94 if prev_entry and not cur_entry:
87 try: 95 try:
88 y = ctx.getSeedFromRecordExtraKey(prev_entry.extra_key) 96 y = ctx.getSeedFromRecordExtraKey(prev_entry.extra_key)
89 except InvalidRecordExtraKey: 97 except InvalidRecordExtraKey:
90 continue 98 continue
91 if y in all_years: 99 if y in all_years:
92 logger.debug("Creating unbaked entry for %d archive." % y) 100 logger.debug("Creating unbaked entry for %d archive." % y)
93 ctx.collapseRecord(prev_entry) 101 ctx.collapseRecord(prev_entry)
94 else: 102 else:
95 logger.debug("No page references year %d anymore." % y) 103 logger.debug("No page references year %d anymore." % y)
96 104
97 105
98 class IsFromYearFilterClause(IFilterClause): 106 class IsFromYearFilterClause(IFilterClause):
99 def __init__(self, year): 107 def __init__(self, year):
100 self.year = year 108 self.year = year
101 109
102 def pageMatches(self, fil, page): 110 def pageMatches(self, fil, page):
103 return (page.datetime.year == self.year) 111 return (page.datetime.year == self.year)
104 112
113
114 def _date_sorter(it):
115 return sorted(it, key=lambda x: x.datetime)
116