Skip to content

Commit 288448d

Browse files
committed
Keep request context in unicorn component templates.
1 parent 3047ae1 commit 288448d

File tree

8 files changed

+59
-20
lines changed

8 files changed

+59
-20
lines changed

conftest.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,22 @@ def pytest_configure():
88
{
99
"BACKEND": "django.template.backends.django.DjangoTemplates",
1010
"DIRS": ["tests"],
11+
"OPTIONS": {
12+
"context_processors": [
13+
"django.template.context_processors.request",
14+
],
15+
},
1116
}
1217
]
18+
1319
databases = {
1420
"default": {
1521
"ENGINE": "django.db.backends.sqlite3",
1622
}
1723
}
1824

1925
installed_apps = [
26+
"django_unicorn",
2027
"example.coffee.apps.Config",
2128
"example.books.apps.Config",
2229
]
@@ -37,7 +44,7 @@ def pytest_configure():
3744
settings.configure(
3845
SECRET_KEY="this-is-a-secret",
3946
TEMPLATES=templates,
40-
ROOT_URLCONF="django_unicorn.urls",
47+
ROOT_URLCONF="tests.urls",
4148
DATABASES=databases,
4249
INSTALLED_APPS=installed_apps,
4350
UNIT_TEST=True,

django_unicorn/components/unicorn_view.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -291,7 +291,7 @@ def called(self, name, args):
291291
pass
292292

293293
@timed
294-
def render(self, init_js=False) -> str:
294+
def render(self, init_js=False, extra_context=None) -> str:
295295
"""
296296
Renders a UnicornView component with the public properties available. Delegates to a
297297
UnicornTemplateResponse to actually render a response.
@@ -300,6 +300,9 @@ def render(self, init_js=False) -> str:
300300
param init_js: Whether or not to include the Javascript required to initialize the component.
301301
"""
302302

303+
if extra_context is not None:
304+
self.extra_context = extra_context
305+
303306
response = self.render_to_response(
304307
context=self.get_context_data(),
305308
component=self,

django_unicorn/templatetags/unicorn.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,12 @@ def render(self, context):
146146
kwargs=resolved_kwargs,
147147
request=request,
148148
)
149-
rendered_component = view.render(init_js=True)
149+
150+
extra_context = {}
151+
for c in context:
152+
extra_context.update(c)
153+
154+
rendered_component = view.render(init_js=True, extra_context=extra_context)
150155

151156
return rendered_component
152157

example/unicorn/templates/unicorn/hello-world-test.html

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,10 @@
99
<input unicorn:model="name" type="text" id="name" unicorn:key="key1">
1010

1111
Hello, {{ name|default:'World' }}!
12+
13+
<div>
14+
Request path context variable: '{{ request.path }}'
15+
</div>
1216
</div>
1317

1418
<script type="application/javascript">
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
<div>
22
<b>{{ hello }}</b>
3+
{{ request }}
34
</div>

tests/templates/test_template.html

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{% load unicorn %}
2+
3+
{% unicorn 'tests.templatetags.test_unicorn_render.FakeComponentKwargs' %}

tests/templatetags/test_unicorn_render.py

Lines changed: 25 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
import re
22

3+
from django.http.request import HttpRequest
4+
from django.template import Context, RequestContext
35
from django.template.base import Token, TokenType
46

57
import pytest
@@ -55,14 +57,19 @@ def mount(self):
5557
self.call("testCall2", "hello")
5658

5759

60+
def test_unicorn_has_context_processors_in_context(client):
61+
response = client.get("/test")
62+
assert "WSGIRequest" in response.content.decode()
63+
64+
5865
def test_unicorn_render_kwarg():
5966
token = Token(
6067
TokenType.TEXT,
6168
"unicorn 'tests.templatetags.test_unicorn_render.FakeComponentKwargs' test_kwarg='tested!'",
6269
)
6370
unicorn_node = unicorn(None, token)
6471
context = {}
65-
actual = unicorn_node.render(context)
72+
actual = unicorn_node.render(Context(context))
6673

6774
assert "<b>tested!</b>" in actual
6875

@@ -74,7 +81,7 @@ def test_unicorn_render_context_variable():
7481
)
7582
unicorn_node = unicorn(None, token)
7683
context = {"test_var": {"nested": "variable!"}}
77-
actual = unicorn_node.render(context)
84+
actual = unicorn_node.render(Context(context))
7885

7986
assert "<b>variable!</b>" in actual
8087

@@ -86,7 +93,7 @@ def test_unicorn_render_with_invalid_html():
8693
)
8794
unicorn_node = unicorn(None, token)
8895
context = {"test_var": {"nested": "variable!"}}
89-
actual = unicorn_node.render(context)
96+
actual = unicorn_node.render(Context(context))
9097

9198
assert "-&gt;variable!&lt;-" in actual
9299

@@ -100,7 +107,7 @@ def test_unicorn_render_parent(settings):
100107
unicorn_node = unicorn(None, token)
101108
view = FakeComponentParent(component_name="test", component_id="asdf")
102109
context = {"view": view}
103-
unicorn_node.render(context)
110+
unicorn_node.render(Context(context))
104111

