Skip to content

Commit 117d415

Browse files
add get_template_name and get_items methods to Nav (#69)
1 parent fd880d9 commit 117d415

File tree

2 files changed

+30
-10
lines changed

2 files changed

+30
-10
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,10 @@ and this project attempts to adhere to [Semantic Versioning](https://semver.org/
1818

1919
## [Unreleased]
2020

21+
### Added
22+
23+
- Added two new methods to `Nav`: `get_items` and `get_template_name`. These should allow for further flexibility and customization of rendering the `Nav`.
24+
2125
### Changed
2226

2327
- Now using v2024.16 of `django-twc-package`.

src/django_simple_nav/nav.py

Lines changed: 26 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
from dataclasses import field
55
from typing import Any
66

7+
from django.core.exceptions import ImproperlyConfigured
78
from django.http import HttpRequest
89
from django.template.loader import render_to_string
910
from django.urls import reverse
@@ -15,22 +16,37 @@
1516

1617
@dataclass(frozen=True)
1718
class Nav:
18-
template_name: str = field(init=False)
19-
items: list[NavGroup | NavItem] = field(init=False)
19+
template_name: str | None = field(init=False, default=None)
20+
items: list[NavGroup | NavItem] | None = field(init=False, default=None)
21+
22+
def get_template_name(self) -> str:
23+
if self.template_name is not None:
24+
return self.template_name
25+
26+
msg = f"{self.__class__!r} must define 'template_name' or override 'get_template_name()'"
27+
raise ImproperlyConfigured(msg % self.__class__.__name__)
28+
29+
def get_items(self, request: HttpRequest) -> list[RenderedNavItem]:
30+
if self.items is not None:
31+
return [
32+
RenderedNavItem(item, request)
33+
for item in self.items
34+
if check_item_permissions(item, request)
35+
]
36+
37+
msg = f"{self.__class__!r} must define 'items' or override 'get_items()'"
38+
raise ImproperlyConfigured(msg)
2039

2140
def get_context_data(self, request: HttpRequest) -> dict[str, Any]:
22-
items = [
23-
RenderedNavItem(item, request)
24-
for item in self.items
25-
if check_item_permissions(item, request)
26-
]
27-
return {"items": items}
41+
return {
42+
"items": self.get_items(request),
43+
"request": request,
44+
}
2845

2946
def render(self, request: HttpRequest, template_name: str | None = None) -> str:
3047
context = self.get_context_data(request)
31-
context["request"] = request
3248
return render_to_string(
33-
template_name=template_name or self.template_name,
49+
template_name=template_name or self.get_template_name(),
3450
context=context,
3551
request=request,
3652
)

0 commit comments

Comments
 (0)