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 %} -{% 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 %} - {% 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