Skip to content

Commit a9ebca9

Browse files
committed
Add Jinja2 binding for django_simple_nav
1 parent 2cc78a4 commit a9ebca9

File tree

5 files changed

+48
-2
lines changed

5 files changed

+48
-2
lines changed

src/django_simple_nav/jinja2/__init__.py

Whitespace-only changes.
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
from typing import cast
2+
from jinja2 import pass_context, Template, TemplateRuntimeError
3+
from jinja2.runtime import Context
4+
from django.utils.module_loading import import_string
5+
from django_simple_nav.nav import Nav
6+
7+
8+
@pass_context
9+
def django_simple_nav(context: Context, nav: str | Nav,
10+
template_name: str | None = None) -> str:
11+
"""Jinja binding for `django_simple_nav`"""
12+
if (loader := context.environment.loader) is None:
13+
raise TemplateRuntimeError('No template loader in Jinja2 environment')
14+
15+
if type(nav) is str:
16+
try:
17+
nav = import_string(nav)()
18+
except ImportError as err:
19+
raise TemplateRuntimeError(f'Variable does not exist: {err}')
20+
21+
if template_name is None:
22+
template_name = cast(Nav, nav).template_name
23+
if template_name is None:
24+
raise TemplateRuntimeError('Navigation object has no template')
25+
26+
template: Template = loader.load(context.environment, template_name)
27+
return template.render(items=cast(Nav, nav).items)

tests/jinja2/environment.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
"""Sets up a reasonably minimal Jinja2 environment for testing"""
2+
from jinja2 import Environment, FileSystemLoader
3+
from django_simple_nav.jinja2.django_simple_nav import django_simple_nav
4+
5+
6+
environment = Environment(
7+
loader=FileSystemLoader('tests/templates/tests/jinja2/')
8+
)
9+
environment.globals.update({'django_simple_nav': django_simple_nav})

tests/templates/tests/jinja2/dummy_nav.html

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
<ul>
2-
{% for item in items %}
2+
{% for item in items recursive %}
33
<li>
44
<a href="{{ item.url }}">{{ item.title }}</a>
55
{% if item.items %}
6-
{% include "tests/dummy_nav.html" %}
6+
<ul>
7+
{{ loop(item.items) }}
8+
</ul>
79
{% endif %}
810
</li>
911
{% endfor %}

tests/test_jinja.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
from .jinja2.environment import environment
2+
3+
4+
def test_derp():
5+
"""Render the template"""
6+
template = environment.from_string('<p>{{ django_simple_nav("tests.navs.DummyNav", "dummy_nav.html") }}</p>')
7+
print(template.render(some_var=[1, 2, 3]))
8+
assert True

0 commit comments

Comments
 (0)