Пример #1
0
    def render(self, jinja_env=None):
        """Render the document using the render pool."""
        timer = self.pod.profile.timer('RenderDocumentController.render',
                                       label='{} ({})'.format(
                                           self.doc.pod_path, self.doc.locale),
                                       meta={
                                           'path': self.doc.pod_path,
                                           'locale': str(self.doc.locale)
                                       }).start_timer()

        # Validate the path with the config filters.
        self.validate_path()

        doc = self.doc
        template = jinja_env['env'].get_template(doc.view.lstrip('/'))
        track_dependency = doc_dependency.DocDependency(doc)
        local_tags = tags.create_builtin_tags(
            self.pod, doc, track_dependency=track_dependency)
        # NOTE: This should be done using get_template(... globals=...)
        # or passed as an argument into render but
        # it is not available included inside macros???
        # See: https://github.com/pallets/jinja/issues/688
        template.globals['g'] = local_tags

        # Track the message stats, including untranslated strings.
        if self.pod.is_enabled(self.pod.FEATURE_TRANSLATION_STATS):
            template.globals['_'] = tags.make_doc_gettext(doc)

        try:
            serving_path = doc.get_serving_path()
            if serving_path.endswith('/'):
                serving_path = '{}{}'.format(serving_path, self.suffix)
            rendered_content = template.render({
                'doc':
                doc,
                'env':
                self.pod.env,
                'podspec':
                self.pod.podspec,
                '_track_dependency':
                track_dependency,
            }).lstrip()
            rendered_content = self.pod.extensions_controller.trigger(
                'post_render', doc, rendered_content)
            rendered_doc = rendered_document.RenderedDocument(
                serving_path, rendered_content)
            timer.stop_timer()
            return rendered_doc
        except Exception as err:
            text = 'Error building {}: {}'
            if self.pod:
                self.pod.logger.exception(text.format(self, err))
            exception = errors.BuildError(text.format(self, err))
            exception.traceback = sys.exc_info()[2]
            exception.controller = self
            exception.exception = err
            raise exception
Пример #2
0
    def render(self, jinja_env=None):
        """Render the document using the render pool."""
        timer = self.pod.profile.timer(
            'RenderDocumentController.render',
            label='{} ({})'.format(self.doc.pod_path, self.doc.locale),
            meta={
                'path': self.doc.pod_path,
                'locale': str(self.doc.locale)}
        ).start_timer()

        # Validate the path with the config filters.
        self.validate_path()

        doc = self.doc
        template = jinja_env['env'].get_template(doc.view.lstrip('/'))
        track_dependency = doc_dependency.DocDependency(doc)
        local_tags = tags.create_builtin_tags(
            self.pod, doc, track_dependency=track_dependency)
        # NOTE: This should be done using get_template(... globals=...)
        # or passed as an argument into render but
        # it is not available included inside macros???
        # See: https://github.com/pallets/jinja/issues/688
        template.globals['g'] = local_tags

        # Track the message stats, including untranslated strings.
        if self.pod.is_enabled(self.pod.FEATURE_TRANSLATION_STATS):
            template.globals['_'] = tags.make_doc_gettext(doc)

        try:
            doc.footnotes.reset()
            serving_path = doc.get_serving_path()
            if serving_path.endswith('/'):
                serving_path = '{}{}'.format(serving_path, self.suffix)

            content = self.pod.extensions_controller.trigger('pre_render', doc, doc.body)
            if content:
                doc.format.update(content=content.encode('utf-8'))

            rendered_content = template.render({
                'doc': doc,
                'env': self.pod.env,
                'podspec': self.pod.podspec,
                '_track_dependency': track_dependency,
            }).lstrip()
            rendered_content = self.pod.extensions_controller.trigger(
                'post_render', doc, rendered_content)
            rendered_doc = rendered_document.RenderedDocument(
                serving_path, rendered_content)
            timer.stop_timer()
            return rendered_doc
        except Exception as err:
            exception = errors.BuildError(str(err))
            exception.traceback = sys.exc_info()[2]
            exception.controller = self
            exception.exception = err
            raise exception
Пример #3
0
    def render(self, jinja_env=None):
        """Render the document using the render pool."""

        timer = self.pod.profile.timer('RenderErrorController.render',
                                       label='{} ({})'.format(
                                           self.route_info.meta['key'],
                                           self.route_info.meta['view']),
                                       meta={
                                           'key': self.route_info.meta['key'],
                                           'view':
                                           self.route_info.meta['view'],
                                       }).start_timer()

        # Validate the path with the config filters.
        self.validate_path()

        with jinja_env['lock']:
            template = jinja_env['env'].get_template(
                self.route_info.meta['view'].lstrip('/'))
            local_tags = tags.create_builtin_tags(self.pod, doc=None)
            # NOTE: This should be done using get_template(... globals=...)
            # or passed as an argument into render but
            # it is not available included inside macros???
            # See: https://github.com/pallets/jinja/issues/688
            template.globals['g'] = local_tags

            try:
                serving_path = '/{}.html'.format(self.route_info.meta['key'])
                rendered_doc = rendered_document.RenderedDocument(
                    serving_path,
                    template.render({
                        'doc': None,
                        'env': self.pod.env,
                        'podspec': self.pod.podspec,
                    }).lstrip())
                timer.stop_timer()
                return rendered_doc
            except Exception as err:
                text = 'Error building {}: {}'
                if self.pod:
                    self.pod.logger.exception(text.format(self, err))
                exception = errors.BuildError(text.format(self, err))
                exception.traceback = sys.exc_info()[2]
                exception.controller = self
                exception.exception = err
                raise exception
