Mercurial > piecrust2
comparison piecrust/rendering.py @ 991:1857dbd4580f
bake: Fix bugs introduced by bake optimizations, of course.
- Make the execution stats JSON-serializable.
- Re-add ability to differentiate between sources used during segment rendering
and during layout rendering. Fixes problems with cache invalidation of
pages that use other sources.
- Make taxonomy-related stuff JSON-serializable.
| author | Ludovic Chabant <ludovic@chabant.com> |
|---|---|
| date | Mon, 20 Nov 2017 23:06:47 -0800 |
| parents | 8adc27285d93 |
| children | e94737572542 |
comparison
equal
deleted
inserted
replaced
| 990:22cf13b86cc3 | 991:1857dbd4580f |
|---|---|
| 50 """ Creates a bag of rendering properties. It's a dictionary because | 50 """ Creates a bag of rendering properties. It's a dictionary because |
| 51 it will be passed between workers during the bake process, and | 51 it will be passed between workers during the bake process, and |
| 52 saved to records. | 52 saved to records. |
| 53 """ | 53 """ |
| 54 return { | 54 return { |
| 55 'used_source_names': set(), | 55 'used_source_names': {'segments': [], 'layout': []}, |
| 56 'used_pagination': False, | 56 'used_pagination': False, |
| 57 'pagination_has_more': False, | 57 'pagination_has_more': False, |
| 58 'used_assets': False, | 58 'used_assets': False, |
| 59 } | 59 } |
| 60 | 60 |
| 66 self.force_render = force_render | 66 self.force_render = force_render |
| 67 self.pagination_source = None | 67 self.pagination_source = None |
| 68 self.pagination_filter = None | 68 self.pagination_filter = None |
| 69 self.render_info = create_render_info() | 69 self.render_info = create_render_info() |
| 70 self.custom_data = {} | 70 self.custom_data = {} |
| 71 self._current_used_source_names = None | |
| 71 | 72 |
| 72 @property | 73 @property |
| 73 def app(self): | 74 def app(self): |
| 74 return self.page.app | 75 return self.page.app |
| 76 | |
| 77 @property | |
| 78 def current_used_source_names(self): | |
| 79 usn = self._current_used_source_names | |
| 80 if usn is not None: | |
| 81 return usn | |
| 82 else: | |
| 83 raise Exception("No render pass specified.") | |
| 84 | |
| 85 def setRenderPass(self, name): | |
| 86 if name is not None: | |
| 87 self._current_used_source_names = \ | |
| 88 self.render_info['used_source_names'][name] | |
| 89 else: | |
| 90 self._current_used_source_names = None | |
| 75 | 91 |
| 76 def setPagination(self, paginator): | 92 def setPagination(self, paginator): |
| 77 ri = self.render_info | 93 ri = self.render_info |
| 78 if ri.get('used_pagination'): | 94 if ri.get('used_pagination'): |
| 79 raise Exception("Pagination has already been used.") | 95 raise Exception("Pagination has already been used.") |
| 81 ri['used_pagination'] = True | 97 ri['used_pagination'] = True |
| 82 ri['pagination_has_more'] = paginator.has_more | 98 ri['pagination_has_more'] = paginator.has_more |
| 83 self.addUsedSource(paginator._source) | 99 self.addUsedSource(paginator._source) |
| 84 | 100 |
| 85 def addUsedSource(self, source): | 101 def addUsedSource(self, source): |
| 86 ri = self.render_info | 102 usn = self.current_used_source_names |
| 87 ri['used_source_names'].add(source.name) | 103 if source.name not in usn: |
| 104 usn.append(source.name) | |
| 88 | 105 |
| 89 | 106 |
| 90 class RenderingContextStack(object): | 107 class RenderingContextStack(object): |
| 91 def __init__(self): | 108 def __init__(self): |
| 92 self._ctx_stack = [] | 109 self._ctx_stack = [] |
| 251 | 268 |
| 252 def _do_render_page_segments(ctx, page_data): | 269 def _do_render_page_segments(ctx, page_data): |
| 253 page = ctx.page | 270 page = ctx.page |
| 254 app = page.app | 271 app = page.app |
| 255 | 272 |
| 273 ctx.setRenderPass('segments') | |
| 274 | |
| 256 engine_name = page.config.get('template_engine') | 275 engine_name = page.config.get('template_engine') |
| 257 format_name = page.config.get('format') | 276 format_name = page.config.get('format') |
| 258 | 277 |
| 259 engine = get_template_engine(app, engine_name) | 278 engine = get_template_engine(app, engine_name) |
| 260 | 279 |
| 294 app = page.app | 313 app = page.app |
| 295 cur_ctx = app.env.render_ctx_stack.current_ctx | 314 cur_ctx = app.env.render_ctx_stack.current_ctx |
| 296 assert cur_ctx is not None | 315 assert cur_ctx is not None |
| 297 assert cur_ctx.page == page | 316 assert cur_ctx.page == page |
| 298 | 317 |
| 318 cur_ctx.setRenderPass('layout') | |
| 319 | |
| 299 names = layout_name.split(',') | 320 names = layout_name.split(',') |
| 300 full_names = [] | 321 full_names = [] |
| 301 for name in names: | 322 for name in names: |
| 302 if '.' not in name: | 323 if '.' not in name: |
| 303 full_names.append(name + '.html') | 324 full_names.append(name + '.html') |
