def _renderSegments(self, job, ctx, result): # Here our job is to render the page's segments so that they're # cached in memory and on disk... unless we detect that the page # is using some other sources, in which case we abort and we'll try # again on the second pass. content_item = content_item_from_job(self, job) logger.debug("Render segments for: %s" % content_item.spec) page = self.app.getPage(self.source, content_item) if page.config.get(self._draft_setting): raise Exception("Shouldn't have a draft page in a render job!") env = self.app.env env.abort_source_use = True try: rdr_ctx = RenderingContext(page) render_page_segments(rdr_ctx) except AbortedSourceUseError: logger.debug("Page was aborted for using source: %s" % content_item.spec) result['flags'] = \ PagePipelineRecordEntry.FLAG_ABORTED_FOR_SOURCE_USE env.stats.stepCounter("SourceUseAbortions") env.stats.addManifestEntry("SourceUseAbortions", content_item.spec) finally: env.abort_source_use = False
def handleJob(self, job): # Render the segments for the first sub-page of this page. fac = load_factory(self.app, job) # These things should be OK as they're checked upstream by the baker. route = self.app.getRoute(fac.source.name, fac.metadata, skip_taxonomies=True) assert route is not None page = fac.buildPage() route_metadata = create_route_metadata(page) qp = QualifiedPage(page, route, route_metadata) ctx = PageRenderingContext(qp) self.app.env.abort_source_use = True result = { 'path': fac.path, 'aborted': False, 'errors': None} logger.debug("Preparing page: %s" % fac.ref_spec) try: render_page_segments(ctx) except AbortedSourceUseError: logger.debug("Page %s was aborted." % fac.ref_spec) result['aborted'] = True except Exception as ex: logger.debug("Got rendering error. Sending it to master.") result['errors'] = _get_errors(ex) if self.ctx.debug: logger.exception(ex) finally: self.app.env.abort_source_use = False return result
def handleJob(self, job): # Render the segments for the first sub-page of this page. fac = load_factory(self.app, job['factory_info']) self.app.env.addManifestEntry('RenderJobs', fac.ref_spec) route_index = job['route_index'] route = self.app.routes[route_index] page = fac.buildPage() route_metadata = create_route_metadata(page) qp = QualifiedPage(page, route, route_metadata) ctx = PageRenderingContext(qp) self.app.env.abort_source_use = True result = { 'path': fac.path, 'aborted': False, 'errors': None} logger.debug("Preparing page: %s" % fac.ref_spec) try: render_page_segments(ctx) except AbortedSourceUseError: logger.debug("Page %s was aborted." % fac.ref_spec) self.app.env.stepCounter("SourceUseAbortions") result['aborted'] = True except Exception as ex: logger.debug("Got rendering error. Sending it to master.") result['errors'] = _get_errors(ex) if self.ctx.app.debug: logger.exception(ex) finally: self.app.env.abort_source_use = False return result
def _load_rendered_segment(data, name): page = data._page do_render = True stack = page.app.env.render_ctx_stack if stack.hasPage(page): # This is the pagination data for the page that is currently # being rendered! Inception! But this is possible... so just # prevent infinite recursion. do_render = False if do_render: uri = page.getUri() try: from piecrust.rendering import (RenderingContext, render_page_segments) ctx = RenderingContext(page) render_result = render_page_segments(ctx) segs = render_result.segments except AbortedSourceUseError: raise except Exception as ex: logger.exception(ex) raise Exception("Error rendering segments for '%s'" % uri) from ex else: segs = {} for name in page.config.get('segments'): segs[name] = "<unavailable: current page>" unmap_loader = data._unmapLoader set_val = data._setValue for k, v in segs.items(): unmap_loader(k) set_val(k, v) if 'content.abstract' in segs: set_val('content', segs['content.abstract']) set_val('has_more', True) if name == 'content': return segs['content.abstract'] return segs[name]
def _load_rendered_segment(self, data, name): do_render = True eis = self._page.app.env.exec_info_stack if eis is not None and eis.hasPage(self._page): # This is the pagination data for the page that is currently # being rendered! Inception! But this is possible... so just # prevent infinite recursion. do_render = False assert self is data if do_render: uri = self._get_uri() try: from piecrust.rendering import ( QualifiedPage, PageRenderingContext, render_page_segments) qp = QualifiedPage(self._page, self._route, self._route_metadata) ctx = PageRenderingContext(qp) render_result = render_page_segments(ctx) segs = render_result.segments except Exception as ex: logger.exception(ex) raise Exception( "Error rendering segments for '%s'" % uri) from ex else: segs = {} for name in self._page.config.get('segments'): segs[name] = "<unavailable: current page>" for k, v in segs.items(): self._unmapLoader(k) self._setValue(k, v) if 'content.abstract' in segs: self._setValue('content', segs['content.abstract']) self._setValue('has_more', True) if name == 'content': return segs['content.abstract'] return segs[name]
def _load_rendered_segment(self, data, name): do_render = True eis = self._page.app.env.exec_info_stack if eis is not None and eis.hasPage(self._page): # This is the pagination data for the page that is currently # being rendered! Inception! But this is possible... so just # prevent infinite recursion. do_render = False assert self is data if do_render: uri = self._get_uri() try: from piecrust.rendering import (QualifiedPage, PageRenderingContext, render_page_segments) qp = QualifiedPage(self._page, self._route, self._route_metadata) ctx = PageRenderingContext(qp) render_result = render_page_segments(ctx) segs = render_result.segments except Exception as e: raise Exception("Error rendering segments for '%s'" % uri) from e else: segs = {} for name in self._page.config.get('segments'): segs[name] = "<unavailable: current page>" for k, v in segs.items(): self._unmapLoader(k) self._setValue(k, v) if 'content.abstract' in segs: self._setValue('content', segs['content.abstract']) self._setValue('has_more', True) if name == 'content': return segs['content.abstract'] return segs[name]