Skip to content

Commit 98313d6

Browse files
committed
Move versions context population to BoostVersionMixin (#1500)
1 parent fb62564 commit 98313d6

File tree

4 files changed

+46
-23
lines changed

4 files changed

+46
-23
lines changed

libraries/mixins.py

+42-14
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
1+
from functools import partial
2+
13
import structlog
24
from django.shortcuts import get_object_or_404
35
from django.urls import reverse
46

57
from libraries.constants import LATEST_RELEASE_URL_PATH_STR
8+
from libraries.models import Library
69
from versions.models import Version
710

811
logger = structlog.get_logger()
@@ -26,24 +29,49 @@ def get_context_data(self, **kwargs):
2629

2730

2831
class BoostVersionMixin:
29-
def get_context_data(self, **kwargs):
30-
context = super().get_context_data(**kwargs)
31-
# todo: replace get_current_library_version on LibraryDetail with this +
32-
# prefetch_related
33-
context.update(
32+
def dispatch(self, request, *args, **kwargs):
33+
if not self.extra_context:
34+
self.extra_context = {}
35+
36+
if not self.extra_context.get("current_version"):
37+
self.extra_context["current_version"] = Version.objects.most_recent()
38+
39+
self.extra_context.update(
3440
{
3541
"version_str": self.kwargs.get("version_slug"),
3642
"LATEST_RELEASE_URL_PATH_STR": LATEST_RELEASE_URL_PATH_STR,
3743
}
3844
)
39-
if not context.get("current_version"):
40-
context["current_version"] = Version.objects.most_recent()
41-
42-
if context["version_str"] == LATEST_RELEASE_URL_PATH_STR:
43-
context["selected_version"] = context["current_version"]
44-
elif context["version_str"]:
45-
context["selected_version"] = get_object_or_404(
46-
Version, slug=context["version_str"]
45+
if self.extra_context["version_str"] == LATEST_RELEASE_URL_PATH_STR:
46+
self.extra_context["selected_version"] = self.extra_context[
47+
"current_version"
48+
]
49+
elif self.extra_context["version_str"]:
50+
self.extra_context["selected_version"] = get_object_or_404(
51+
Version, slug=self.extra_context["version_str"]
4752
)
4853

49-
return context
54+
version_path_kwargs = {
55+
"release-detail": {},
56+
"libraries-list": {
57+
"filter_out_has_no_libraries": True,
58+
"force_version_inclusion": self.extra_context["current_version"],
59+
},
60+
"library-detail": {
61+
"flag_versions_without_library": partial(
62+
get_object_or_404, Library, slug=self.kwargs.get("library_slug")
63+
)
64+
},
65+
}.get(self.request.resolver_match.view_name, {})
66+
# we need this step to process any partials
67+
processed_version_path_kwargs = {
68+
key: (value() if callable(value) else value)
69+
for key, value in version_path_kwargs.items()
70+
}
71+
72+
self.extra_context["versions"] = Version.objects.get_dropdown_versions(
73+
**processed_version_path_kwargs
74+
)
75+
# here we hack extra_context into the request so we can access for cookie checks
76+
request.extra_context = self.extra_context
77+
return super().dispatch(request, *args, **kwargs)

libraries/utils.py

+4-1
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,10 @@ def get_category(request):
142142

143143

144144
def determine_selected_boost_version(request_value, request):
145-
valid_versions = Version.objects.get_dropdown_versions()
145+
# use the versions in the request if they are available otherwise fall back to DB
146+
valid_versions = getattr(request, "extra_context", {}).get(
147+
"versions", Version.objects.get_dropdown_versions()
148+
)
146149
version_slug = request_value or get_version_from_cookie(request)
147150
if version_slug in [v.slug for v in valid_versions] + [LATEST_RELEASE_URL_PATH_STR]:
148151
return version_slug

libraries/views.py

-7
Original file line numberDiff line numberDiff line change
@@ -98,10 +98,6 @@ def get_queryset(self):
9898
def get_context_data(self, **kwargs):
9999
context = super().get_context_data(**self.kwargs)
100100
context["categories"] = self.get_categories(context["selected_version"])
101-
context["versions"] = Version.objects.get_dropdown_versions(
102-
filter_out_has_no_libraries=True,
103-
force_version_inclusion=context["current_version"],
104-
)
105101
# todo: add tests for sort order
106102
if self.kwargs.get("category_slug"):
107103
context["category"] = Category.objects.get(
@@ -225,9 +221,6 @@ def get_context_data(self, **kwargs):
225221
context = super().get_context_data(**kwargs)
226222
context["library_view_str"] = get_prioritized_library_view(self.request)
227223
# Get versions, flag when the current library isn't in each version
228-
context["versions"] = Version.objects.get_dropdown_versions(
229-
flag_versions_without_library=self.object
230-
)
231224
context["LATEST_RELEASE_URL_PATH_NAME"] = LATEST_RELEASE_URL_PATH_STR
232225
if not self.object:
233226
raise Http404("No library found matching the query")

versions/views.py

-1
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,6 @@ def get_context_data(self, **kwargs):
4747
context["is_current_release"] = False
4848
return context
4949

50-
context["versions"] = Version.objects.get_dropdown_versions()
5150
downloads = obj.downloads.all().order_by("operating_system")
5251
context["downloads"] = {
5352
k: list(v)

0 commit comments

Comments
 (0)