annotate piecrust/generation/blogarchives.py @ 837:ad8f48a31c62

assets: Fix crash when a page doesn't have assets.
author Ludovic Chabant <ludovic@chabant.com>
date Sun, 05 Feb 2017 22:52:01 -0800
parents 58ebf50235a5
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
724
09115f0900f0 bake: Add blog archives generator.
Ludovic Chabant <ludovic@chabant.com>
parents: 711
diff changeset
1 import logging
09115f0900f0 bake: Add blog archives generator.
Ludovic Chabant <ludovic@chabant.com>
parents: 711
diff changeset
2 import datetime
729
e35407c60e00 templating: Make blog archives generator expose more templating data.
Ludovic Chabant <ludovic@chabant.com>
parents: 724
diff changeset
3 from piecrust.chefutil import format_timed_scope
724
09115f0900f0 bake: Add blog archives generator.
Ludovic Chabant <ludovic@chabant.com>
parents: 711
diff changeset
4 from piecrust.data.filters import PaginationFilter, IFilterClause
729
e35407c60e00 templating: Make blog archives generator expose more templating data.
Ludovic Chabant <ludovic@chabant.com>
parents: 724
diff changeset
5 from piecrust.data.iterators import PageIterator
736
13ec290bfc13 bake: Fix some crashes with new blog archive/taxonomy for incremental bakes.
Ludovic Chabant <ludovic@chabant.com>
parents: 729
diff changeset
6 from piecrust.generation.base import PageGenerator, InvalidRecordExtraKey
792
58ebf50235a5 routing: Simplify how routes are defined.
Ludovic Chabant <ludovic@chabant.com>
parents: 736
diff changeset
7 from piecrust.routing import RouteParameter
711
ab5c6a8ae90a bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
8
ab5c6a8ae90a bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
9
724
09115f0900f0 bake: Add blog archives generator.
Ludovic Chabant <ludovic@chabant.com>
parents: 711
diff changeset
10 logger = logging.getLogger(__name__)
09115f0900f0 bake: Add blog archives generator.
Ludovic Chabant <ludovic@chabant.com>
parents: 711
diff changeset
11
09115f0900f0 bake: Add blog archives generator.
Ludovic Chabant <ludovic@chabant.com>
parents: 711
diff changeset
12
711
ab5c6a8ae90a bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
13 class BlogArchivesPageGenerator(PageGenerator):
ab5c6a8ae90a bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
14 GENERATOR_NAME = 'blog_archives'
ab5c6a8ae90a bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
15
724
09115f0900f0 bake: Add blog archives generator.
Ludovic Chabant <ludovic@chabant.com>
parents: 711
diff changeset
16 def __init__(self, app, name, config):
09115f0900f0 bake: Add blog archives generator.
Ludovic Chabant <ludovic@chabant.com>
parents: 711
diff changeset
17 super(BlogArchivesPageGenerator, self).__init__(app, name, config)
09115f0900f0 bake: Add blog archives generator.
Ludovic Chabant <ludovic@chabant.com>
parents: 711
diff changeset
18
792
58ebf50235a5 routing: Simplify how routes are defined.
Ludovic Chabant <ludovic@chabant.com>
parents: 736
diff changeset
19 def getSupportedRouteParameters(self):
58ebf50235a5 routing: Simplify how routes are defined.
Ludovic Chabant <ludovic@chabant.com>
parents: 736
diff changeset
20 return [RouteParameter('year', RouteParameter.TYPE_INT4)]
58ebf50235a5 routing: Simplify how routes are defined.
Ludovic Chabant <ludovic@chabant.com>
parents: 736
diff changeset
21
724
09115f0900f0 bake: Add blog archives generator.
Ludovic Chabant <ludovic@chabant.com>
parents: 711
diff changeset
22 def onRouteFunctionUsed(self, route, route_metadata):
711
ab5c6a8ae90a bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
23 pass
ab5c6a8ae90a bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
24
724
09115f0900f0 bake: Add blog archives generator.
Ludovic Chabant <ludovic@chabant.com>
parents: 711
diff changeset
25 def prepareRenderContext(self, ctx):
09115f0900f0 bake: Add blog archives generator.
Ludovic Chabant <ludovic@chabant.com>
parents: 711
diff changeset
26 ctx.pagination_source = self.source
09115f0900f0 bake: Add blog archives generator.
Ludovic Chabant <ludovic@chabant.com>
parents: 711
diff changeset
27
09115f0900f0 bake: Add blog archives generator.
Ludovic Chabant <ludovic@chabant.com>
parents: 711
diff changeset
28 year = ctx.page.route_metadata.get('year')
09115f0900f0 bake: Add blog archives generator.
Ludovic Chabant <ludovic@chabant.com>
parents: 711
diff changeset
29 if year is None:
09115f0900f0 bake: Add blog archives generator.
Ludovic Chabant <ludovic@chabant.com>
parents: 711
diff changeset
30 raise Exception(
09115f0900f0 bake: Add blog archives generator.
Ludovic Chabant <ludovic@chabant.com>
parents: 711
diff changeset
31 "Can't find the archive year in the route metadata")
09115f0900f0 bake: Add blog archives generator.
Ludovic Chabant <ludovic@chabant.com>
parents: 711
diff changeset
32 if type(year) is not int:
09115f0900f0 bake: Add blog archives generator.
Ludovic Chabant <ludovic@chabant.com>
parents: 711
diff changeset
33 raise Exception(
09115f0900f0 bake: Add blog archives generator.
Ludovic Chabant <ludovic@chabant.com>
parents: 711
diff changeset
34 "The route for generator '%s' should specify an integer "
09115f0900f0 bake: Add blog archives generator.
Ludovic Chabant <ludovic@chabant.com>
parents: 711
diff changeset
35 "parameter for 'year'." % self.name)
09115f0900f0 bake: Add blog archives generator.
Ludovic Chabant <ludovic@chabant.com>
parents: 711
diff changeset
36
09115f0900f0 bake: Add blog archives generator.
Ludovic Chabant <ludovic@chabant.com>
parents: 711
diff changeset
37 flt = PaginationFilter()
09115f0900f0 bake: Add blog archives generator.
Ludovic Chabant <ludovic@chabant.com>
parents: 711
diff changeset
38 flt.addClause(IsFromYearFilterClause(year))
09115f0900f0 bake: Add blog archives generator.
Ludovic Chabant <ludovic@chabant.com>
parents: 711
diff changeset
39 ctx.pagination_filter = flt
09115f0900f0 bake: Add blog archives generator.
Ludovic Chabant <ludovic@chabant.com>
parents: 711
diff changeset
40
09115f0900f0 bake: Add blog archives generator.
Ludovic Chabant <ludovic@chabant.com>
parents: 711
diff changeset
41 ctx.custom_data['year'] = year
09115f0900f0 bake: Add blog archives generator.
Ludovic Chabant <ludovic@chabant.com>
parents: 711
diff changeset
42
729
e35407c60e00 templating: Make blog archives generator expose more templating data.
Ludovic Chabant <ludovic@chabant.com>
parents: 724
diff changeset
43 flt2 = PaginationFilter()
e35407c60e00 templating: Make blog archives generator expose more templating data.
Ludovic Chabant <ludovic@chabant.com>
parents: 724
diff changeset
44 flt2.addClause(IsFromYearFilterClause(year))
e35407c60e00 templating: Make blog archives generator expose more templating data.
Ludovic Chabant <ludovic@chabant.com>
parents: 724
diff changeset
45 it = PageIterator(self.source, pagination_filter=flt2,
e35407c60e00 templating: Make blog archives generator expose more templating data.
Ludovic Chabant <ludovic@chabant.com>
parents: 724
diff changeset
46 sorter=_date_sorter)
e35407c60e00 templating: Make blog archives generator expose more templating data.
Ludovic Chabant <ludovic@chabant.com>
parents: 724
diff changeset
47 ctx.custom_data['archives'] = it
e35407c60e00 templating: Make blog archives generator expose more templating data.
Ludovic Chabant <ludovic@chabant.com>
parents: 724
diff changeset
48
724
09115f0900f0 bake: Add blog archives generator.
Ludovic Chabant <ludovic@chabant.com>
parents: 711
diff changeset
49 def bake(self, ctx):
09115f0900f0 bake: Add blog archives generator.
Ludovic Chabant <ludovic@chabant.com>
parents: 711
diff changeset
50 if not self.page_ref.exists:
09115f0900f0 bake: Add blog archives generator.
Ludovic Chabant <ludovic@chabant.com>
parents: 711
diff changeset
51 logger.debug(
09115f0900f0 bake: Add blog archives generator.
Ludovic Chabant <ludovic@chabant.com>
parents: 711
diff changeset
52 "No page found at '%s', skipping %s archives." %
09115f0900f0 bake: Add blog archives generator.
Ludovic Chabant <ludovic@chabant.com>
parents: 711
diff changeset
53 (self.page_ref, self.source_name))
09115f0900f0 bake: Add blog archives generator.
Ludovic Chabant <ludovic@chabant.com>
parents: 711
diff changeset
54 return
09115f0900f0 bake: Add blog archives generator.
Ludovic Chabant <ludovic@chabant.com>
parents: 711
diff changeset
55
09115f0900f0 bake: Add blog archives generator.
Ludovic Chabant <ludovic@chabant.com>
parents: 711
diff changeset
56 logger.debug("Baking %s archives...", self.source_name)
09115f0900f0 bake: Add blog archives generator.
Ludovic Chabant <ludovic@chabant.com>
parents: 711
diff changeset
57 with format_timed_scope(logger, 'gathered archive years',
09115f0900f0 bake: Add blog archives generator.
Ludovic Chabant <ludovic@chabant.com>
parents: 711
diff changeset
58 level=logging.DEBUG, colored=False):
09115f0900f0 bake: Add blog archives generator.
Ludovic Chabant <ludovic@chabant.com>
parents: 711
diff changeset
59 all_years, dirty_years = self._buildDirtyYears(ctx)
09115f0900f0 bake: Add blog archives generator.
Ludovic Chabant <ludovic@chabant.com>
parents: 711
diff changeset
60
09115f0900f0 bake: Add blog archives generator.
Ludovic Chabant <ludovic@chabant.com>
parents: 711
diff changeset
61 with format_timed_scope(logger, "baked %d %s archives." %
09115f0900f0 bake: Add blog archives generator.
Ludovic Chabant <ludovic@chabant.com>
parents: 711
diff changeset
62 (len(dirty_years), self.source_name)):
09115f0900f0 bake: Add blog archives generator.
Ludovic Chabant <ludovic@chabant.com>
parents: 711
diff changeset
63 self._bakeDirtyYears(ctx, all_years, dirty_years)
09115f0900f0 bake: Add blog archives generator.
Ludovic Chabant <ludovic@chabant.com>
parents: 711
diff changeset
64
09115f0900f0 bake: Add blog archives generator.
Ludovic Chabant <ludovic@chabant.com>
parents: 711
diff changeset
65 def _buildDirtyYears(self, ctx):
09115f0900f0 bake: Add blog archives generator.
Ludovic Chabant <ludovic@chabant.com>
parents: 711
diff changeset
66 logger.debug("Gathering dirty post years.")
09115f0900f0 bake: Add blog archives generator.
Ludovic Chabant <ludovic@chabant.com>
parents: 711
diff changeset
67 all_years = set()
09115f0900f0 bake: Add blog archives generator.
Ludovic Chabant <ludovic@chabant.com>
parents: 711
diff changeset
68 dirty_years = set()
09115f0900f0 bake: Add blog archives generator.
Ludovic Chabant <ludovic@chabant.com>
parents: 711
diff changeset
69 for _, cur_entry in ctx.getAllPageRecords():
736
13ec290bfc13 bake: Fix some crashes with new blog archive/taxonomy for incremental bakes.
Ludovic Chabant <ludovic@chabant.com>
parents: 729
diff changeset
70 if cur_entry and cur_entry.source_name == self.source_name:
724
09115f0900f0 bake: Add blog archives generator.
Ludovic Chabant <ludovic@chabant.com>
parents: 711
diff changeset
71 dt = datetime.datetime.fromtimestamp(cur_entry.timestamp)
09115f0900f0 bake: Add blog archives generator.
Ludovic Chabant <ludovic@chabant.com>
parents: 711
diff changeset
72 all_years.add(dt.year)
09115f0900f0 bake: Add blog archives generator.
Ludovic Chabant <ludovic@chabant.com>
parents: 711
diff changeset
73 if cur_entry.was_any_sub_baked:
09115f0900f0 bake: Add blog archives generator.
Ludovic Chabant <ludovic@chabant.com>
parents: 711
diff changeset
74 dirty_years.add(dt.year)
09115f0900f0 bake: Add blog archives generator.
Ludovic Chabant <ludovic@chabant.com>
parents: 711
diff changeset
75 return all_years, dirty_years
09115f0900f0 bake: Add blog archives generator.
Ludovic Chabant <ludovic@chabant.com>
parents: 711
diff changeset
76
09115f0900f0 bake: Add blog archives generator.
Ludovic Chabant <ludovic@chabant.com>
parents: 711
diff changeset
77 def _bakeDirtyYears(self, ctx, all_years, dirty_years):
09115f0900f0 bake: Add blog archives generator.
Ludovic Chabant <ludovic@chabant.com>
parents: 711
diff changeset
78 route = self.app.getGeneratorRoute(self.name)
09115f0900f0 bake: Add blog archives generator.
Ludovic Chabant <ludovic@chabant.com>
parents: 711
diff changeset
79 if route is None:
09115f0900f0 bake: Add blog archives generator.
Ludovic Chabant <ludovic@chabant.com>
parents: 711
diff changeset
80 raise Exception(
09115f0900f0 bake: Add blog archives generator.
Ludovic Chabant <ludovic@chabant.com>
parents: 711
diff changeset
81 "No routes have been defined for generator: %s" %
09115f0900f0 bake: Add blog archives generator.
Ludovic Chabant <ludovic@chabant.com>
parents: 711
diff changeset
82 self.name)
09115f0900f0 bake: Add blog archives generator.
Ludovic Chabant <ludovic@chabant.com>
parents: 711
diff changeset
83
09115f0900f0 bake: Add blog archives generator.
Ludovic Chabant <ludovic@chabant.com>
parents: 711
diff changeset
84 logger.debug("Using archive page: %s" % self.page_ref)
09115f0900f0 bake: Add blog archives generator.
Ludovic Chabant <ludovic@chabant.com>
parents: 711
diff changeset
85 fac = self.page_ref.getFactory()
09115f0900f0 bake: Add blog archives generator.
Ludovic Chabant <ludovic@chabant.com>
parents: 711
diff changeset
86
09115f0900f0 bake: Add blog archives generator.
Ludovic Chabant <ludovic@chabant.com>
parents: 711
diff changeset
87 for y in dirty_years:
09115f0900f0 bake: Add blog archives generator.
Ludovic Chabant <ludovic@chabant.com>
parents: 711
diff changeset
88 extra_route_metadata = {'year': y}
09115f0900f0 bake: Add blog archives generator.
Ludovic Chabant <ludovic@chabant.com>
parents: 711
diff changeset
89
09115f0900f0 bake: Add blog archives generator.
Ludovic Chabant <ludovic@chabant.com>
parents: 711
diff changeset
90 logger.debug("Queuing: %s [%s]" % (fac.ref_spec, y))
09115f0900f0 bake: Add blog archives generator.
Ludovic Chabant <ludovic@chabant.com>
parents: 711
diff changeset
91 ctx.queueBakeJob(fac, route, extra_route_metadata, str(y))
09115f0900f0 bake: Add blog archives generator.
Ludovic Chabant <ludovic@chabant.com>
parents: 711
diff changeset
92 ctx.runJobQueue()
09115f0900f0 bake: Add blog archives generator.
Ludovic Chabant <ludovic@chabant.com>
parents: 711
diff changeset
93
09115f0900f0 bake: Add blog archives generator.
Ludovic Chabant <ludovic@chabant.com>
parents: 711
diff changeset
94 # Create bake entries for the years that were *not* dirty.
09115f0900f0 bake: Add blog archives generator.
Ludovic Chabant <ludovic@chabant.com>
parents: 711
diff changeset
95 # Otherwise, when checking for deleted pages, we would not find any
09115f0900f0 bake: Add blog archives generator.
Ludovic Chabant <ludovic@chabant.com>
parents: 711
diff changeset
96 # outputs and would delete those files.
736
13ec290bfc13 bake: Fix some crashes with new blog archive/taxonomy for incremental bakes.
Ludovic Chabant <ludovic@chabant.com>
parents: 729
diff changeset
97 all_str_years = [str(y) for y in all_years]
724
09115f0900f0 bake: Add blog archives generator.
Ludovic Chabant <ludovic@chabant.com>
parents: 711
diff changeset
98 for prev_entry, cur_entry in ctx.getAllPageRecords():
09115f0900f0 bake: Add blog archives generator.
Ludovic Chabant <ludovic@chabant.com>
parents: 711
diff changeset
99 if prev_entry and not cur_entry:
09115f0900f0 bake: Add blog archives generator.
Ludovic Chabant <ludovic@chabant.com>
parents: 711
diff changeset
100 try:
09115f0900f0 bake: Add blog archives generator.
Ludovic Chabant <ludovic@chabant.com>
parents: 711
diff changeset
101 y = ctx.getSeedFromRecordExtraKey(prev_entry.extra_key)
09115f0900f0 bake: Add blog archives generator.
Ludovic Chabant <ludovic@chabant.com>
parents: 711
diff changeset
102 except InvalidRecordExtraKey:
09115f0900f0 bake: Add blog archives generator.
Ludovic Chabant <ludovic@chabant.com>
parents: 711
diff changeset
103 continue
736
13ec290bfc13 bake: Fix some crashes with new blog archive/taxonomy for incremental bakes.
Ludovic Chabant <ludovic@chabant.com>
parents: 729
diff changeset
104 if y in all_str_years:
13ec290bfc13 bake: Fix some crashes with new blog archive/taxonomy for incremental bakes.
Ludovic Chabant <ludovic@chabant.com>
parents: 729
diff changeset
105 logger.debug(
13ec290bfc13 bake: Fix some crashes with new blog archive/taxonomy for incremental bakes.
Ludovic Chabant <ludovic@chabant.com>
parents: 729
diff changeset
106 "Creating unbaked entry for year %s archive." % y)
729
e35407c60e00 templating: Make blog archives generator expose more templating data.
Ludovic Chabant <ludovic@chabant.com>
parents: 724
diff changeset
107 ctx.collapseRecord(prev_entry)
e35407c60e00 templating: Make blog archives generator expose more templating data.
Ludovic Chabant <ludovic@chabant.com>
parents: 724
diff changeset
108 else:
736
13ec290bfc13 bake: Fix some crashes with new blog archive/taxonomy for incremental bakes.
Ludovic Chabant <ludovic@chabant.com>
parents: 729
diff changeset
109 logger.debug(
13ec290bfc13 bake: Fix some crashes with new blog archive/taxonomy for incremental bakes.
Ludovic Chabant <ludovic@chabant.com>
parents: 729
diff changeset
110 "No page references year %s anymore." % y)
724
09115f0900f0 bake: Add blog archives generator.
Ludovic Chabant <ludovic@chabant.com>
parents: 711
diff changeset
111
09115f0900f0 bake: Add blog archives generator.
Ludovic Chabant <ludovic@chabant.com>
parents: 711
diff changeset
112
09115f0900f0 bake: Add blog archives generator.
Ludovic Chabant <ludovic@chabant.com>
parents: 711
diff changeset
113 class IsFromYearFilterClause(IFilterClause):
09115f0900f0 bake: Add blog archives generator.
Ludovic Chabant <ludovic@chabant.com>
parents: 711
diff changeset
114 def __init__(self, year):
09115f0900f0 bake: Add blog archives generator.
Ludovic Chabant <ludovic@chabant.com>
parents: 711
diff changeset
115 self.year = year
09115f0900f0 bake: Add blog archives generator.
Ludovic Chabant <ludovic@chabant.com>
parents: 711
diff changeset
116
09115f0900f0 bake: Add blog archives generator.
Ludovic Chabant <ludovic@chabant.com>
parents: 711
diff changeset
117 def pageMatches(self, fil, page):
09115f0900f0 bake: Add blog archives generator.
Ludovic Chabant <ludovic@chabant.com>
parents: 711
diff changeset
118 return (page.datetime.year == self.year)
09115f0900f0 bake: Add blog archives generator.
Ludovic Chabant <ludovic@chabant.com>
parents: 711
diff changeset
119
729
e35407c60e00 templating: Make blog archives generator expose more templating data.
Ludovic Chabant <ludovic@chabant.com>
parents: 724
diff changeset
120
e35407c60e00 templating: Make blog archives generator expose more templating data.
Ludovic Chabant <ludovic@chabant.com>
parents: 724
diff changeset
121 def _date_sorter(it):
e35407c60e00 templating: Make blog archives generator expose more templating data.
Ludovic Chabant <ludovic@chabant.com>
parents: 724
diff changeset
122 return sorted(it, key=lambda x: x.datetime)
e35407c60e00 templating: Make blog archives generator expose more templating data.
Ludovic Chabant <ludovic@chabant.com>
parents: 724
diff changeset
123