Mercurial > piecrust2
comparison piecrust/data/paginationdata.py @ 852:4850f8c21b6e
core: Start of the big refactor for PieCrust 3.0.
* Everything is a `ContentSource`, including assets directories.
* Most content sources are subclasses of the base file-system source.
* A source is processed by a "pipeline", and there are 2 built-in pipelines,
one for assets and one for pages. The asset pipeline is vaguely functional,
but the page pipeline is completely broken right now.
* Rewrite the baking process as just running appropriate pipelines on each
content item. This should allow for better parallelization.
author | Ludovic Chabant <ludovic@chabant.com> |
---|---|
date | Wed, 17 May 2017 00:11:48 -0700 |
parents | a12ad254176e |
children | f070a4fc033c |
comparison
equal
deleted
inserted
replaced
851:2c7e57d80bba | 852:4850f8c21b6e |
---|---|
1 import time | 1 import time |
2 import logging | 2 import logging |
3 from piecrust.data.assetor import Assetor | |
4 from piecrust.data.pagedata import LazyPageConfigData | 3 from piecrust.data.pagedata import LazyPageConfigData |
5 from piecrust.routing import create_route_metadata | |
6 from piecrust.uriutil import split_uri | |
7 | 4 |
8 | 5 |
9 logger = logging.getLogger(__name__) | 6 logger = logging.getLogger(__name__) |
10 | 7 |
11 | 8 |
12 class PaginationData(LazyPageConfigData): | 9 class PaginationData(LazyPageConfigData): |
13 def __init__(self, page): | 10 def __init__(self, qualified_page): |
14 super(PaginationData, self).__init__(page) | 11 super(PaginationData, self).__init__(qualified_page.page) |
15 self._route = None | 12 self._qualified_page = qualified_page |
16 self._route_metadata = None | |
17 | |
18 def _get_uri(self): | |
19 page = self._page | |
20 if self._route is None: | |
21 # TODO: this is not quite correct, as we're missing parts of the | |
22 # route metadata if the current page is a taxonomy page. | |
23 route_metadata = create_route_metadata(page) | |
24 self._route = page.app.getSourceRoute(page.source.name, route_metadata) | |
25 self._route_metadata = route_metadata | |
26 if self._route is None: | |
27 raise Exception("Can't get route for page: %s" % page.path) | |
28 return self._route.getUri(self._route_metadata) | |
29 | 13 |
30 def _load(self): | 14 def _load(self): |
15 from piecrust.uriutil import split_uri | |
16 | |
31 page = self._page | 17 page = self._page |
32 dt = page.datetime | 18 dt = page.datetime |
33 page_url = self._get_uri() | 19 page_url = self._qualified_page.uri |
34 _, slug = split_uri(page.app, page_url) | 20 _, slug = split_uri(page.app, page_url) |
35 self._setValue('url', page_url) | 21 self._setValue('url', page_url) |
36 self._setValue('slug', slug) | 22 self._setValue('slug', slug) |
37 self._setValue( | 23 self._setValue( |
38 'timestamp', | 24 'timestamp', |
39 time.mktime(page.datetime.timetuple())) | 25 time.mktime(page.datetime.timetuple())) |
40 self._setValue('datetime', { | 26 self._setValue('datetime', { |
41 'year': dt.year, 'month': dt.month, 'day': dt.day, | 27 'year': dt.year, 'month': dt.month, 'day': dt.day, |
42 'hour': dt.hour, 'minute': dt.minute, 'second': dt.second}) | 28 'hour': dt.hour, 'minute': dt.minute, 'second': dt.second}) |
43 date_format = page.app.config.get('site/date_format') | 29 date_format = page.app.config.get('site/date_format') |
44 if date_format: | 30 if date_format: |
52 for name in segment_names: | 38 for name in segment_names: |
53 self._mapLoader(name, self._load_rendered_segment) | 39 self._mapLoader(name, self._load_rendered_segment) |
54 | 40 |
55 def _load_rendered_segment(self, data, name): | 41 def _load_rendered_segment(self, data, name): |
56 do_render = True | 42 do_render = True |
57 eis = self._page.app.env.exec_info_stack | 43 stack = self._page.app.env.render_ctx_stack |
58 if eis is not None and eis.hasPage(self._page): | 44 if stack.hasPage(self._page): |
59 # This is the pagination data for the page that is currently | 45 # This is the pagination data for the page that is currently |
60 # being rendered! Inception! But this is possible... so just | 46 # being rendered! Inception! But this is possible... so just |
61 # prevent infinite recursion. | 47 # prevent infinite recursion. |
62 do_render = False | 48 do_render = False |
63 | 49 |
64 assert self is data | 50 assert self is data |
65 | 51 |
66 if do_render: | 52 if do_render: |
67 uri = self._get_uri() | 53 uri = self._qualified_page.uri |
68 try: | 54 try: |
69 from piecrust.rendering import ( | 55 from piecrust.rendering import ( |
70 QualifiedPage, PageRenderingContext, | 56 RenderingContext, render_page_segments) |
71 render_page_segments) | 57 ctx = RenderingContext(self._qualified_page) |
72 qp = QualifiedPage(self._page, self._route, | |
73 self._route_metadata) | |
74 ctx = PageRenderingContext(qp) | |
75 render_result = render_page_segments(ctx) | 58 render_result = render_page_segments(ctx) |
76 segs = render_result.segments | 59 segs = render_result.segments |
77 except Exception as ex: | 60 except Exception as ex: |
78 logger.exception(ex) | 61 logger.exception(ex) |
79 raise Exception( | 62 raise Exception( |
80 "Error rendering segments for '%s'" % uri) from ex | 63 "Error rendering segments for '%s'" % uri) from ex |
81 else: | 64 else: |
82 segs = {} | 65 segs = {} |
83 for name in self._page.config.get('segments'): | 66 for name in self._page.config.get('segments'): |
84 segs[name] = "<unavailable: current page>" | 67 segs[name] = "<unavailable: current page>" |
85 | 68 |