Exemplo n.º 1
0
        def node_render(context):
            if is_pattern_library_context(context):
                tag_overridden = False
                result = ''

                # Load pattern's config
                current_template_name = parser.origin.template_name
                pattern_config = get_pattern_config(current_template_name)

                # Extract values for lookup from the token
                bits = token.split_contents()
                tag_name = bits[0]
                arguments = ' '.join(bits[1:]).strip()

                # Get config for a specific tag
                tag_config = pattern_config.get('tags', {}).get(tag_name, {})
                if tag_config:
                    # Get config for specific arguments
                    tag_config = tag_config.get(arguments, {})

                    if 'raw' in tag_config:
                        # Return raw data (it can be string or a structure), if defined
                        result = tag_config['raw']
                        tag_overridden = True
                    elif 'template_name' in tag_config:
                        # Render pattern, if raw string is not defined
                        template_name = tag_config['template_name']
                        request = context.get('request')
                        result = render_pattern(request,
                                                template_name,
                                                allow_non_patterns=True)
                        tag_overridden = True

                    # TODO: Allow objects with the __str__ method
                    # In some cases we must return an object that can
                    # be rendered as a string `{{ result }}`
                    # and allow users to access it's attributes `{{ result.url }}`

                if tag_overridden:
                    if isinstance(original_node, SimpleNode):
                        # If it's a SimpleNode try to use it's target_var
                        target_var = original_node.target_var
                    else:
                        # If it's a custom tag, check for the target_var in tag's config
                        target_var = tag_config.get('target_var')

                    if target_var:
                        # If a value for the target_var is supplied,
                        # write result into the variable
                        context[target_var] = result
                        return ''

                    # Render result instead of the tag
                    return result
                else:
                    logger.warning(
                        'No stub data defined for the "%s" tag in the "%s" template',
                        tag_name, current_template_name)

            return original_node_render(context)
    def test_applied_by_render_pattern(self, render_to_string):
        request = HttpRequest()
        registry.register(modifier_1)
        registry.register(modifier_2, template=atom_template)
        registry.register(modifier_3, template=atom_template)

        render_pattern(request, atom_template)
        render_to_string.assert_called_with(
            atom_template,
            request=request,
            context={
                "atom_var": "atom_var value from test_atom.yaml",
                "is_pattern_library": True,
                "__pattern_library_tag_overrides": {},
                "foo": "bar",
                "beep": "boop",
            },
        )
Exemplo n.º 3
0
    def get(self, request, pattern_template_name=None):
        try:
            rendered_pattern = render_pattern(request, pattern_template_name)
        except TemplateIsNotPattern:
            raise Http404

        context = self.get_context_data()
        context['pattern_library_rendered_pattern'] = rendered_pattern

        return self.render_to_response(context)
Exemplo n.º 4
0
def render_pattern_api(request):
    data = json.loads(request.body.decode("utf-8"))
    template_name = data["template_name"]
    config = data["config"]

    try:
        rendered_pattern = render_pattern(
            request, template_name, allow_non_patterns=False, config=config
        )
    except TemplateIsNotPattern:
        raise Http404

    return HttpResponse(rendered_pattern)
Exemplo n.º 5
0
    def get(self, request, pattern_template_name=None):
        try:
            rendered_pattern = render_pattern(request, pattern_template_name)
        except TemplateIsNotPattern:
            return HttpResponseBadRequest()

        # Do not render page patterns as part of the base template
        # because it should already extend base template
        if is_pattern_type(pattern_template_name, 'pages'):
            return HttpResponse(rendered_pattern)

        context = self.get_context_data()
        context['pattern_library_rendered_pattern'] = rendered_pattern

        return self.render_to_response(context)
Exemplo n.º 6
0
    def get(self, request, pattern_template_name=None):
        pattern_template_ancestors = get_template_ancestors(
            pattern_template_name,
            context=get_pattern_context(self.kwargs['pattern_template_name']),
        )
        pattern_is_fragment = set(pattern_template_ancestors).isdisjoint(
            set(get_base_template_names()))

        try:
            rendered_pattern = render_pattern(request, pattern_template_name)
        except TemplateIsNotPattern:
            raise Http404

        if pattern_is_fragment:
            context = self.get_context_data()
            context['pattern_library_rendered_pattern'] = rendered_pattern
            return self.render_to_response(context)

        return HttpResponse(rendered_pattern)
    def render_pattern(self, request, pattern_template_name):
        rendered_pattern = render_pattern(request, pattern_template_name)

        # If we don’t wrap fragments in the base template, we can simply render the pattern and return as-is.
        if not self.wrap_fragments:
            return rendered_pattern

        pattern_template_ancestors = get_template_ancestors(
            pattern_template_name,
            context=get_pattern_context(pattern_template_name),
        )
        pattern_is_fragment = set(pattern_template_ancestors).isdisjoint(
            set(get_base_template_names()))

        if pattern_is_fragment:
            base_template = get_pattern_base_template_name()
            context = get_pattern_context(base_template)
            context['pattern_library_rendered_pattern'] = rendered_pattern
            return render_to_string(base_template,
                                    request=request,
                                    context=context)
        else:
            return rendered_pattern
Exemplo n.º 8
0
        def node_render(context):
            if is_pattern_library_context(context):
                tag_overridden = False
                result = ""

                # Get overriden tag config.
                tag_overrides = context.get("__pattern_library_tag_overrides", {})

                # Extract values for lookup from the token
                bits = token.split_contents()
                tag_name = bits[0]
                arguments = " ".join(bits[1:]).strip()

                # Get config for a specific tag
                tag_config = tag_overrides.get(tag_name, {})
                if tag_config:
                    # Get config for specific arguments
                    tag_config = tag_config.get(arguments, {})

                    if "raw" in tag_config:
                        # Return raw data (it can be string or a structure), if defined
                        result = tag_config["raw"]
                        tag_overridden = True
                    elif "template_name" in tag_config:
                        # Render pattern, if raw string is not defined
                        template_name = tag_config["template_name"]
                        request = context.get("request")
                        result = render_pattern(
                            request, template_name, allow_non_patterns=True
                        )
                        tag_overridden = True

                    # TODO: Allow objects with the __str__ method
                    # In some cases we must return an object that can
                    # be rendered as a string `{{ result }}`
                    # and allow users to access it's attributes `{{ result.url }}`

                if tag_overridden:
                    if isinstance(original_node, SimpleNode):
                        # If it's a SimpleNode try to use it's target_var
                        target_var = original_node.target_var
                    else:
                        # If it's a custom tag, check for the target_var in tag's config
                        target_var = tag_config.get("target_var")

                    if target_var:
                        # If a value for the target_var is supplied,
                        # write result into the variable
                        context[target_var] = result
                        return ""

                    # Render result instead of the tag, as a string.
                    # See https://github.com/torchbox/django-pattern-library/issues/166.
                    return str(result)
                elif default_html is not UNSPECIFIED:
                    # Render provided default;
                    # if no stub data supplied.
                    return default_html
                else:
                    logger.warning(
                        'No default or stub data defined for the "%s" tag in the "%s" template',
                        tag_name,
                        parser.origin.template_name,
                    )

            return original_node_render(context)