Skip to content

Commit b28c822

Browse files
committed
Add "links" field for Project, Version and Build
1 parent 59f7b6f commit b28c822

File tree

1 file changed

+113
-10
lines changed

1 file changed

+113
-10
lines changed

readthedocs/v3/serializers.py

+113-10
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,28 @@ class Meta:
3131
]
3232

3333

34+
class BaseLinksSerializer(serializers.Serializer):
35+
36+
def _absolute_url(self, path):
37+
scheme = 'http' if settings.DEBUG else 'https'
38+
domain = settings.PRODUCTION_DOMAIN
39+
return urllib.parse.urlunparse((scheme, domain, path, '', '', ''))
40+
41+
42+
class BuildLinksSerializer(BaseLinksSerializer):
43+
_self = serializers.SerializerMethodField()
44+
45+
def get__self(self, obj):
46+
path = reverse(
47+
'projects-builds-detail',
48+
kwargs={
49+
'parent_lookup_project__slug': obj.project.slug,
50+
'build_pk': obj.pk,
51+
},
52+
)
53+
return self._absolute_url(path)
54+
55+
3456
class BuildConfigSerializer(FlexFieldsSerializerMixin, serializers.Serializer):
3557

3658
def to_representation(self, obj):
@@ -46,6 +68,7 @@ class BuildSerializer(FlexFieldsModelSerializer):
4668
created = serializers.DateTimeField(source='date')
4769
finished = serializers.SerializerMethodField()
4870
duration = serializers.IntegerField(source='length')
71+
links = BuildLinksSerializer(source='*')
4972

5073
expandable_fields = dict(
5174
config=(
@@ -70,7 +93,7 @@ class Meta:
7093
'commit',
7194
'builder',
7295
'cold_storage',
73-
# 'links',
96+
'links',
7497
]
7598

7699
def get_finished(self, obj):
@@ -86,6 +109,41 @@ def get_name(self, obj):
86109
return obj.privacy_level.title()
87110

88111

112+
class VersionLinksSerializer(BaseLinksSerializer):
113+
_self = serializers.SerializerMethodField()
114+
builds = serializers.SerializerMethodField()
115+
project = serializers.SerializerMethodField()
116+
117+
def get__self(self, obj):
118+
path = reverse(
119+
'projects-versions-detail',
120+
kwargs={
121+
'parent_lookup_project__slug': obj.project.slug,
122+
'version_slug': obj.slug,
123+
},
124+
)
125+
return self._absolute_url(path)
126+
127+
def get_builds(self, obj):
128+
path = reverse(
129+
'projects-versions-builds-list',
130+
kwargs={
131+
'parent_lookup_project__slug': obj.project.slug,
132+
'parent_lookup_version__slug': obj.slug,
133+
},
134+
)
135+
return self._absolute_url(path)
136+
137+
def get_project(self, obj):
138+
path = reverse(
139+
'projects-detail',
140+
kwargs={
141+
'project_slug': obj.project.slug,
142+
},
143+
)
144+
return self._absolute_url(path)
145+
146+
89147
class VersionURLsSerializer(serializers.Serializer):
90148
documentation = serializers.SerializerMethodField()
91149
vcs = serializers.URLField(source='vcs_url')
@@ -102,6 +160,7 @@ class VersionSerializer(FlexFieldsModelSerializer):
102160
ref = serializers.CharField()
103161
downloads = serializers.SerializerMethodField()
104162
urls = VersionURLsSerializer(source='*')
163+
links = VersionLinksSerializer(source='*')
105164

106165
expandable_fields = dict(
107166
last_build=(
@@ -126,7 +185,7 @@ class Meta:
126185
'type',
127186
'downloads',
128187
'urls',
129-
# 'links',
188+
'links',
130189
]
131190

132191
def get_downloads(self, obj):
@@ -195,22 +254,66 @@ class RepositorySerializer(serializers.Serializer):
195254
type = serializers.CharField(source='repo_type')
196255

197256

198-
class ProjectLinksSerializer(serializers.Serializer):
257+
class ProjectLinksSerializer(BaseLinksSerializer):
199258

200259
_self = serializers.SerializerMethodField()
201260

202261
# TODO: add these once the endpoints get implemented
203262
# users = serializers.SerializerMethodField()
204-
# versions = serializers.SerializerMethodField()
205-
# builds = serializers.SerializerMethodField()
206-
# subprojects = serializers.SerializerMethodField()
207-
# translations = serializers.SerializerMethodField()
263+
versions = serializers.SerializerMethodField()
264+
builds = serializers.SerializerMethodField()
265+
subprojects = serializers.SerializerMethodField()
266+
superprojects = serializers.SerializerMethodField()
267+
translations = serializers.SerializerMethodField()
208268

209269
def get__self(self, obj):
210-
scheme = 'http' if settings.DEBUG else 'https'
211-
domain = settings.PRODUCTION_DOMAIN
212270
path = reverse('projects-detail', kwargs={'project_slug': obj.slug})
213-
return urllib.parse.urlunparse((scheme, domain, path, '', '', ''))
271+
return self._absolute_url(path)
272+
273+
def get_versions(self, obj):
274+
path = reverse(
275+
'projects-versions-list',
276+
kwargs={
277+
'parent_lookup_project__slug': obj.slug,
278+
},
279+
)
280+
return self._absolute_url(path)
281+
282+
def get_builds(self, obj):
283+
path = reverse(
284+
'projects-builds-list',
285+
kwargs={
286+
'parent_lookup_project__slug': obj.slug,
287+
},
288+
)
289+
return self._absolute_url(path)
290+
291+
def get_subprojects(self, obj):
292+
path = reverse(
293+
'projects-subprojects',
294+
kwargs={
295+
'project_slug': obj.slug,
296+
},
297+
)
298+
return self._absolute_url(path)
299+
300+
def get_superprojects(self, obj):
301+
path = reverse(
302+
'projects-superprojects',
303+
kwargs={
304+
'project_slug': obj.slug,
305+
},
306+
)
307+
return self._absolute_url(path)
308+
309+
def get_translations(self, obj):
310+
path = reverse(
311+
'projects-translations',
312+
kwargs={
313+
'project_slug': obj.slug,
314+
},
315+
)
316+
return self._absolute_url(path)
214317

215318

216319
class ProjectSerializer(FlexFieldsModelSerializer):

0 commit comments

Comments
 (0)