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", }, )
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)
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)
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)
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
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)