Skip to content

Commit

Permalink
Add API endpoint for pattern rendering via POST
Browse files Browse the repository at this point in the history
  • Loading branch information
thibaudcolas committed Dec 22, 2021
1 parent c06f211 commit a0e23e7
Show file tree
Hide file tree
Showing 7 changed files with 50 additions and 6 deletions.
4 changes: 2 additions & 2 deletions pattern_library/monkey_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,15 +31,15 @@ def node_render(context):

# Load pattern's config
current_template_name = parser.origin.template_name
pattern_config = get_pattern_config(current_template_name)
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 = pattern_config.get('tags', {}).get(tag_name, {})
tag_config = tag_overrides.get(tag_name, {})
if tag_config:
# Get config for specific arguments
tag_config = tag_config.get(arguments, {})
Expand Down
5 changes: 4 additions & 1 deletion pattern_library/urls.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
from django.urls import re_path
from django.urls import re_path, path

from pattern_library import get_pattern_template_suffix, views

Expand All @@ -22,4 +22,7 @@
views.RenderPatternView.as_view(),
name='render_pattern'
),

# API rendering
path('api/v1/render-pattern', views.render_pattern_api, name='render_pattern_api'),
]
10 changes: 8 additions & 2 deletions pattern_library/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -197,12 +197,18 @@ def get_pattern_markdown(template_name):
return markdown.markdown(f.read())


def render_pattern(request, template_name, allow_non_patterns=False):
def render_pattern(request, template_name, allow_non_patterns=False, config=None):
if not allow_non_patterns and not is_pattern(template_name):
raise TemplateIsNotPattern

context = get_pattern_context(template_name)
if not config:
config = get_pattern_config(template_name)

context = config.get('context', {})
tags = config.get('tags', {})
mark_context_strings_safe(context)
context[get_pattern_context_var_name()] = True
context['__pattern_library_tag_overrides'] = tags
for modifier in registry.get_for_template(template_name):
modifier(context=context, request=request)
return render_to_string(template_name, request=request, context=context)
Expand Down
19 changes: 18 additions & 1 deletion pattern_library/views.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,12 @@
import json

from django.http import Http404, HttpResponse
from django.template.loader import get_template
from django.utils.decorators import method_decorator
from django.utils.html import escape
from django.views.decorators.clickjacking import xframe_options_sameorigin
from django.views.generic.base import TemplateView
from django.views.decorators.csrf import csrf_exempt
from django.views.generic.base import TemplateView, View

from pattern_library import (
get_base_template_names, get_pattern_base_template_name
Expand Down Expand Up @@ -94,3 +97,17 @@ def get(self, request, pattern_template_name=None):
return self.render_to_response(context)

return HttpResponse(rendered_pattern)


@csrf_exempt
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)
4 changes: 4 additions & 0 deletions tests/templates/patterns/molecules/button/button.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
{% load test_tags %}
<a href="{% if target_url %}{{ target_url }}{% else %}{% pageurl target_page %}{% endif %}" class="button">
{% if label %}{{ label }}{% else %}{{ target_page.title }}{% endif %}
</a>
7 changes: 7 additions & 0 deletions tests/templates/patterns/molecules/button/button.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
context:
target_page:
title: Get started
tags:
pageurl:
target_page:
raw: /get-started
7 changes: 7 additions & 0 deletions tests/templatetags/test_tags.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,12 @@ def default_html_tag_falsey(arg=None):
raise Exception("default_tag raised an exception")


@register.simple_tag()
def pageurl(page):
"""Approximation of wagtail built-in tag for realistic example."""
return "/page/url"


# Get widget type of a field
@register.filter(name="widget_type")
def widget_type(bound_field):
Expand All @@ -36,3 +42,4 @@ def widget_type(bound_field):
override_tag(register, 'error_tag')
override_tag(register, 'default_html_tag', default_html="https://potato.com")
override_tag(register, 'default_html_tag_falsey', default_html=None)
override_tag(register, 'pageurl')

0 comments on commit a0e23e7

Please sign in to comment.