Mercurial > piecrust2
annotate piecrust/data/paginationdata.py @ 966:cc55740860de
data: Delay loading page configuration and datetimes.
author | Ludovic Chabant <ludovic@chabant.com> |
---|---|
date | Sat, 07 Oct 2017 12:32:48 -0700 |
parents | b447c24bc8d4 |
children | 45ad976712ec |
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>
diff
changeset
|
24 set_val('rel_url', rel_url) |
b447c24bc8d4
Merge changes from PieCrust2 branch.
Ludovic Chabant <ludovic@chabant.com>
diff
changeset
|
25 set_val('slug', rel_url) # For backwards compatibility |
b447c24bc8d4
Merge changes from PieCrust2 branch.
Ludovic Chabant <ludovic@chabant.com>
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 |