Mercurial > piecrust2
comparison piecrust/data/base.py @ 6:f5ca5c5bed85
More Python 3 fixes, modularization, and new unit tests.
author | Ludovic Chabant <ludovic@chabant.com> |
---|---|
date | Sat, 16 Aug 2014 08:15:30 -0700 |
parents | 474c9882decf |
children | 30a42341cfa8 |
comparison
equal
deleted
inserted
replaced
5:474c9882decf | 6:f5ca5c5bed85 |
---|---|
2 import logging | 2 import logging |
3 from piecrust.data.assetor import Assetor | 3 from piecrust.data.assetor import Assetor |
4 | 4 |
5 | 5 |
6 logger = logging.getLogger(__name__) | 6 logger = logging.getLogger(__name__) |
7 | |
8 | |
9 class IPaginationSource(object): | |
10 def getItemsPerPage(self): | |
11 raise NotImplementedError() | |
12 | |
13 def getSourceIterator(self): | |
14 raise NotImplementedError() | |
15 | |
16 def getSorterIterator(self, it): | |
17 raise NotImplementedError() | |
18 | |
19 def getTailIterator(self, it): | |
20 raise NotImplementedError() | |
21 | |
22 def getPaginationFilter(self, page): | |
23 raise NotImplementedError() | |
7 | 24 |
8 | 25 |
9 class LazyPageConfigData(object): | 26 class LazyPageConfigData(object): |
10 """ An object that represents the configuration header of a page, | 27 """ An object that represents the configuration header of a page, |
11 but also allows for additional data. It's meant to be exposed | 28 but also allows for additional data. It's meant to be exposed |
76 | 93 |
77 def _loadCustom(self): | 94 def _loadCustom(self): |
78 pass | 95 pass |
79 | 96 |
80 | 97 |
81 def build_uri(page): | |
82 route = page.app.getRoute(page.source.name, page.source_metadata) | |
83 if route is None: | |
84 raise Exception("Can't get route for page: %s" % page.path) | |
85 return route.getUri(page.source_metadata) | |
86 | |
87 | |
88 def load_rendered_segment(data, name): | |
89 from piecrust.rendering import PageRenderingContext, render_page_segments | |
90 | |
91 uri = build_uri(data.page) | |
92 try: | |
93 ctx = PageRenderingContext(data.page, uri) | |
94 segs = render_page_segments(ctx) | |
95 except Exception as e: | |
96 logger.exception("Error rendering segments for '%s': %s" % (uri, e)) | |
97 raise | |
98 | |
99 for k, v in segs.items(): | |
100 data.mapLoader(k, None) | |
101 data.setValue(k, v) | |
102 | |
103 if 'content.abstract' in segs: | |
104 data.setValue('content', segs['content.abstract']) | |
105 data.setValue('has_more', True) | |
106 if name == 'content': | |
107 return segs['content.abstract'] | |
108 | |
109 return segs[name] | |
110 | |
111 | |
112 class PaginationData(LazyPageConfigData): | 98 class PaginationData(LazyPageConfigData): |
113 def __init__(self, page): | 99 def __init__(self, page): |
114 super(PaginationData, self).__init__(page) | 100 super(PaginationData, self).__init__(page) |
115 | 101 |
102 def _get_uri(self): | |
103 page = self._page | |
104 route = page.app.getRoute(page.source.name, page.source_metadata) | |
105 if route is None: | |
106 raise Exception("Can't get route for page: %s" % page.path) | |
107 return route.getUri(page.source_metadata) | |
108 | |
116 def _loadCustom(self): | 109 def _loadCustom(self): |
117 page_url = build_uri(self.page) | 110 page_url = self._get_uri() |
118 self.setValue('url', page_url) | 111 self.setValue('url', page_url) |
119 self.setValue('slug', page_url) | 112 self.setValue('slug', page_url) |
120 self.setValue('timestamp', | 113 self.setValue('timestamp', |
121 time.mktime(self.page.datetime.timetuple())) | 114 time.mktime(self.page.datetime.timetuple())) |
122 date_format = self.page.app.config.get('site/date_format') | 115 date_format = self.page.app.config.get('site/date_format') |
126 assetor = Assetor(self.page, page_url) | 119 assetor = Assetor(self.page, page_url) |
127 self.setValue('assets', assetor) | 120 self.setValue('assets', assetor) |
128 | 121 |
129 segment_names = self.page.config.get('segments') | 122 segment_names = self.page.config.get('segments') |
130 for name in segment_names: | 123 for name in segment_names: |
131 self.mapLoader(name, load_rendered_segment) | 124 self.mapLoader(name, self._load_rendered_segment) |
132 | 125 |
126 def _load_rendered_segment(self, data, name): | |
127 from piecrust.rendering import PageRenderingContext, render_page_segments | |
128 | |
129 assert self is data | |
130 uri = self._get_uri() | |
131 try: | |
132 ctx = PageRenderingContext(self._page, uri) | |
133 segs = render_page_segments(ctx) | |
134 except Exception as e: | |
135 logger.exception("Error rendering segments for '%s': %s" % (uri, e)) | |
136 raise | |
137 | |
138 for k, v in segs.items(): | |
139 self.mapLoader(k, None) | |
140 self.setValue(k, v) | |
141 | |
142 if 'content.abstract' in segs: | |
143 self.setValue('content', segs['content.abstract']) | |
144 self.setValue('has_more', True) | |
145 if name == 'content': | |
146 return segs['content.abstract'] | |
147 | |
148 return segs[name] | |
149 |