Mercurial > piecrust2
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 |
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 |