Пример #4
0
    def render(self, jinja_env=None):
        """Render the document using the render pool."""
        timer = self.pod.profile.timer(
            'RenderErrorController.render',
            label='{} ({})'.format(
                self.route_info.meta['key'], self.route_info.meta['view']),
            meta={
                'key': self.route_info.meta['key'],
                'view': self.route_info.meta['view'],
            }
        ).start_timer()

        # Validate the path with the config filters.
        self.validate_path()

        with jinja_env['lock']:
            template = jinja_env['env'].get_template(
                self.route_info.meta['view'].lstrip('/'))
            local_tags = tags.create_builtin_tags(self.pod, doc=None)
            # NOTE: This should be done using get_template(... globals=...)
            # or passed as an argument into render but
            # it is not available included inside macros???
            # See: https://github.com/pallets/jinja/issues/688
            template.globals['g'] = local_tags

            try:
                serving_path = '/{}.html'.format(self.route_info.meta['key'])
                rendered_doc = rendered_document.RenderedDocument(
                    serving_path, template.render({
                        'doc': None,
                        'env': self.pod.env,
                        'podspec': self.pod.podspec,
                    }).lstrip())
                timer.stop_timer()
                return rendered_doc
            except Exception as err:
                text = 'Error building {}: {}'
                if self.pod:
                    self.pod.logger.exception(text.format(self, err))
                exception = errors.BuildError(text.format(self, err))
                exception.traceback = sys.exc_info()[2]
                exception.controller = self
                exception.exception = err
                raise exception
Пример #5
0
    def render(self, params, inject=True):
        doc = self.doc
        preprocessor = None
        translator = None
        if inject:
            preprocessor = self.pod.inject_preprocessors(doc=doc)
            translator = self.pod.inject_translators(doc=doc)
        jinja_env = self.pod.get_jinja_env(self.locale)
        template = jinja_env.get_template(self.view.lstrip('/'))
        track_dependency = doc_dependency.DocDependency(doc)
        local_tags = tags.create_builtin_tags(
            self.pod, doc, track_dependency=track_dependency)
        # NOTE: This should be done using get_template(... globals=...)
        # or passed as an argument into render but
        # it is not available included inside macros???
        # See: https://github.com/pallets/jinja/issues/688
        template.globals['g'] = local_tags

        # Track the message stats, including untranslated strings.
        if self.pod.is_enabled(self.pod.FEATURE_TRANSLATION_STATS):
            template.globals['_'] = tags.make_doc_gettext(doc)

        try:
            kwargs = {
                'doc': doc,
                'env': self.pod.env,
                'podspec': self.pod.podspec,
                '_track_dependency': track_dependency,
            }
            content = template.render(kwargs).lstrip()
            if self.pod.is_enabled(self.pod.FEATURE_UI):
                content = self._inject_ui(
                    content, preprocessor, translator)
            return content
        except Exception as e:
            text = 'Error building {}: {}'
            exception = errors.BuildError(text.format(self, e))
            exception.traceback = sys.exc_info()[2]
            exception.controller = self
            exception.exception = e
            if self._pod:
                self._pod.logger.exception(text.format(self, e))
            raise exception
Пример #6
0
    def _render_template(self, doc, value, options):
        # Check if template exists
        template_path = '{}/{}'.format(self._pod.root, self.template)
        if os.path.exists(template_path):
            # Get pod's jinja2 environment for rendering
            jinja = self._pod.get_jinja_env()

            # Build context for rendering of template
            context = self.context
            context['value'] = value
            context['options'] = options

            # Bring default grow tags/variables into template
            context['doc'] = doc
            context['g'] = tags.create_builtin_tags(self._pod, doc)

            with open(template_path) as template:
                template = jinja.from_string(template.read())
                return template.render(context)