105112
assert unicorn_node.parent
106113
assert (
@@ -118,7 +125,7 @@ def test_unicorn_render_parent_with_key(settings):
118125
unicorn_node = unicorn(None, token)
119126
view = FakeComponentParent(component_name="test", component_id="asdf")
120127
context = {"view": view}
121-
unicorn_node.render(context)
128+
unicorn_node.render(Context(context))
122129

123130
assert (
124131
unicorn_node.component_id
@@ -135,7 +142,7 @@ def test_unicorn_render_parent_with_id(settings):
135142
unicorn_node = unicorn(None, token)
136143
view = FakeComponentParent(component_name="test", component_id="asdf")
137144
context = {"view": view}
138-
unicorn_node.render(context)
145+
unicorn_node.render(Context(context))
139146

140147
assert (
141148
unicorn_node.component_id
@@ -152,7 +159,7 @@ def test_unicorn_render_parent_with_pk(settings):
152159
unicorn_node = unicorn(None, token)
153160
view = FakeComponentParent(component_name="test", component_id="asdf")
154161
context = {"view": view}
155-
unicorn_node.render(context)
162+
unicorn_node.render(Context(context))
156163

157164
assert (
158165
unicorn_node.component_id
@@ -178,7 +185,7 @@ def to_json(self):
178185
return {"id": self.id}
179186

180187
context = {"view": view, "model": Model()}
181-
unicorn_node.render(context)
188+
unicorn_node.render(Context(context))
182189

183190
assert (
184191
unicorn_node.component_id
@@ -197,8 +204,9 @@ def test_unicorn_render_parent_with_model_pk(settings):
197204
view = FakeComponentParent(component_name="test", component_id="asdf")
198205

199206
flavor = Flavor(pk=187)
207+
200208
context = {"view": view, "model": flavor}
201-
unicorn_node.render(context)
209+
unicorn_node.render(Context(context))
202210

203211
assert (
204212
unicorn_node.component_id
@@ -213,7 +221,7 @@ def test_unicorn_render_id_use_pk():
213221
)
214222
unicorn_node = unicorn(None, token)
215223
context = {"model": {"pk": 123}}
216-
actual = unicorn_node.render(context)
224+
actual = unicorn_node.render(Context(context))
217225

218226
assert "==123==" in actual
219227

@@ -226,7 +234,7 @@ def test_unicorn_render_component_one_script_tag(settings):
226234
)
227235
unicorn_node = unicorn(None, token)
228236
context = {}
229-
html = unicorn_node.render(context)
237+
html = unicorn_node.render(Context(context))
230238

231239
assert '<script type="module"' in html
232240
assert len(re.findall('<script type="module"', html)) == 1
@@ -241,7 +249,7 @@ def test_unicorn_render_child_component_no_script_tag(settings):
241249
unicorn_node = unicorn(None, token)
242250
view = FakeComponentParent(component_name="test", component_id="asdf")
243251
context = {"view": view}
244-
html = unicorn_node.render(context)
252+
html = unicorn_node.render(Context(context))
245253

246254
assert "<script" not in html
247255

@@ -254,7 +262,7 @@ def test_unicorn_render_parent_component_one_script_tag(settings):
254262
)
255263
unicorn_node = unicorn(None, token)
256264
context = {}
257-
html = unicorn_node.render(context)
265+
html = unicorn_node.render(Context(context))
258266

259267
assert '<script type="module"' in html
260268
assert len(re.findall('<script type="module"', html)) == 1
@@ -268,7 +276,7 @@ def test_unicorn_render_calls(settings):
268276
)
269277
unicorn_node = unicorn(None, token)
270278
context = {}
271-
html = unicorn_node.render(context)
279+
html = unicorn_node.render(Context(context))
272280

273281
assert '<script type="module"' in html
274282
assert len(re.findall('<script type="module"', html)) == 1
@@ -283,7 +291,7 @@ def test_unicorn_render_calls_with_arg(settings):
283291
)
284292
unicorn_node = unicorn(None, token)
285293
context = {}
286-
html = unicorn_node.render(context)
294+
html = unicorn_node.render(Context(context))
287295

288296
assert '<script type="module"' in html
289297
assert len(re.findall('<script type="module"', html)) == 1
@@ -298,7 +306,7 @@ def test_unicorn_render_calls_no_mount_call(settings):
298306
)
299307
unicorn_node = unicorn(None, token)
300308
context = {}
301-
html = unicorn_node.render(context)
309+
html = unicorn_node.render(Context(context))
302310

303311
assert '<script type="module"' in html
304312
assert len(re.findall('<script type="module"', html)) == 1
@@ -313,7 +321,7 @@ def test_unicorn_render_hash(settings):
313321
)
314322
unicorn_node = unicorn(None, token)
315323
context = {}
316-
html = unicorn_node.render(context)
324+
html = unicorn_node.render(Context(context))
317325

318326
assert '<script type="module"' in html
319327
assert len(re.findall('<script type="module"', html)) == 1

tests/urls.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
from django.urls import include, path
2+
from django.views.generic import TemplateView
3+
4+
5+
urlpatterns = (
6+
path("test", TemplateView.as_view(template_name="templates/test_template.html")),
7+
path("", include("django_unicorn.urls")),
8+
)

0 commit comments

Comments
 (0)