diff 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
line wrap: on
line diff
--- a/piecrust/rendering.py	Sun Nov 19 14:29:52 2017 -0800
+++ b/piecrust/rendering.py	Mon Nov 20 23:06:47 2017 -0800
@@ -52,7 +52,7 @@
         saved to records.
     """
     return {
-        'used_source_names': set(),
+        'used_source_names': {'segments': [], 'layout': []},
         'used_pagination': False,
         'pagination_has_more': False,
         'used_assets': False,
@@ -68,11 +68,27 @@
         self.pagination_filter = None
         self.render_info = create_render_info()
         self.custom_data = {}
+        self._current_used_source_names = None
 
     @property
     def app(self):
         return self.page.app
 
+    @property
+    def current_used_source_names(self):
+        usn = self._current_used_source_names
+        if usn is not None:
+            return usn
+        else:
+            raise Exception("No render pass specified.")
+
+    def setRenderPass(self, name):
+        if name is not None:
+            self._current_used_source_names = \
+                self.render_info['used_source_names'][name]
+        else:
+            self._current_used_source_names = None
+
     def setPagination(self, paginator):
         ri = self.render_info
         if ri.get('used_pagination'):
@@ -83,8 +99,9 @@
         self.addUsedSource(paginator._source)
 
     def addUsedSource(self, source):
-        ri = self.render_info
-        ri['used_source_names'].add(source.name)
+        usn = self.current_used_source_names
+        if source.name not in usn:
+            usn.append(source.name)
 
 
 class RenderingContextStack(object):
@@ -253,6 +270,8 @@
     page = ctx.page
     app = page.app
 
+    ctx.setRenderPass('segments')
+
     engine_name = page.config.get('template_engine')
     format_name = page.config.get('format')
 
@@ -296,6 +315,8 @@
     assert cur_ctx is not None
     assert cur_ctx.page == page
 
+    cur_ctx.setRenderPass('layout')
+
     names = layout_name.split(',')
     full_names = []
     for name in names: