Skip to content

Commit a0e23e7

Browse files
committed
Add API endpoint for pattern rendering via POST
1 parent c06f211 commit a0e23e7

File tree

7 files changed

+50
-6
lines changed

7 files changed

+50
-6
lines changed

pattern_library/monkey_utils.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,15 +31,15 @@ def node_render(context):
3131

3232
# Load pattern's config
3333
current_template_name = parser.origin.template_name
34-
pattern_config = get_pattern_config(current_template_name)
34+
tag_overrides = context.get('__pattern_library_tag_overrides', {})
3535

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

4141
# Get config for a specific tag
42-
tag_config = pattern_config.get('tags', {}).get(tag_name, {})
42+
tag_config = tag_overrides.get(tag_name, {})
4343
if tag_config:
4444
# Get config for specific arguments
4545
tag_config = tag_config.get(arguments, {})

pattern_library/urls.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from django.urls import re_path
1+
from django.urls import re_path, path
22

33
from pattern_library import get_pattern_template_suffix, views
44

@@ -22,4 +22,7 @@
2222
views.RenderPatternView.as_view(),
2323
name='render_pattern'
2424
),
25+
26+
# API rendering
27+
path('api/v1/render-pattern', views.render_pattern_api, name='render_pattern_api'),
2528
]

pattern_library/utils.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -197,12 +197,18 @@ def get_pattern_markdown(template_name):
197197
return markdown.markdown(f.read())
198198

199199

200-
def render_pattern(request, template_name, allow_non_patterns=False):
200+
def render_pattern(request, template_name, allow_non_patterns=False, config=None):
201201
if not allow_non_patterns and not is_pattern(template_name):
202202
raise TemplateIsNotPattern
203203

204-
context = get_pattern_context(template_name)
204+
if not config:
205+
config = get_pattern_config(template_name)
206+
207+
context = config.get('context', {})
208+
tags = config.get('tags', {})
209+
mark_context_strings_safe(context)
205210
context[get_pattern_context_var_name()] = True
211+
context['__pattern_library_tag_overrides'] = tags
206212
for modifier in registry.get_for_template(template_name):
207213
modifier(context=context, request=request)
208214
return render_to_string(template_name, request=request, context=context)

pattern_library/views.py

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
1+
import json
2+
13
from django.http import Http404, HttpResponse
24
from django.template.loader import get_template
35
from django.utils.decorators import method_decorator
46
from django.utils.html import escape
57
from django.views.decorators.clickjacking import xframe_options_sameorigin
6-
from django.views.generic.base import TemplateView
8+
from django.views.decorators.csrf import csrf_exempt
9+
from django.views.generic.base import TemplateView, View
710

811
from pattern_library import (
912
get_base_template_names, get_pattern_base_template_name
@@ -94,3 +97,17 @@ def get(self, request, pattern_template_name=None):
9497
return self.render_to_response(context)
9598

9699
return HttpResponse(rendered_pattern)
100+
101+
102+
@csrf_exempt
103+
def render_pattern_api(request):
104+
data = json.loads(request.body.decode("utf-8"))
105+
template_name = data["template_name"]
106+
config = data["config"]
107+
108+
try:
109+
rendered_pattern = render_pattern(request, template_name, allow_non_patterns=False, config=config)
110+
except TemplateIsNotPattern:
111+
raise Http404
112+
113+
return HttpResponse(rendered_pattern)
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{% load test_tags %}
2+
<a href="{% if target_url %}{{ target_url }}{% else %}{% pageurl target_page %}{% endif %}" class="button">
3+
{% if label %}{{ label }}{% else %}{{ target_page.title }}{% endif %}
4+
</a>
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
context:
2+
target_page:
3+
title: Get started
4+
tags:
5+
pageurl:
6+
target_page:
7+
raw: /get-started

tests/templatetags/test_tags.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,12 @@ def default_html_tag_falsey(arg=None):
2727
raise Exception("default_tag raised an exception")
2828

2929

30+
@register.simple_tag()
31+
def pageurl(page):
32+
"""Approximation of wagtail built-in tag for realistic example."""
33+
return "/page/url"
34+
35+
3036
# Get widget type of a field
3137
@register.filter(name="widget_type")
3238
def widget_type(bound_field):
@@ -36,3 +42,4 @@ def widget_type(bound_field):
3642
override_tag(register, 'error_tag')
3743
override_tag(register, 'default_html_tag', default_html="https://potato.com")
3844
override_tag(register, 'default_html_tag_falsey', default_html=None)
45+
override_tag(register, 'pageurl')

0 commit comments

Comments
 (0)