Skip to content

Commit

Permalink
Add "links" field for Project, Version and Build
Browse files Browse the repository at this point in the history
  • Loading branch information
humitos committed Mar 5, 2019
1 parent 59f7b6f commit cd6839d
Showing 1 changed file with 134 additions and 10 deletions.
144 changes: 134 additions & 10 deletions readthedocs/v3/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,49 @@ class Meta:
]


class BaseLinksSerializer(serializers.Serializer):

def _absolute_url(self, path):
scheme = 'http' if settings.DEBUG else 'https'
domain = settings.PRODUCTION_DOMAIN
return urllib.parse.urlunparse((scheme, domain, path, '', '', ''))


class BuildLinksSerializer(BaseLinksSerializer):
_self = serializers.SerializerMethodField()
version = serializers.SerializerMethodField()
project = serializers.SerializerMethodField()

def get__self(self, obj):
path = reverse(
'projects-builds-detail',
kwargs={
'parent_lookup_project__slug': obj.project.slug,
'build_pk': obj.pk,
},
)
return self._absolute_url(path)

def get_version(self, obj):
path = reverse(
'projects-versions-detail',
kwargs={
'parent_lookup_project__slug': obj.project.slug,
'version_slug': obj.version.slug,
},
)
return self._absolute_url(path)

def get_project(self, obj):
path = reverse(
'projects-detail',
kwargs={
'project_slug': obj.project.slug,
},
)
return self._absolute_url(path)


class BuildConfigSerializer(FlexFieldsSerializerMixin, serializers.Serializer):

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

expandable_fields = dict(
config=(
Expand All @@ -70,7 +114,7 @@ class Meta:
'commit',
'builder',
'cold_storage',
# 'links',
'links',
]

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


class VersionLinksSerializer(BaseLinksSerializer):
_self = serializers.SerializerMethodField()
builds = serializers.SerializerMethodField()
project = serializers.SerializerMethodField()

def get__self(self, obj):
path = reverse(
'projects-versions-detail',
kwargs={
'parent_lookup_project__slug': obj.project.slug,
'version_slug': obj.slug,
},
)
return self._absolute_url(path)

def get_builds(self, obj):
path = reverse(
'projects-versions-builds-list',
kwargs={
'parent_lookup_project__slug': obj.project.slug,
'parent_lookup_version__slug': obj.slug,
},
)
return self._absolute_url(path)

def get_project(self, obj):
path = reverse(
'projects-detail',
kwargs={
'project_slug': obj.project.slug,
},
)
return self._absolute_url(path)


class VersionURLsSerializer(serializers.Serializer):
documentation = serializers.SerializerMethodField()
vcs = serializers.URLField(source='vcs_url')
Expand All @@ -102,6 +181,7 @@ class VersionSerializer(FlexFieldsModelSerializer):
ref = serializers.CharField()
downloads = serializers.SerializerMethodField()
urls = VersionURLsSerializer(source='*')
links = VersionLinksSerializer(source='*')

expandable_fields = dict(
last_build=(
Expand All @@ -126,7 +206,7 @@ class Meta:
'type',
'downloads',
'urls',
# 'links',
'links',
]

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


class ProjectLinksSerializer(serializers.Serializer):
class ProjectLinksSerializer(BaseLinksSerializer):

_self = serializers.SerializerMethodField()

# TODO: add these once the endpoints get implemented
# users = serializers.SerializerMethodField()
# versions = serializers.SerializerMethodField()
# builds = serializers.SerializerMethodField()
# subprojects = serializers.SerializerMethodField()
# translations = serializers.SerializerMethodField()
versions = serializers.SerializerMethodField()
builds = serializers.SerializerMethodField()
subprojects = serializers.SerializerMethodField()
superprojects = serializers.SerializerMethodField()
translations = serializers.SerializerMethodField()

def get__self(self, obj):
scheme = 'http' if settings.DEBUG else 'https'
domain = settings.PRODUCTION_DOMAIN
path = reverse('projects-detail', kwargs={'project_slug': obj.slug})
return urllib.parse.urlunparse((scheme, domain, path, '', '', ''))
return self._absolute_url(path)

def get_versions(self, obj):
path = reverse(
'projects-versions-list',
kwargs={
'parent_lookup_project__slug': obj.slug,
},
)
return self._absolute_url(path)

def get_builds(self, obj):
path = reverse(
'projects-builds-list',
kwargs={
'parent_lookup_project__slug': obj.slug,
},
)
return self._absolute_url(path)

def get_subprojects(self, obj):
path = reverse(
'projects-subprojects',
kwargs={
'project_slug': obj.slug,
},
)
return self._absolute_url(path)

def get_superprojects(self, obj):
path = reverse(
'projects-superprojects',
kwargs={
'project_slug': obj.slug,
},
)
return self._absolute_url(path)

def get_translations(self, obj):
path = reverse(
'projects-translations',
kwargs={
'project_slug': obj.slug,
},
)
return self._absolute_url(path)


class ProjectSerializer(FlexFieldsModelSerializer):
Expand Down

0 comments on commit cd6839d

Please sign in to comment.