Skip to content

Commit 933e092

Browse files
committed
Add API endpoint for pattern rendering via POST
1 parent ef93568 commit 933e092

File tree

7 files changed

+50
-7
lines changed

7 files changed

+50
-7
lines changed

pattern_library/monkey_utils.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
from django.template.library import SimpleNode
44

55
from pattern_library.utils import (
6-
get_pattern_config,
76
is_pattern_library_context,
87
render_pattern,
98
)
@@ -33,15 +32,15 @@ def node_render(context):
3332

3433
# Load pattern's config
3534
current_template_name = parser.origin.template_name
36-
pattern_config = get_pattern_config(current_template_name)
35+
tag_overrides = context.get("__pattern_library_tag_overrides", {})
3736

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

4342
# Get config for a specific tag
44-
tag_config = pattern_config.get("tags", {}).get(tag_name, {})
43+
tag_config = tag_overrides.get(tag_name, {})
4544
if tag_config:
4645
# Get config for specific arguments
4746
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

@@ -19,4 +19,7 @@
1919
views.RenderPatternView.as_view(),
2020
name="render_pattern",
2121
),
22+
23+
# API rendering
24+
path('api/v1/render-pattern', views.render_pattern_api, name='render_pattern_api'),
2225
]

pattern_library/utils.py

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

212212

213-
def render_pattern(request, template_name, allow_non_patterns=False):
213+
def render_pattern(request, template_name, allow_non_patterns=False, config=None):
214214
if not allow_non_patterns and not is_pattern(template_name):
215215
raise TemplateIsNotPattern
216216

217-
context = get_pattern_context(template_name)
217+
if not config:
218+
config = get_pattern_config(template_name)
219+
220+
context = config.get('context', {})
221+
tags = config.get('tags', {})
222+
mark_context_strings_safe(context)
218223
context[get_pattern_context_var_name()] = True
224+
context['__pattern_library_tag_overrides'] = tags
219225
for modifier in registry.get_for_template(template_name):
220226
modifier(context=context, request=request)
221227
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 get_base_template_names, get_pattern_base_template_name
912
from pattern_library.exceptions import PatternLibraryEmpty, TemplateIsNotPattern
@@ -99,3 +102,17 @@ def get(self, request, pattern_template_name=None):
99102
return self.render_to_response(context)
100103

101104
return HttpResponse(rendered_pattern)
105+
106+
107+
@csrf_exempt
108+
def render_pattern_api(request):
109+
data = json.loads(request.body.decode("utf-8"))
110+
template_name = data["template_name"]
111+
config = data["config"]
112+
113+
try:
114+
rendered_pattern = render_pattern(request, template_name, allow_non_patterns=False, config=config)
115+
except TemplateIsNotPattern:
116+
raise Http404
117+
118+
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)