Skip to content

Commit b4a20da

Browse files
authored
Merge pull request #174 from classy-python/remove-db-from-nav
Remove database queries from nav template
2 parents 26312d4 + 59bd0f0 commit b4a20da

6 files changed

Lines changed: 101 additions & 43 deletions

File tree

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
{% load sansdb %}
2+
{% sansdb %}
13
<li li="version-{{ version.version_number }}" class="dropdown">
24
{% if not other_versions %}
35
<a href="#">{{ version }}</a>
@@ -8,35 +10,36 @@
810
<ul class="dropdown-menu">
911
{% for v in other_versions %}
1012
<li>
11-
<a href="{{ v.url|default:v.get_absolute_url }}">{{ v }}</a>
13+
<a href="{{ v.url }}">{{ v.name }}</a>
1214
</li>
1315
{% endfor %}
1416
</ul>
1517
{% endif %}
1618
</li>
17-
{% for module in version.module_set.all %}
19+
{% for module in modules %}
1820
{% ifchanged module.source_name %}
1921
<li class="divider-vertical"></li>
2022
<li><a href="#">{{ module.source_name }}</a></li>
2123
{% endifchanged %}
22-
{% if module.klass_set.count == 1 %}
23-
{% with klass=module.klass_set.get %}
24-
<li {% if klass == this_klass %}class=" active"{% endif %}>
25-
<a href="{{ klass.get_absolute_url }}">{{ klass }}</a>
24+
{% if module.classes|length == 1 %}
25+
{% with klass=module.classes.0 %}
26+
<li {% if klass.active %}class=" active"{% endif %}>
27+
<a href="{{ klass.url }}">{{ klass.name }}</a>
2628
</li>
2729
{% endwith %}
2830
{% else %}
29-
<li id="module-{{ module.short_name }}" class="dropdown{% if module == this_module %} active{% endif %}">
31+
<li id="module-{{ module.short_name }}" class="dropdown{% if module.active %} active{% endif %}">
3032
<a href="#module-{{ module.short_name }}" class="dropdown-toggle" data-toggle="dropdown">
3133
{{ module.short_name|title }} <b class="caret"></b>
3234
</a>
3335
<ul class="dropdown-menu">
34-
{% for klass in module.klass_set.all %}
35-
<li {% if klass == this_klass %}class=" active"{% endif %}>
36-
<a href="{{ klass.get_absolute_url }}">{{ klass }}</a>
36+
{% for klass in module.classes %}
37+
<li {% if klass.active %}class=" active"{% endif %}>
38+
<a href="{{ klass.url }}">{{ klass.name }}</a>
3739
</li>
3840
{% endfor %}
3941
</ul>
4042
</li>
4143
{% endif %}
4244
{% endfor %}
45+
{% endsansdb %}

cbv/templatetags/cbv_tags.py

Lines changed: 72 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
1+
import attrs
12
from django import template
23

3-
from cbv.models import Klass, ProjectVersion
4+
from cbv.models import Klass, Module, ProjectVersion
45

56

67
register = template.Library()
@@ -28,31 +29,80 @@ def namesake_methods(parent_klass, name):
2829
return result
2930

3031

