Mercurial > piecrust2
annotate piecrust/data/paginationdata.py @ 922:b447c24bc8d4
Merge changes from PieCrust2 branch.
author | Ludovic Chabant <ludovic@chabant.com> |
---|---|
date | Fri, 29 Sep 2017 17:05:09 -0700 |
parents | d6d35b2efd04 cd236a6af9f6 |
children | cc55740860de |
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 |
729
e35407c60e00
templating: Make blog archives generator expose more templating data.
Ludovic Chabant <ludovic@chabant.com>
parents:
718
diff
changeset
|
19 dt = page.datetime |
874
f4608e2e80ce
data: Optimize page data creation.
Ludovic Chabant <ludovic@chabant.com>
parents:
854
diff
changeset
|
20 set_val = self._setValue |
f4608e2e80ce
data: Optimize page data creation.
Ludovic Chabant <ludovic@chabant.com>
parents:
854
diff
changeset
|
21 |
853
f070a4fc033c
core: Continue PieCrust3 refactor, simplify pages.
Ludovic Chabant <ludovic@chabant.com>
parents:
852
diff
changeset
|
22 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
|
23 _, rel_url = split_uri(page.app, page_url) |
874
f4608e2e80ce
data: Optimize page data creation.
Ludovic Chabant <ludovic@chabant.com>
parents:
854
diff
changeset
|
24 set_val('url', page_url) |
922
b447c24bc8d4
Merge changes from PieCrust2 branch.
Ludovic Chabant <ludovic@chabant.com>
diff
changeset
|
25 set_val('rel_url', rel_url) |
b447c24bc8d4
Merge changes from PieCrust2 branch.
Ludovic Chabant <ludovic@chabant.com>
diff
changeset
|
26 set_val('slug', rel_url) # For backwards compatibility |
b447c24bc8d4
Merge changes from PieCrust2 branch.
Ludovic Chabant <ludovic@chabant.com>
diff
changeset
|
27 set_val('route', copy.deepcopy(page.source_metadata['route_params'])) |
874
f4608e2e80ce
data: Optimize page data creation.
Ludovic Chabant <ludovic@chabant.com>
parents:
854
diff
changeset
|
28 set_val('timestamp', time.mktime(page.datetime.timetuple())) |
f4608e2e80ce
data: Optimize page data creation.
Ludovic Chabant <ludovic@chabant.com>
parents:
854
diff
changeset
|
29 set_val('datetime', { |
729
e35407c60e00
templating: Make blog archives generator expose more templating data.
Ludovic Chabant <ludovic@chabant.com>
parents:
718
diff
changeset
|
30 'year': dt.year, 'month': dt.month, 'day': dt.day, |
e35407c60e00
templating: Make blog archives generator expose more templating data.
Ludovic Chabant <ludovic@chabant.com>
parents:
718
diff
changeset
|
31 'hour': dt.hour, 'minute': dt.minute, 'second': dt.second}) |
874
f4608e2e80ce
data: Optimize page data creation.
Ludovic Chabant <ludovic@chabant.com>
parents:
854
diff
changeset
|
32 set_val('mtime', page.content_mtime) |
440
32c7c2d219d2
performance: Refactor how data is managed to reduce copying.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
33 |
874
f4608e2e80ce
data: Optimize page data creation.
Ludovic Chabant <ludovic@chabant.com>
parents:
854
diff
changeset
|
34 self._mapLoader('date', _load_date) |
f4608e2e80ce
data: Optimize page data creation.
Ludovic Chabant <ludovic@chabant.com>
parents:
854
diff
changeset
|
35 self._mapLoader('assets', _load_assets) |
440
32c7c2d219d2
performance: Refactor how data is managed to reduce copying.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
36 |
32c7c2d219d2
performance: Refactor how data is managed to reduce copying.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
37 segment_names = page.config.get('segments') |
32c7c2d219d2
performance: Refactor how data is managed to reduce copying.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
38 for name in segment_names: |
874
f4608e2e80ce
data: Optimize page data creation.
Ludovic Chabant <ludovic@chabant.com>
parents:
854
diff
changeset
|
39 self._mapLoader(name, _load_rendered_segment) |
f4608e2e80ce
data: Optimize page data creation.
Ludovic Chabant <ludovic@chabant.com>
parents:
854
diff
changeset
|
40 |
f4608e2e80ce
data: Optimize page data creation.
Ludovic Chabant <ludovic@chabant.com>
parents:
854
diff
changeset
|
41 |
f4608e2e80ce
data: Optimize page data creation.
Ludovic Chabant <ludovic@chabant.com>
parents:
854
diff
changeset
|
42 def _load_assets(data, name): |
f4608e2e80ce
data: Optimize page data creation.
Ludovic Chabant <ludovic@chabant.com>
parents:
854
diff
changeset
|
43 from piecrust.data.assetor import Assetor |
f4608e2e80ce
data: Optimize page data creation.
Ludovic Chabant <ludovic@chabant.com>
parents:
854
diff
changeset
|
44 return Assetor(data._page) |
f4608e2e80ce
data: Optimize page data creation.
Ludovic Chabant <ludovic@chabant.com>
parents:
854
diff
changeset
|
45 |
440
32c7c2d219d2
performance: Refactor how data is managed to reduce copying.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
46 |
874
f4608e2e80ce
data: Optimize page data creation.
Ludovic Chabant <ludovic@chabant.com>
parents:
854
diff
changeset
|
47 def _load_date(data, name): |
f4608e2e80ce
data: Optimize page data creation.
Ludovic Chabant <ludovic@chabant.com>
parents:
854
diff
changeset
|
48 page = data._page |
f4608e2e80ce
data: Optimize page data creation.
Ludovic Chabant <ludovic@chabant.com>
parents:
854
diff
changeset
|
49 date_format = page.app.config.get('site/date_format') |
f4608e2e80ce
data: Optimize page data creation.
Ludovic Chabant <ludovic@chabant.com>
parents:
854
diff
changeset
|
50 if date_format: |
f4608e2e80ce
data: Optimize page data creation.
Ludovic Chabant <ludovic@chabant.com>
parents:
854
diff
changeset
|
51 return page.datetime.strftime(date_format) |
f4608e2e80ce
data: Optimize page data creation.
Ludovic Chabant <ludovic@chabant.com>
parents:
854
diff
changeset
|
52 return None |
f4608e2e80ce
data: Optimize page data creation.
Ludovic Chabant <ludovic@chabant.com>
parents:
854
diff
changeset
|
53 |
440
32c7c2d219d2
performance: Refactor how data is managed to reduce copying.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
54 |
874
f4608e2e80ce
data: Optimize page data creation.
Ludovic Chabant <ludovic@chabant.com>
parents:
854
diff
changeset
|
55 def _load_rendered_segment(data, name): |
f4608e2e80ce
data: Optimize page data creation.
Ludovic Chabant <ludovic@chabant.com>
parents:
854
diff
changeset
|
56 page = data._page |
f4608e2e80ce
data: Optimize page data creation.
Ludovic Chabant <ludovic@chabant.com>
parents:
854
diff
changeset
|
57 |
f4608e2e80ce
data: Optimize page data creation.
Ludovic Chabant <ludovic@chabant.com>
parents:
854
diff
changeset
|
58 do_render = True |
f4608e2e80ce
data: Optimize page data creation.
Ludovic Chabant <ludovic@chabant.com>
parents:
854
diff
changeset
|
59 stack = page.app.env.render_ctx_stack |
f4608e2e80ce
data: Optimize page data creation.
Ludovic Chabant <ludovic@chabant.com>
parents:
854
diff
changeset
|
60 if stack.hasPage(page): |
f4608e2e80ce
data: Optimize page data creation.
Ludovic Chabant <ludovic@chabant.com>
parents:
854
diff
changeset
|
61 # 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
|
62 # being rendered! Inception! But this is possible... so just |
f4608e2e80ce
data: Optimize page data creation.
Ludovic Chabant <ludovic@chabant.com>
parents:
854
diff
changeset
|
63 # prevent infinite recursion. |
f4608e2e80ce
data: Optimize page data creation.
Ludovic Chabant <ludovic@chabant.com>
parents:
854
diff
changeset
|
64 do_render = False |
440
32c7c2d219d2
performance: Refactor how data is managed to reduce copying.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
65 |
874
f4608e2e80ce
data: Optimize page data creation.
Ludovic Chabant <ludovic@chabant.com>
parents:
854
diff
changeset
|
66 if do_render: |
f4608e2e80ce
data: Optimize page data creation.
Ludovic Chabant <ludovic@chabant.com>
parents:
854
diff
changeset
|
67 uri = page.getUri() |
f4608e2e80ce
data: Optimize page data creation.
Ludovic Chabant <ludovic@chabant.com>
parents:
854
diff
changeset
|
68 try: |
f4608e2e80ce
data: Optimize page data creation.
Ludovic Chabant <ludovic@chabant.com>
parents:
854
diff
changeset
|
69 from piecrust.rendering import ( |
f4608e2e80ce
data: Optimize page data creation.
Ludovic Chabant <ludovic@chabant.com>
parents:
854
diff
changeset
|
70 RenderingContext, render_page_segments) |
f4608e2e80ce
data: Optimize page data creation.
Ludovic Chabant <ludovic@chabant.com>
parents:
854
diff
changeset
|
71 ctx = RenderingContext(page) |
f4608e2e80ce
data: Optimize page data creation.
Ludovic Chabant <ludovic@chabant.com>
parents:
854
diff
changeset
|
72 render_result = render_page_segments(ctx) |
f4608e2e80ce
data: Optimize page data creation.
Ludovic Chabant <ludovic@chabant.com>
parents:
854
diff
changeset
|
73 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
|
74 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
|
75 raise |
874
f4608e2e80ce
data: Optimize page data creation.
Ludovic Chabant <ludovic@chabant.com>
parents:
854
diff
changeset
|
76 except Exception as ex: |
f4608e2e80ce
data: Optimize page data creation.
Ludovic Chabant <ludovic@chabant.com>
parents:
854
diff
changeset
|
77 logger.exception(ex) |
f4608e2e80ce
data: Optimize page data creation.
Ludovic Chabant <ludovic@chabant.com>
parents:
854
diff
changeset
|
78 raise Exception( |
f4608e2e80ce
data: Optimize page data creation.
Ludovic Chabant <ludovic@chabant.com>
parents:
854
diff
changeset
|
79 "Error rendering segments for '%s'" % uri) from ex |
f4608e2e80ce
data: Optimize page data creation.
Ludovic Chabant <ludovic@chabant.com>
parents:
854
diff
changeset
|
80 else: |
f4608e2e80ce
data: Optimize page data creation.
Ludovic Chabant <ludovic@chabant.com>
parents:
854
diff
changeset
|
81 segs = {} |
f4608e2e80ce
data: Optimize page data creation.
Ludovic Chabant <ludovic@chabant.com>
parents:
854
diff
changeset
|
82 for name in page.config.get('segments'): |
f4608e2e80ce
data: Optimize page data creation.
Ludovic Chabant <ludovic@chabant.com>
parents:
854
diff
changeset
|
83 segs[name] = "<unavailable: current page>" |
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 unmap_loader = data._unmapLoader |
f4608e2e80ce
data: Optimize page data creation.
Ludovic Chabant <ludovic@chabant.com>
parents:
854
diff
changeset
|
86 set_val = data._setValue |
f4608e2e80ce
data: Optimize page data creation.
Ludovic Chabant <ludovic@chabant.com>
parents:
854
diff
changeset
|
87 |
f4608e2e80ce
data: Optimize page data creation.
Ludovic Chabant <ludovic@chabant.com>
parents:
854
diff
changeset
|
88 for k, v in segs.items(): |
f4608e2e80ce
data: Optimize page data creation.
Ludovic Chabant <ludovic@chabant.com>
parents:
854
diff
changeset
|
89 unmap_loader(k) |
f4608e2e80ce
data: Optimize page data creation.
Ludovic Chabant <ludovic@chabant.com>
parents:
854
diff
changeset
|
90 set_val(k, v) |
440
32c7c2d219d2
performance: Refactor how data is managed to reduce copying.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
91 |
874
f4608e2e80ce
data: Optimize page data creation.
Ludovic Chabant <ludovic@chabant.com>
parents:
854
diff
changeset
|
92 if 'content.abstract' in segs: |
f4608e2e80ce
data: Optimize page data creation.
Ludovic Chabant <ludovic@chabant.com>
parents:
854
diff
changeset
|
93 set_val('content', segs['content.abstract']) |
f4608e2e80ce
data: Optimize page data creation.
Ludovic Chabant <ludovic@chabant.com>
parents:
854
diff
changeset
|
94 set_val('has_more', True) |
f4608e2e80ce
data: Optimize page data creation.
Ludovic Chabant <ludovic@chabant.com>
parents:
854
diff
changeset
|
95 if name == 'content': |
f4608e2e80ce
data: Optimize page data creation.
Ludovic Chabant <ludovic@chabant.com>
parents:
854
diff
changeset
|
96 return segs['content.abstract'] |
440
32c7c2d219d2
performance: Refactor how data is managed to reduce copying.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
97 |
874
f4608e2e80ce
data: Optimize page data creation.
Ludovic Chabant <ludovic@chabant.com>
parents:
854
diff
changeset
|
98 return segs[name] |
440
32c7c2d219d2
performance: Refactor how data is managed to reduce copying.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
99 |