Mercurial > piecrust2
annotate piecrust/data/builder.py @ 833:cb39c0dbe5f0
Merge pull request #40 from GitHub.
| author | Ludovic Chabant <ludovic@chabant.com> |
|---|---|
| date | Sun, 05 Feb 2017 22:42:18 -0800 |
| parents | a12ad254176e |
| children | 71c4f43d8fc1 |
| rev | line source |
|---|---|
|
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
1 import logging |
|
369
4b1019bb2533
serve: Giant refactor to change how we handle data when serving pages.
Ludovic Chabant <ludovic@chabant.com>
parents:
352
diff
changeset
|
2 from werkzeug.utils import cached_property |
|
440
32c7c2d219d2
performance: Refactor how data is managed to reduce copying.
Ludovic Chabant <ludovic@chabant.com>
parents:
420
diff
changeset
|
3 from piecrust.data.base import MergedMapping |
|
247
d9d5c5de02a8
data: Add a top level wrapper for `Linker`.
Ludovic Chabant <ludovic@chabant.com>
parents:
237
diff
changeset
|
4 from piecrust.data.linker import PageLinkerData |
|
440
32c7c2d219d2
performance: Refactor how data is managed to reduce copying.
Ludovic Chabant <ludovic@chabant.com>
parents:
420
diff
changeset
|
5 from piecrust.data.pagedata import PageData |
|
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
6 from piecrust.data.paginator import Paginator |
|
440
32c7c2d219d2
performance: Refactor how data is managed to reduce copying.
Ludovic Chabant <ludovic@chabant.com>
parents:
420
diff
changeset
|
7 from piecrust.data.piecrustdata import PieCrustData |
|
32c7c2d219d2
performance: Refactor how data is managed to reduce copying.
Ludovic Chabant <ludovic@chabant.com>
parents:
420
diff
changeset
|
8 from piecrust.data.providersdata import DataProvidersData |
|
802
0da1207472d3
templating: Put the routing functions in the data, not the template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
723
diff
changeset
|
9 from piecrust.routing import CompositeRouteFunction |
|
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
10 |
|
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
11 |
|
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
12 logger = logging.getLogger(__name__) |
|
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
13 |
|
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
14 |
|
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
15 class DataBuildingContext(object): |
|
369
4b1019bb2533
serve: Giant refactor to change how we handle data when serving pages.
Ludovic Chabant <ludovic@chabant.com>
parents:
352
diff
changeset
|
16 def __init__(self, qualified_page, page_num=1): |
|
4b1019bb2533
serve: Giant refactor to change how we handle data when serving pages.
Ludovic Chabant <ludovic@chabant.com>
parents:
352
diff
changeset
|
17 self.page = qualified_page |
|
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
18 self.page_num = page_num |
|
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
19 self.pagination_source = None |
|
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
20 self.pagination_filter = None |
|
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
21 |
|
12
30a42341cfa8
Define page slugs properly, avoid recursions with debug data.
Ludovic Chabant <ludovic@chabant.com>
parents:
5
diff
changeset
|
22 @property |
|
329
422052d2e978
internal: Try handling URLs in a consistent way.
Ludovic Chabant <ludovic@chabant.com>
parents:
323
diff
changeset
|
23 def app(self): |
|
422052d2e978
internal: Try handling URLs in a consistent way.
Ludovic Chabant <ludovic@chabant.com>
parents:
323
diff
changeset
|
24 return self.page.app |
|
12
30a42341cfa8
Define page slugs properly, avoid recursions with debug data.
Ludovic Chabant <ludovic@chabant.com>
parents:
5
diff
changeset
|
25 |
|
369
4b1019bb2533
serve: Giant refactor to change how we handle data when serving pages.
Ludovic Chabant <ludovic@chabant.com>
parents:
352
diff
changeset
|
26 @cached_property |
|
4b1019bb2533
serve: Giant refactor to change how we handle data when serving pages.
Ludovic Chabant <ludovic@chabant.com>
parents:
352
diff
changeset
|
27 def uri(self): |
|
4b1019bb2533
serve: Giant refactor to change how we handle data when serving pages.
Ludovic Chabant <ludovic@chabant.com>
parents:
352
diff
changeset
|
28 return self.page.getUri(self.page_num) |
|
4b1019bb2533
serve: Giant refactor to change how we handle data when serving pages.
Ludovic Chabant <ludovic@chabant.com>
parents:
352
diff
changeset
|
29 |
|
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
30 |
|
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
31 def build_page_data(ctx): |
|
369
4b1019bb2533
serve: Giant refactor to change how we handle data when serving pages.
Ludovic Chabant <ludovic@chabant.com>
parents:
352
diff
changeset
|
32 app = ctx.app |
|
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
33 page = ctx.page |
|
440
32c7c2d219d2
performance: Refactor how data is managed to reduce copying.
Ludovic Chabant <ludovic@chabant.com>
parents:
420
diff
changeset
|
34 pgn_source = ctx.pagination_source or get_default_pagination_source(page) |
|
723
606f6d57b5df
routing: Cleanup URL routing and improve page matching.
Ludovic Chabant <ludovic@chabant.com>
parents:
556
diff
changeset
|
35 first_uri = ctx.page.getUri(1) |
|
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
36 |
|
12
30a42341cfa8
Define page slugs properly, avoid recursions with debug data.
Ludovic Chabant <ludovic@chabant.com>
parents:
5
diff
changeset
|
37 pc_data = PieCrustData() |
|
440
32c7c2d219d2
performance: Refactor how data is managed to reduce copying.
Ludovic Chabant <ludovic@chabant.com>
parents:
420
diff
changeset
|
38 config_data = PageData(page, ctx) |
|
369
4b1019bb2533
serve: Giant refactor to change how we handle data when serving pages.
Ludovic Chabant <ludovic@chabant.com>
parents:
352
diff
changeset
|
39 paginator = Paginator(page, pgn_source, |
|
4b1019bb2533
serve: Giant refactor to change how we handle data when serving pages.
Ludovic Chabant <ludovic@chabant.com>
parents:
352
diff
changeset
|
40 page_num=ctx.page_num, |
|
4b1019bb2533
serve: Giant refactor to change how we handle data when serving pages.
Ludovic Chabant <ludovic@chabant.com>
parents:
352
diff
changeset
|
41 pgn_filter=ctx.pagination_filter) |
|
830
a12ad254176e
Renamed buildPageAssetor to buildAssetor
Ben Artin <ben@artins.org>
parents:
826
diff
changeset
|
42 assetor = page.source.buildAssetor(page, first_uri) |
|
247
d9d5c5de02a8
data: Add a top level wrapper for `Linker`.
Ludovic Chabant <ludovic@chabant.com>
parents:
237
diff
changeset
|
43 linker = PageLinkerData(page.source, page.rel_path) |
|
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
44 data = { |
|
12
30a42341cfa8
Define page slugs properly, avoid recursions with debug data.
Ludovic Chabant <ludovic@chabant.com>
parents:
5
diff
changeset
|
45 'piecrust': pc_data, |
|
420
f1b759c188b0
internal: Optimize page data building.
Ludovic Chabant <ludovic@chabant.com>
parents:
406
diff
changeset
|
46 'page': config_data, |
|
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
47 'assets': assetor, |
|
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
48 'pagination': paginator, |
|
247
d9d5c5de02a8
data: Add a top level wrapper for `Linker`.
Ludovic Chabant <ludovic@chabant.com>
parents:
237
diff
changeset
|
49 'family': linker |
|
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
50 } |
|
420
f1b759c188b0
internal: Optimize page data building.
Ludovic Chabant <ludovic@chabant.com>
parents:
406
diff
changeset
|
51 |
|
802
0da1207472d3
templating: Put the routing functions in the data, not the template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
723
diff
changeset
|
52 for route in app.routes: |
|
0da1207472d3
templating: Put the routing functions in the data, not the template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
723
diff
changeset
|
53 name = route.func_name |
|
0da1207472d3
templating: Put the routing functions in the data, not the template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
723
diff
changeset
|
54 func = data.get(name) |
|
0da1207472d3
templating: Put the routing functions in the data, not the template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
723
diff
changeset
|
55 if func is None: |
|
0da1207472d3
templating: Put the routing functions in the data, not the template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
723
diff
changeset
|
56 func = CompositeRouteFunction() |
|
0da1207472d3
templating: Put the routing functions in the data, not the template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
723
diff
changeset
|
57 func.addFunc(route) |
|
0da1207472d3
templating: Put the routing functions in the data, not the template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
723
diff
changeset
|
58 data[name] = func |
|
0da1207472d3
templating: Put the routing functions in the data, not the template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
723
diff
changeset
|
59 elif isinstance(func, CompositeRouteFunction): |
|
0da1207472d3
templating: Put the routing functions in the data, not the template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
723
diff
changeset
|
60 func.addFunc(route) |
|
0da1207472d3
templating: Put the routing functions in the data, not the template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
723
diff
changeset
|
61 else: |
|
0da1207472d3
templating: Put the routing functions in the data, not the template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
723
diff
changeset
|
62 raise Exception("Route function '%s' collides with an " |
|
0da1207472d3
templating: Put the routing functions in the data, not the template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
723
diff
changeset
|
63 "existing function or template data." % |
|
0da1207472d3
templating: Put the routing functions in the data, not the template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
723
diff
changeset
|
64 name) |
|
0da1207472d3
templating: Put the routing functions in the data, not the template engine.
Ludovic Chabant <ludovic@chabant.com>
parents:
723
diff
changeset
|
65 |
|
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
66 #TODO: handle slugified taxonomy terms. |
|
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
67 |
|
440
32c7c2d219d2
performance: Refactor how data is managed to reduce copying.
Ludovic Chabant <ludovic@chabant.com>
parents:
420
diff
changeset
|
68 site_data = app.config.getAll() |
|
32c7c2d219d2
performance: Refactor how data is managed to reduce copying.
Ludovic Chabant <ludovic@chabant.com>
parents:
420
diff
changeset
|
69 providers_data = DataProvidersData(page) |
|
32c7c2d219d2
performance: Refactor how data is managed to reduce copying.
Ludovic Chabant <ludovic@chabant.com>
parents:
420
diff
changeset
|
70 data = MergedMapping([data, providers_data, site_data]) |
|
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
71 |
|
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
72 # Do this at the end because we want all the data to be ready to be |
|
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
73 # displayed in the debugger window. |
|
223
7decf00eee47
serve: Don't expose the debug info right away when running with `--debug`.
Ludovic Chabant <ludovic@chabant.com>
parents:
222
diff
changeset
|
74 if (app.config.get('site/show_debug_info') and |
|
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
75 not app.config.get('baker/is_baking')): |
|
556
93b656f0af54
serve: Improve debug information in the preview server.
Ludovic Chabant <ludovic@chabant.com>
parents:
440
diff
changeset
|
76 pc_data.enableDebugInfo(page) |
|
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
77 |
|
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
78 return data |
|
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
79 |
|
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
80 |
|
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
81 def build_layout_data(page, page_data, contents): |
| 5 | 82 for name, txt in contents.items(): |
|
369
4b1019bb2533
serve: Giant refactor to change how we handle data when serving pages.
Ludovic Chabant <ludovic@chabant.com>
parents:
352
diff
changeset
|
83 if name in page_data: |
|
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
84 logger.warning("Content segment '%s' will hide existing data." % |
|
369
4b1019bb2533
serve: Giant refactor to change how we handle data when serving pages.
Ludovic Chabant <ludovic@chabant.com>
parents:
352
diff
changeset
|
85 name) |
|
440
32c7c2d219d2
performance: Refactor how data is managed to reduce copying.
Ludovic Chabant <ludovic@chabant.com>
parents:
420
diff
changeset
|
86 page_data._prependMapping(contents) |
|
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
87 |
|
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
88 |
|
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
89 def get_default_pagination_source(page): |
|
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
90 app = page.app |
|
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
91 source_name = page.config.get('source') or page.config.get('blog') |
|
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
92 if source_name is None: |
|
323
412537e91e45
pagination: Add support for `site/default_pagination_source`.
Ludovic Chabant <ludovic@chabant.com>
parents:
298
diff
changeset
|
93 source_name = app.config.get('site/default_pagination_source') |
|
412537e91e45
pagination: Add support for `site/default_pagination_source`.
Ludovic Chabant <ludovic@chabant.com>
parents:
298
diff
changeset
|
94 if source_name is None: |
|
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
95 blog_names = app.config.get('site/blogs') |
|
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
96 if blog_names is not None: |
|
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
97 source_name = blog_names[0] |
|
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
98 else: |
|
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
99 source_name = app.sources[0].name |
|
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
100 source = app.getSource(source_name) |
|
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
101 return source |
|
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
102 |