32+
@attrs.frozen
33+
class OtherVersion:
34+
name: str
35+
url: str
36+
37+
38+
@attrs.frozen
39+
class ModuleData:
40+
@attrs.frozen
41+
class KlassData:
42+
name: str
43+
url: str
44+
active: bool
45+
46+
source_name: str
47+
short_name: str
48+
classes: list[KlassData]
49+
active: bool
50+
51+
@classmethod
52+
def from_module(
53+
cls, module: Module, active_module: Module | None, active_klass: Klass | None
54+
) -> "ModuleData":
55+
return ModuleData(
56+
source_name=module.source_name(),
57+
short_name=module.short_name(),
58+
classes=[
59+
ModuleData.KlassData(
60+
name=klass.name,
61+
url=klass.get_absolute_url(),
62+
active=klass == active_klass,
63+
)
64+
for klass in module.klass_set.all()
65+
],
66+
active=module == active_module,
67+
)
68+
69+
3170
@register.inclusion_tag("cbv/includes/nav.html")
3271
def nav(version, module=None, klass=None):
3372
other_versions = ProjectVersion.objects.filter(project=version.project).exclude(
3473
pk=version.pk
3574
)
36-
context = {
75+
if klass:
76+
other_versions_of_klass = Klass.objects.filter(
77+
name=klass.name,
78+
module__project_version__in=other_versions,
79+
)
80+
other_versions_of_klass_dict = {
81+
x.module.project_version: x for x in other_versions_of_klass
82+
}
83+
version_switcher = []
84+
for other_version in other_versions:
85+
try:
86+
other_klass = other_versions_of_klass_dict[other_version]
87+
except KeyError:
88+
url = other_version.get_absolute_url()
89+
else:
90+
url = other_klass.get_absolute_url()
91+
92+
version_switcher.append(OtherVersion(name=str(other_version), url=url))
93+
else:
94+
version_switcher = [
95+
OtherVersion(name=str(other_version), url=other_version.get_absolute_url())
96+
for other_version in other_versions
97+
]
98+
99+
modules = [
100+
ModuleData.from_module(module=m, active_module=module, active_klass=klass)
101+
for m in version.module_set.prefetch_related("klass_set")
102+
]
103+
104+
return {
37105
"version": version,
106+
"other_versions": version_switcher,
107+
"modules": modules,
38108
}
39-
if module:
40-
context["this_module"] = module
41-
if klass:
42-
context["this_klass"] = klass
43-
other_versions_of_klass = Klass.objects.filter(
44-
name=klass.name,
45-
module__project_version__in=other_versions,
46-
)
47-
other_versions_of_klass_dict = {
48-
x.module.project_version: x for x in other_versions_of_klass
49-
}
50-
for other_version in other_versions:
51-
try:
52-
other_klass = other_versions_of_klass_dict[other_version]
53-
except KeyError:
54-
pass
55-
else:
56-
other_version.url = other_klass.get_absolute_url()
57-
context["other_versions"] = other_versions
58-
return context

cbv/tests/test_page_snapshots.py

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -12,17 +12,17 @@
1212
RENDERED_VIEWS = [
1313
(
1414
"homepage.html",
15-
205,
15+
190,
1616
reverse("home"),
1717
),
1818
(
1919
"version-detail.html",
20-
204,
20+
189,
2121
reverse("version-detail", kwargs={"package": "django", "version": "4.0"}),
2222
),
2323
(
2424
"module-detail.html",
25-
27,
25+
12,
2626
reverse(
2727
"module-detail",
2828
kwargs={
@@ -34,7 +34,7 @@
3434
),
3535
(
3636
"klass-detail.html",
37-
51,
37+
36,
3838
reverse(
3939
"klass-detail",
4040
kwargs={
@@ -47,18 +47,18 @@
4747
),
4848
(
4949
"klass-detail.html",
50-
54,
50+
39,
5151
reverse("klass-detail-shortcut", kwargs={"klass": "FormView"}),
5252
),
5353
# Detail pages with wRonGLY CasEd arGuMEnTs
5454
(
5555
"fuzzy-version-detail.html",
56-
204,
56+
189,
5757
reverse("version-detail", kwargs={"package": "DJANGO", "version": "4.0"}),
5858
),
5959
(
6060
"fuzzy-module-detail.html",
61-
28,
61+
13,
6262
reverse(
6363
"module-detail",
6464
kwargs={
@@ -70,7 +70,7 @@
7070
),
7171
(
7272
"fuzzy-klass-detail.html",
73-
51,
73+
36,
7474
reverse(
7575
"klass-detail",
7676
kwargs={
@@ -83,7 +83,7 @@
8383
),
8484
(
8585
"fuzzy-klass-detail.html",
86-
54,
86+
39,
8787
reverse("klass-detail-shortcut", kwargs={"klass": "fORMvIEW"}),
8888
),
8989
]

inspector/settings.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@
1919
# Third Party Apps
2020
"django_extensions",
2121
"django_pygmy",
22+
"sans_db",
23+
# Django
2224
"django.contrib.auth",
2325
"django.contrib.contenttypes",
2426
"django.contrib.sessions",

requirements.in

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
1-
attrs
1+
attrs>=21.4.0
22
blessings
33
coverage[toml]
44
django~=3.1.14
55
dj-database-url
66
django-extensions
77
django-pygmy
8+
django-sans-db
89
factory_boy
910
gunicorn
1011
mypy

requirements.txt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
#
77
asgiref==3.4.1
88
# via django
9-
attrs==21.2.0
9+
attrs==21.4.0
1010
# via
1111
# -r requirements.in
1212
# pytest
@@ -34,6 +34,8 @@ django-extensions==3.1.3
3434
# via -r requirements.in
3535
django-pygmy==0.1.5
3636
# via -r requirements.in
37+
django-sans-db==1.1.0
38+
# via -r requirements.in
3739
docutils==0.17.1
3840
# via sphinx
3941
factory-boy==3.2.0

0 commit comments

Comments
 (0)