Пример #7
0
    def test_default_locale_versus_no_locale(self):
        pod = testing.create_pod()
        pod.write_yaml(
            '/podspec.yaml', {
                'localization': {
                    'default_locale': 'en_US',
                    'locales': [
                        'en_US',
                        'ja_JP',
                    ],
                },
            })
        fields = {
            'path': '/{locale}/{base}/',
            'view': '/views/base.html',
            'localization': {
                'path': '/{locale}/{base}/',
            },
        }
        pod.write_yaml('/content/pages/_blueprint.yaml', fields)
        pod.write_yaml('/content/pages/doc1.yaml', {
            '$localization': {
                'default_locale': 'ja_JP',
                'locales': [
                    'ja_JP',
                ],
            }
        })
        pod.write_yaml('/content/pages/doc2.yaml',
                       {'$localization': {
                           'locales': [
                               'en_US',
                           ],
                       }})
        pod.write_yaml('/content/pages/doc3.yaml', {})

        # Verify `docs` locale kwarg behavior, should default to calling
        # document's locale. Verify a calling en_US doc only gets en_US docs.
        doc = pod.get_doc('/content/pages/doc3.yaml')
        tags_in_context = tags.create_builtin_tags(pod, doc)
        docs = tags_in_context['docs']('pages')
        self.assertItemsEqual([
            '/content/pages/doc2.yaml',
            '/content/pages/doc3.yaml',
        ], [doc.pod_path for doc in docs])

        # Verify a calling ja_JP doc only gets ja_JP docs.
        doc = pod.get_doc('/content/pages/doc1.yaml')
        tags_in_context = tags.create_builtin_tags(pod, doc)
        docs = tags_in_context['docs']('pages')
        self.assertItemsEqual([
            '/content/pages/doc1.yaml',
            '/content/pages/doc3.yaml',
        ], [doc.pod_path for doc in docs])

        # Verify an explicit `locale=None` returns all docs regardless of the
        # calling document's locale.
        doc = pod.get_doc('/content/pages/doc1.yaml')
        tags_in_context = tags.create_builtin_tags(pod, doc)
        docs = tags_in_context['docs']('pages', locale=None)
        self.assertItemsEqual([
            '/content/pages/doc1.yaml',
            '/content/pages/doc2.yaml',
            '/content/pages/doc3.yaml',
        ], [doc.pod_path for doc in docs])
        doc = pod.get_doc('/content/pages/doc2.yaml')
        tags_in_context = tags.create_builtin_tags(pod, doc)
        docs = tags_in_context['docs']('pages', locale=None)
        self.assertItemsEqual([
            '/content/pages/doc1.yaml',
            '/content/pages/doc2.yaml',
            '/content/pages/doc3.yaml',
        ], [doc.pod_path for doc in docs])
Пример #8
0
    def test_default_locale_versus_no_locale(self):
        pod = testing.create_pod()
        pod.write_yaml('/podspec.yaml', {
            'localization': {
                'default_locale': 'en_US',
                'locales': [
                    'en_US',
                    'ja_JP',
                ],
            },
        })
        fields = {
            'path': '/{locale}/{base}/',
            'view': '/views/base.html',
            'localization': {
                'path': '/{locale}/{base}/',
            },
        }
        pod.write_yaml('/content/pages/_blueprint.yaml', fields)
        pod.write_yaml('/content/pages/doc1.yaml', {
            '$localization': {
                'default_locale': 'ja_JP',
                'locales': [
                    'ja_JP',
                ],
            }
        })
        pod.write_yaml('/content/pages/doc2.yaml', {
            '$localization': {
                'locales': [
                    'en_US',
                ],
            }
        })
        pod.write_yaml('/content/pages/doc3.yaml', {})

        # Verify `docs` locale kwarg behavior, should default to calling
        # document's locale. Verify a calling en_US doc only gets en_US docs.
        doc = pod.get_doc('/content/pages/doc3.yaml')
        tags_in_context = tags.create_builtin_tags(pod, doc)
        docs = tags_in_context['docs']('pages')
        self.assertItemsEqual([
            '/content/pages/doc2.yaml',
            '/content/pages/doc3.yaml',
        ], [doc.pod_path for doc in docs])

        # Verify a calling ja_JP doc only gets ja_JP docs.
        doc = pod.get_doc('/content/pages/doc1.yaml')
        tags_in_context = tags.create_builtin_tags(pod, doc)
        docs = tags_in_context['docs']('pages')
        self.assertItemsEqual([
            '/content/pages/doc1.yaml',
            '/content/pages/doc3.yaml',
        ], [doc.pod_path for doc in docs])

        # Verify an explicit `locale=None` returns all docs regardless of the
        # calling document's locale.
        doc = pod.get_doc('/content/pages/doc1.yaml')
        tags_in_context = tags.create_builtin_tags(pod, doc)
        docs = tags_in_context['docs']('pages', locale=None)
        self.assertItemsEqual([
            '/content/pages/doc1.yaml',
            '/content/pages/doc2.yaml',
            '/content/pages/doc3.yaml',
        ], [doc.pod_path for doc in docs])
        doc = pod.get_doc('/content/pages/doc2.yaml')
        tags_in_context = tags.create_builtin_tags(pod, doc)
        docs = tags_in_context['docs']('pages', locale=None)
        self.assertItemsEqual([
            '/content/pages/doc1.yaml',
            '/content/pages/doc2.yaml',
            '/content/pages/doc3.yaml',
        ], [doc.pod_path for doc in docs])