Skip to content

Commit cd6839d

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

File tree

1 file changed

+134
-10
lines changed

1 file changed

+134
-10
lines changed

readthedocs/v3/serializers.py

+134-10
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,49 @@ 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+
version = serializers.SerializerMethodField()
45+
project = serializers.SerializerMethodField()
46+
47+
def get__self(self, obj):
48+
path = reverse(
49+
'projects-builds-detail',
50+
kwargs={
51+
'parent_lookup_project__slug': obj.project.slug,
52+
'build_pk': obj.pk,
53+
},
54+
)
55+
return self._absolute_url(path)
56+
57+
def get_version(self, obj):
58+
path = reverse(
59+
'projects-versions-detail',
60+
kwargs={
61+
'parent_lookup_project__slug': obj.project.slug,
62+
'version_slug': obj.version.slug,
63+
},
64+
)
65+
return self._absolute_url(path)
66+
67+
def get_project(self, obj):
68+
path = reverse(
69+
'projects-detail',
70+
kwargs={
71+
'project_slug': obj.project.slug,
72+
},
73+
)
74+
return self._absolute_url(path)
75+
76+
3477
class BuildConfigSerializer(FlexFieldsSerializerMixin, serializers.Serializer):
3578

3679
def to_representation(self, obj):
@@ -46,6 +89,7 @@ class BuildSerializer(FlexFieldsModelSerializer):
4689
created = serializers.DateTimeField(source='date')
4790
finished = serializers.SerializerMethodField()
4891
duration = serializers.IntegerField(source='length')
92+
links = BuildLinksSerializer(source='*')
4993

5094
expandable_fields = dict(
5195
config=(
@@ -70,7 +114,7 @@ class Meta:
70114
'commit',
71115
'builder',
72116
'cold_storage',
73-
# 'links',
117+
'links',
74118
]
75119

76120
def get_finished(self, obj):
@@ -86,6 +130,41 @@ def get_name(self, obj):
86130
return obj.privacy_level.title()
87131

88132

133+
class VersionLinksSerializer(BaseLinksSerializer):
134+
_self = serializers.SerializerMethodField()
135+
builds = serializers.SerializerMethodField()
136+
project = serializers.SerializerMethodField()
137+
138+
def get__self(self, obj):
139+
path = reverse(
140+
'projects-versions-detail',
141+
kwargs={
142+
'parent_lookup_project__slug': obj.project.slug,
143+
'version_slug': obj.slug,
144+
},
145+
)
146+
return self._absolute_url(path)
147+
148+
def get_builds(self, obj):
149+
path = reverse(
150+
'projects-versions-builds-list',
151+
kwargs={
152+
'parent_lookup_project__slug': obj.project.slug,
153+
'parent_lookup_version__slug': obj.slug,
154+
},
155+
)
156+
return self._absolute_url(path)
157+
158+
def get_project(self, obj):
159+
path = reverse(
160+
'projects-detail',
161+
kwargs={
162+
'project_slug': obj.project.slug,
163+
},
164+
)
165+
return self._absolute_url(path)
166+
167+
89168
class VersionURLsSerializer(serializers.Serializer):
90169
documentation = serializers.SerializerMethodField()
91170
vcs = serializers.URLField(source='vcs_url')
@@ -102,6 +181,7 @@ class VersionSerializer(FlexFieldsModelSerializer):
102181
ref = serializers.CharField()
103182
downloads = serializers.SerializerMethodField()
104183
urls = VersionURLsSerializer(source='*')
184+
links = VersionLinksSerializer(source='*')
105185

106186
expandable_fields = dict(
107187
last_build=(
@@ -126,7 +206,7 @@ class Meta:
126206
'type',
127207
'downloads',
128208
'urls',
129-
# 'links',
209+
'links',
130210
]
131211

132212
def get_downloads(self, obj):
@@ -195,22 +275,66 @@ class RepositorySerializer(serializers.Serializer):
195275
type = serializers.CharField(source='repo_type')
196276

197277

198-
class ProjectLinksSerializer(serializers.Serializer):
278+
class ProjectLinksSerializer(BaseLinksSerializer):
199279

200280
_self = serializers.SerializerMethodField()
201281

202282
# TODO: add these once the endpoints get implemented
203283
# users = serializers.SerializerMethodField()
204-
# versions = serializers.SerializerMethodField()
205-
# builds = serializers.SerializerMethodField()
206-
# subprojects = serializers.SerializerMethodField()
207-
# translations = serializers.SerializerMethodField()
284+
versions = serializers.SerializerMethodField()
285+
builds = serializers.SerializerMethodField()
286+
subprojects = serializers.SerializerMethodField()
287+
superprojects = serializers.SerializerMethodField()
288+
translations = serializers.SerializerMethodField()
208289

209290
def get__self(self, obj):
210-
scheme = 'http' if settings.DEBUG else 'https'
211-
domain = settings.PRODUCTION_DOMAIN
212291
path = reverse('projects-detail', kwargs={'project_slug': obj.slug})
213-
return urllib.parse.urlunparse((scheme, domain, path, '', '', ''))
292+
return self._absolute_url(path)
293+
294+
def get_versions(self, obj):
295+
path = reverse(
296+
'projects-versions-list',
297+
kwargs={
298+
'parent_lookup_project__slug': obj.slug,
299+
},
300+
)
301+
return self._absolute_url(path)
302+
303+
def get_builds(self, obj):
304+
path = reverse(
305+
'projects-builds-list',
306+
kwargs={
307+
'parent_lookup_project__slug': obj.slug,
308+
},
309+
)
310+
return self._absolute_url(path)
311+
312+
def get_subprojects(self, obj):
313+
path = reverse(
314+
'projects-subprojects',
315+
kwargs={
316+
'project_slug': obj.slug,
317+
},
318+
)
319+
return self._absolute_url(path)
320+
321+
def get_superprojects(self, obj):
322+
path = reverse(
323+
'projects-superprojects',
324+
kwargs={
325+
'project_slug': obj.slug,
326+
},
327+
)
328+
return self._absolute_url(path)
329+
330+
def get_translations(self, obj):
331+
path = reverse(
332+
'projects-translations',
333+
kwargs={
334+
'project_slug': obj.slug,
335+
},
336+
)
337+
return self._absolute_url(path)
214338

215339

216340
class ProjectSerializer(FlexFieldsModelSerializer):

0 commit comments

Comments
 (0)