annotate piecrust/data/paginationdata.py @ 975:a0a62d0da723

internal: Check that the `Assetor` has an asset URL format to work with.
author Ludovic Chabant <ludovic@chabant.com>
date Tue, 17 Oct 2017 01:08:56 -0700
parents cc55740860de
children 45ad976712ec
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
912
cd236a6af9f6 data: Add access to route metadata in the templating data.
Ludovic Chabant <ludovic@chabant.com>
parents: 830
diff changeset
1 import copy
440
32c7c2d219d2 performance: Refactor how data is managed to reduce copying.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
2 import time
718
d4408fbbbc7d internal: Prevent crash because of missing logger.
Ludovic Chabant <ludovic@chabant.com>
parents: 711
diff changeset
3 import logging
440
32c7c2d219d2 performance: Refactor how data is managed to reduce copying.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
4 from piecrust.data.pagedata import LazyPageConfigData
877
d6d35b2efd04 bake: Rename "pass" to "step" and make the page pipeline use different steps.
Ludovic Chabant <ludovic@chabant.com>
parents: 874
diff changeset
5 from piecrust.sources.base import AbortedSourceUseError
440
32c7c2d219d2 performance: Refactor how data is managed to reduce copying.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
6
32c7c2d219d2 performance: Refactor how data is managed to reduce copying.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
7
718
d4408fbbbc7d internal: Prevent crash because of missing logger.
Ludovic Chabant <ludovic@chabant.com>
parents: 711
diff changeset
8 logger = logging.getLogger(__name__)
d4408fbbbc7d internal: Prevent crash because of missing logger.
Ludovic Chabant <ludovic@chabant.com>
parents: 711
diff changeset
9
d4408fbbbc7d internal: Prevent crash because of missing logger.
Ludovic Chabant <ludovic@chabant.com>
parents: 711
diff changeset
10
440
32c7c2d219d2 performance: Refactor how data is managed to reduce copying.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
11 class PaginationData(LazyPageConfigData):
32c7c2d219d2 performance: Refactor how data is managed to reduce copying.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
12 def __init__(self, page):
853
f070a4fc033c core: Continue PieCrust3 refactor, simplify pages.
Ludovic Chabant <ludovic@chabant.com>
parents: 852
diff changeset
13 super().__init__(page)
440
32c7c2d219d2 performance: Refactor how data is managed to reduce copying.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
14
32c7c2d219d2 performance: Refactor how data is managed to reduce copying.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
15 def _load(self):
852
4850f8c21b6e core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents: 830
diff changeset
16 from piecrust.uriutil import split_uri
4850f8c21b6e core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents: 830
diff changeset
17
440
32c7c2d219d2 performance: Refactor how data is managed to reduce copying.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
18 page = self._page
874
f4608e2e80ce data: Optimize page data creation.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
19 set_val = self._setValue
f4608e2e80ce data: Optimize page data creation.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
20
853
f070a4fc033c core: Continue PieCrust3 refactor, simplify pages.
Ludovic Chabant <ludovic@chabant.com>
parents: 852
diff changeset
21 page_url = page.getUri()
912
cd236a6af9f6 data: Add access to route metadata in the templating data.
Ludovic Chabant <ludovic@chabant.com>
parents: 830
diff changeset
22 _, rel_url = split_uri(page.app, page_url)
874
f4608e2e80ce data: Optimize page data creation.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
23 set_val('url', page_url)
922
b447c24bc8d4 Merge changes from PieCrust2 branch.
Ludovic Chabant <ludovic@chabant.com>
parents: 877 912
diff changeset
24 set_val('rel_url', rel_url)
b447c24bc8d4 Merge changes from PieCrust2 branch.
Ludovic Chabant <ludovic@chabant.com>
parents: 877 912
diff changeset
25 set_val('slug', rel_url) # For backwards compatibility
b447c24bc8d4 Merge changes from PieCrust2 branch.
Ludovic Chabant <ludovic@chabant.com>
parents: 877 912
diff changeset
26 set_val('route', copy.deepcopy(page.source_metadata['route_params']))
440
32c7c2d219d2 performance: Refactor how data is managed to reduce copying.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
27
874
f4608e2e80ce data: Optimize page data creation.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
28 self._mapLoader('date', _load_date)
966
cc55740860de data: Delay loading page configuration and datetimes.
Ludovic Chabant <ludovic@chabant.com>
parents: 922
diff changeset
29 self._mapLoader('datetime', _load_datetime)
cc55740860de data: Delay loading page configuration and datetimes.
Ludovic Chabant <ludovic@chabant.com>
parents: 922
diff changeset
30 self._mapLoader('timestamp', _load_timestamp)
cc55740860de data: Delay loading page configuration and datetimes.
Ludovic Chabant <ludovic@chabant.com>
parents: 922
diff changeset
31 self._mapLoader('mtime', _load_content_mtime)
874
f4608e2e80ce data: Optimize page data creation.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
32 self._mapLoader('assets', _load_assets)
440
32c7c2d219d2 performance: Refactor how data is managed to reduce copying.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
33
32c7c2d219d2 performance: Refactor how data is managed to reduce copying.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
34 segment_names = page.config.get('segments')
32c7c2d219d2 performance: Refactor how data is managed to reduce copying.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
35 for name in segment_names:
966
cc55740860de data: Delay loading page configuration and datetimes.
Ludovic Chabant <ludovic@chabant.com>
parents: 922
diff changeset
36 self._mapLoader('raw_' + name, _load_raw_segment)
874
f4608e2e80ce data: Optimize page data creation.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
37 self._mapLoader(name, _load_rendered_segment)
f4608e2e80ce data: Optimize page data creation.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
38
f4608e2e80ce data: Optimize page data creation.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
39
f4608e2e80ce data: Optimize page data creation.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
40 def _load_assets(data, name):
f4608e2e80ce data: Optimize page data creation.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
41 from piecrust.data.assetor import Assetor
f4608e2e80ce data: Optimize page data creation.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
42 return Assetor(data._page)
f4608e2e80ce data: Optimize page data creation.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
43
440
32c7c2d219d2 performance: Refactor how data is managed to reduce copying.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
44
874
f4608e2e80ce data: Optimize page data creation.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
45 def _load_date(data, name):
f4608e2e80ce data: Optimize page data creation.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
46 page = data._page
f4608e2e80ce data: Optimize page data creation.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
47 date_format = page.app.config.get('site/date_format')
f4608e2e80ce data: Optimize page data creation.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
48 if date_format:
f4608e2e80ce data: Optimize page data creation.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
49 return page.datetime.strftime(date_format)
f4608e2e80ce data: Optimize page data creation.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
50 return None
f4608e2e80ce data: Optimize page data creation.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
51
440
32c7c2d219d2 performance: Refactor how data is managed to reduce copying.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
52
966
cc55740860de data: Delay loading page configuration and datetimes.
Ludovic Chabant <ludovic@chabant.com>
parents: 922
diff changeset
53 def _load_datetime(data, name):
cc55740860de data: Delay loading page configuration and datetimes.
Ludovic Chabant <ludovic@chabant.com>
parents: 922
diff changeset
54 dt = data_page.datetime
cc55740860de data: Delay loading page configuration and datetimes.
Ludovic Chabant <ludovic@chabant.com>
parents: 922
diff changeset
55 return {
cc55740860de data: Delay loading page configuration and datetimes.
Ludovic Chabant <ludovic@chabant.com>
parents: 922
diff changeset
56 'year': dt.year, 'month': dt.month, 'day': dt.day,
cc55740860de data: Delay loading page configuration and datetimes.
Ludovic Chabant <ludovic@chabant.com>
parents: 922
diff changeset
57 'hour': dt.hour, 'minute': dt.minute, 'second': dt.second}
cc55740860de data: Delay loading page configuration and datetimes.
Ludovic Chabant <ludovic@chabant.com>
parents: 922
diff changeset
58
cc55740860de data: Delay loading page configuration and datetimes.
Ludovic Chabant <ludovic@chabant.com>
parents: 922
diff changeset
59
cc55740860de data: Delay loading page configuration and datetimes.
Ludovic Chabant <ludovic@chabant.com>
parents: 922
diff changeset
60 def _load_timestamp(data, name):
cc55740860de data: Delay loading page configuration and datetimes.
Ludovic Chabant <ludovic@chabant.com>
parents: 922
diff changeset
61 page = data._page
cc55740860de data: Delay loading page configuration and datetimes.
Ludovic Chabant <ludovic@chabant.com>
parents: 922
diff changeset
62 return time.mktime(page.datetime.timetuple())
cc55740860de data: Delay loading page configuration and datetimes.
Ludovic Chabant <ludovic@chabant.com>
parents: 922
diff changeset
63
cc55740860de data: Delay loading page configuration and datetimes.
Ludovic Chabant <ludovic@chabant.com>
parents: 922
diff changeset
64
cc55740860de data: Delay loading page configuration and datetimes.
Ludovic Chabant <ludovic@chabant.com>
parents: 922
diff changeset
65 def _load_content_mtime(data, name):
cc55740860de data: Delay loading page configuration and datetimes.
Ludovic Chabant <ludovic@chabant.com>
parents: 922
diff changeset
66 return data._page.content_mtime
cc55740860de data: Delay loading page configuration and datetimes.
Ludovic Chabant <ludovic@chabant.com>
parents: 922
diff changeset
67
cc55740860de data: Delay loading page configuration and datetimes.
Ludovic Chabant <ludovic@chabant.com>
parents: 922
diff changeset
68
cc55740860de data: Delay loading page configuration and datetimes.
Ludovic Chabant <ludovic@chabant.com>
parents: 922
diff changeset
69 def _load_raw_segment(data, name):
cc55740860de data: Delay loading page configuration and datetimes.
Ludovic Chabant <ludovic@chabant.com>
parents: 922
diff changeset
70 page = data._page
cc55740860de data: Delay loading page configuration and datetimes.
Ludovic Chabant <ludovic@chabant.com>
parents: 922
diff changeset
71 return page.getSegment(name[4:])
cc55740860de data: Delay loading page configuration and datetimes.
Ludovic Chabant <ludovic@chabant.com>
parents: 922
diff changeset
72
cc55740860de data: Delay loading page configuration and datetimes.
Ludovic Chabant <ludovic@chabant.com>
parents: 922
diff changeset
73
874
f4608e2e80ce data: Optimize page data creation.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
74 def _load_rendered_segment(data, name):
f4608e2e80ce data: Optimize page data creation.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
75 page = data._page
f4608e2e80ce data: Optimize page data creation.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
76
f4608e2e80ce data: Optimize page data creation.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
77 do_render = True
f4608e2e80ce data: Optimize page data creation.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
78 stack = page.app.env.render_ctx_stack
f4608e2e80ce data: Optimize page data creation.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
79 if stack.hasPage(page):
f4608e2e80ce data: Optimize page data creation.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
80 # This is the pagination data for the page that is currently
f4608e2e80ce data: Optimize page data creation.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
81 # being rendered! Inception! But this is possible... so just
f4608e2e80ce data: Optimize page data creation.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
82 # prevent infinite recursion.
f4608e2e80ce data: Optimize page data creation.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
83 do_render = False
440
32c7c2d219d2 performance: Refactor how data is managed to reduce copying.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
84
874
f4608e2e80ce data: Optimize page data creation.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
85 if do_render:
f4608e2e80ce data: Optimize page data creation.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
86 uri = page.getUri()
f4608e2e80ce data: Optimize page data creation.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
87 try:
f4608e2e80ce data: Optimize page data creation.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
88 from piecrust.rendering import (
f4608e2e80ce data: Optimize page data creation.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
89 RenderingContext, render_page_segments)
f4608e2e80ce data: Optimize page data creation.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
90 ctx = RenderingContext(page)
f4608e2e80ce data: Optimize page data creation.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
91 render_result = render_page_segments(ctx)
f4608e2e80ce data: Optimize page data creation.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
92 segs = render_result.segments
877
d6d35b2efd04 bake: Rename "pass" to "step" and make the page pipeline use different steps.
Ludovic Chabant <ludovic@chabant.com>
parents: 874
diff changeset
93 except AbortedSourceUseError:
d6d35b2efd04 bake: Rename "pass" to "step" and make the page pipeline use different steps.
Ludovic Chabant <ludovic@chabant.com>
parents: 874
diff changeset
94 raise
874
f4608e2e80ce data: Optimize page data creation.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
95 except Exception as ex:
f4608e2e80ce data: Optimize page data creation.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
96 logger.exception(ex)
f4608e2e80ce data: Optimize page data creation.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
97 raise Exception(
f4608e2e80ce data: Optimize page data creation.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
98 "Error rendering segments for '%s'" % uri) from ex
f4608e2e80ce data: Optimize page data creation.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
99 else:
f4608e2e80ce data: Optimize page data creation.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
100 segs = {}
f4608e2e80ce data: Optimize page data creation.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
101 for name in page.config.get('segments'):
f4608e2e80ce data: Optimize page data creation.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
102 segs[name] = "<unavailable: current page>"
440
32c7c2d219d2 performance: Refactor how data is managed to reduce copying.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
103
874
f4608e2e80ce data: Optimize page data creation.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
104 unmap_loader = data._unmapLoader
f4608e2e80ce data: Optimize page data creation.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
105 set_val = data._setValue
f4608e2e80ce data: Optimize page data creation.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
106
f4608e2e80ce data: Optimize page data creation.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
107 for k, v in segs.items():
f4608e2e80ce data: Optimize page data creation.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
108 unmap_loader(k)
f4608e2e80ce data: Optimize page data creation.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
109 set_val(k, v)
440
32c7c2d219d2 performance: Refactor how data is managed to reduce copying.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
110
874
f4608e2e80ce data: Optimize page data creation.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
111 if 'content.abstract' in segs:
f4608e2e80ce data: Optimize page data creation.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
112 set_val('content', segs['content.abstract'])
f4608e2e80ce data: Optimize page data creation.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
113 set_val('has_more', True)
f4608e2e80ce data: Optimize page data creation.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
114 if name == 'content':
f4608e2e80ce data: Optimize page data creation.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
115 return segs['content.abstract']
440
32c7c2d219d2 performance: Refactor how data is managed to reduce copying.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
116
874
f4608e2e80ce data: Optimize page data creation.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
117 return segs[name]
440
32c7c2d219d2 performance: Refactor how data is managed to reduce copying.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
118