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