1
+ from functools import partial
2
+
1
3
import structlog
2
4
from django .shortcuts import get_object_or_404
3
5
from django .urls import reverse
4
6
5
7
from libraries .constants import LATEST_RELEASE_URL_PATH_STR
8
+ from libraries .models import Library
6
9
from versions .models import Version
7
10
8
11
logger = structlog .get_logger ()
@@ -26,24 +29,49 @@ def get_context_data(self, **kwargs):
26
29
27
30
28
31
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 (
34
40
{
35
41
"version_str" : self .kwargs .get ("version_slug" ),
36
42
"LATEST_RELEASE_URL_PATH_STR" : LATEST_RELEASE_URL_PATH_STR ,
37
43
}
38
44
)
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" ]
47
52
)
48
53
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 )
0 commit comments