diff --git a/cbv/templates/cbv/includes/nav.html b/cbv/templates/cbv/includes/nav.html
index b8638039..23c66225 100644
--- a/cbv/templates/cbv/includes/nav.html
+++ b/cbv/templates/cbv/includes/nav.html
@@ -1,3 +1,5 @@
+{% load sansdb %}
+{% sansdb %}
{% if not other_versions %}
{{ version }}
@@ -8,35 +10,36 @@
{% endif %}
-{% for module in version.module_set.all %}
+{% for module in modules %}
{% ifchanged module.source_name %}
{{ module.source_name }}
{% endifchanged %}
- {% if module.klass_set.count == 1 %}
- {% with klass=module.klass_set.get %}
-
- {{ klass }}
+ {% if module.classes|length == 1 %}
+ {% with klass=module.classes.0 %}
+
+ {{ klass.name }}
{% endwith %}
{% else %}
-
+
{{ module.short_name|title }}
{% endif %}
{% endfor %}
+{% endsansdb %}
diff --git a/cbv/templatetags/cbv_tags.py b/cbv/templatetags/cbv_tags.py
index 852a7705..a5f019ed 100644
--- a/cbv/templatetags/cbv_tags.py
+++ b/cbv/templatetags/cbv_tags.py
@@ -1,6 +1,7 @@
+import attrs
from django import template
-from cbv.models import Klass, ProjectVersion
+from cbv.models import Klass, Module, ProjectVersion
register = template.Library()
@@ -28,31 +29,80 @@ def namesake_methods(parent_klass, name):
return result
+@attrs.frozen
+class OtherVersion:
+ name: str
+ url: str
+
+
+@attrs.frozen
+class ModuleData:
+ @attrs.frozen
+ class KlassData:
+ name: str
+ url: str
+ active: bool
+
+ source_name: str
+ short_name: str
+ classes: list[KlassData]
+ active: bool
+
+ @classmethod
+ def from_module(
+ cls, module: Module, active_module: Module | None, active_klass: Klass | None
+ ) -> "ModuleData":
+ return ModuleData(
+ source_name=module.source_name(),
+ short_name=module.short_name(),
+ classes=[
+ ModuleData.KlassData(
+ name=klass.name,
+ url=klass.get_absolute_url(),
+ active=klass == active_klass,
+ )
+ for klass in module.klass_set.all()
+ ],
+ active=module == active_module,
+ )
+
+
@register.inclusion_tag("cbv/includes/nav.html")
def nav(version, module=None, klass=None):
other_versions = ProjectVersion.objects.filter(project=version.project).exclude(
pk=version.pk
)
- context = {
+ if klass:
+ other_versions_of_klass = Klass.objects.filter(
+ name=klass.name,
+ module__project_version__in=other_versions,
+ )
+ other_versions_of_klass_dict = {
+ x.module.project_version: x for x in other_versions_of_klass
+ }
+ version_switcher = []
+ for other_version in other_versions:
+ try:
+ other_klass = other_versions_of_klass_dict[other_version]
+ except KeyError:
+ url = other_version.get_absolute_url()
+ else:
+ url = other_klass.get_absolute_url()
+
+ version_switcher.append(OtherVersion(name=str(other_version), url=url))
+ else:
+ version_switcher = [
+ OtherVersion(name=str(other_version), url=other_version.get_absolute_url())
+ for other_version in other_versions
+ ]
+
+ modules = [
+ ModuleData.from_module(module=m, active_module=module, active_klass=klass)
+ for m in version.module_set.prefetch_related("klass_set")
+ ]
+
+ return {
"version": version,
+ "other_versions": version_switcher,
+ "modules": modules,
}
- if module:
- context["this_module"] = module
- if klass:
- context["this_klass"] = klass
- other_versions_of_klass = Klass.objects.filter(
- name=klass.name,
- module__project_version__in=other_versions,
- )
- other_versions_of_klass_dict = {
- x.module.project_version: x for x in other_versions_of_klass
- }
- for other_version in other_versions:
- try:
- other_klass = other_versions_of_klass_dict[other_version]
- except KeyError:
- pass
- else:
- other_version.url = other_klass.get_absolute_url()
- context["other_versions"] = other_versions
- return context
diff --git a/cbv/tests/test_page_snapshots.py b/cbv/tests/test_page_snapshots.py
index dc3e30a0..175ee305 100644
--- a/cbv/tests/test_page_snapshots.py
+++ b/cbv/tests/test_page_snapshots.py
@@ -12,17 +12,17 @@
RENDERED_VIEWS = [
(
"homepage.html",
- 205,
+ 190,
reverse("home"),
),
(
"version-detail.html",
- 204,
+ 189,
reverse("version-detail", kwargs={"package": "django", "version": "4.0"}),
),
(
"module-detail.html",
- 27,
+ 12,
reverse(
"module-detail",
kwargs={
@@ -34,7 +34,7 @@
),
(
"klass-detail.html",
- 51,
+ 36,
reverse(
"klass-detail",
kwargs={
@@ -47,18 +47,18 @@
),
(
"klass-detail.html",
- 54,
+ 39,
reverse("klass-detail-shortcut", kwargs={"klass": "FormView"}),
),
# Detail pages with wRonGLY CasEd arGuMEnTs
(
"fuzzy-version-detail.html",
- 204,
+ 189,
reverse("version-detail", kwargs={"package": "DJANGO", "version": "4.0"}),
),
(
"fuzzy-module-detail.html",
- 28,
+ 13,
reverse(
"module-detail",
kwargs={
@@ -70,7 +70,7 @@
),
(
"fuzzy-klass-detail.html",
- 51,
+ 36,
reverse(
"klass-detail",
kwargs={
@@ -83,7 +83,7 @@
),
(
"fuzzy-klass-detail.html",
- 54,
+ 39,
reverse("klass-detail-shortcut", kwargs={"klass": "fORMvIEW"}),
),
]
diff --git a/inspector/settings.py b/inspector/settings.py
index f96cffcf..9f6ac874 100644
--- a/inspector/settings.py
+++ b/inspector/settings.py
@@ -19,6 +19,8 @@
# Third Party Apps
"django_extensions",
"django_pygmy",
+ "sans_db",
+ # Django
"django.contrib.auth",
"django.contrib.contenttypes",
"django.contrib.sessions",
diff --git a/requirements.in b/requirements.in
index 9ab19858..63e56b84 100644
--- a/requirements.in
+++ b/requirements.in
@@ -1,10 +1,11 @@
-attrs
+attrs>=21.4.0
blessings
coverage[toml]
django~=3.1.14
dj-database-url
django-extensions
django-pygmy
+django-sans-db
factory_boy
gunicorn
mypy
diff --git a/requirements.txt b/requirements.txt
index ccb3d916..541c57f3 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -6,7 +6,7 @@
#
asgiref==3.4.1
# via django
-attrs==21.2.0
+attrs==21.4.0
# via
# -r requirements.in
# pytest
@@ -34,6 +34,8 @@ django-extensions==3.1.3
# via -r requirements.in
django-pygmy==0.1.5
# via -r requirements.in
+django-sans-db==1.1.0
+ # via -r requirements.in
docutils==0.17.1
# via sphinx
factory-boy==3.2.0