21
21
22
22
23
23
# Structure used for storing cached data of a version mostly.
24
+ ProjectData = namedtuple ('ProjectData' , ['version' , 'alias' ])
24
25
VersionData = namedtuple ('VersionData' , ['slug' , 'docs_url' , 'doctype' ])
25
26
26
27
@@ -58,13 +59,51 @@ class PageSearchSerializer(serializers.Serializer):
58
59
59
60
type = serializers .CharField (default = 'page' , source = None , read_only = True )
60
61
project = serializers .CharField ()
62
+ project_alias = serializers .SerializerMethodField ()
61
63
version = serializers .CharField ()
62
64
title = serializers .CharField ()
63
65
path = serializers .SerializerMethodField ()
64
66
domain = serializers .SerializerMethodField ()
65
67
highlights = PageHighlightSerializer (source = 'meta.highlight' , default = dict )
66
68
blocks = serializers .SerializerMethodField ()
67
69
70
+ def _get_project_data (self , obj ):
71
+ """
72
+ Get and cache the project data.
73
+
74
+ Try to get the data from the ``projects_data`` context,
75
+ and fallback to get it from the database.
76
+ If the result is fetched from the database,
77
+ it's cached into ``projects_data``.
78
+ """
79
+ project_data = self .context .get ('projects_data' , {}).get (obj .project )
80
+ if project_data :
81
+ return project_data
82
+
83
+ project = Project .objects .filter (slug = obj .project ).first ()
84
+ if project :
85
+ docs_url = project .get_docs_url (version_slug = obj .version )
86
+ project_alias = project .superprojects .values_list ('alias' , flat = True ).first ()
87
+
88
+ projects_data = self .context .setdefault ('projects_data' , {})
89
+ version_data = VersionData (
90
+ slug = obj .version ,
91
+ docs_url = docs_url ,
92
+ doctype = None ,
93
+ )
94
+ projects_data [obj .project ] = ProjectData (
95
+ alias = project_alias ,
96
+ version = version_data ,
97
+ )
98
+ return projects_data [obj .project ]
99
+ return None
100
+
101
+ def get_project_alias (self , obj ):
102
+ project_data = self ._get_project_data (obj )
103
+ if project_data :
104
+ return project_data .alias
105
+ return None
106
+
68
107
def get_domain (self , obj ):
69
108
full_path = self ._get_full_path (obj )
70
109
if full_path :
@@ -80,40 +119,17 @@ def get_path(self, obj):
80
119
return None
81
120
82
121
def _get_full_path (self , obj ):
83
- """
84
- Get the page link.
85
-
86
- Try to get the link from the ``project_data`` context,
87
- and fallback to get it from the database.
88
- If the result is fetched from the database,
89
- it's cached into ``project_data``.
90
- """
91
- # First try to build the URL from the context.
92
- version_data = self .context .get ('projects_data' , {}).get (obj .project )
93
- if version_data :
94
- docs_url = version_data .docs_url
122
+ project_data = self ._get_project_data (obj )
123
+ if project_data :
124
+ docs_url = project_data .version .docs_url
95
125
path = obj .full_path
96
126
97
127
# Generate an appropriate link for the doctypes that use htmldir,
98
128
# and always end it with / so it goes directly to proxito.
99
- if version_data .doctype in {SPHINX_HTMLDIR , MKDOCS }:
129
+ if project_data . version .doctype in {SPHINX_HTMLDIR , MKDOCS }:
100
130
path = re .sub ('(^|/)index.html$' , '/' , path )
101
131
102
132
return docs_url .rstrip ('/' ) + '/' + path .lstrip ('/' )
103
-
104
- # Fallback to build the URL querying the db.
105
- project = Project .objects .filter (slug = obj .project ).first ()
106
- if project :
107
- docs_url = project .get_docs_url (version_slug = obj .version )
108
- # cache the project URL
109
- projects_data = self .context .setdefault ('projects_data' , {})
110
- projects_data [obj .project ] = VersionData (
111
- slug = obj .version ,
112
- docs_url = docs_url ,
113
- doctype = None ,
114
- )
115
- return docs_url + obj .full_path
116
-
117
133
return None
118
134
119
135
def get_blocks (self , obj ):
0 commit comments