Skip to content

Commit

Permalink
restapi: decouple ProjectViewSet from the pk
Browse files Browse the repository at this point in the history
We may want to hook the very same viewset under a different
router in order to lookup by slug and not pk. If we use
lookup_field instead of hardcoding it in the views, it becomes
easier. While at it reuse get_queryset() method for filtering
the queryset.
  • Loading branch information
xrmx committed Jun 7, 2018
1 parent e393011 commit 5a904bf
Showing 1 changed file with 17 additions and 12 deletions.
29 changes: 17 additions & 12 deletions readthedocs/restapi/views/model_views.py
Original file line number Diff line number Diff line change
Expand Up @@ -92,11 +92,16 @@ class ProjectViewSet(UserSelectViewSet):
model = Project
pagination_class = api_utils.ProjectPagination

def get_project_for_user_or_404(self, lookup_value):
lookup_query = {self.lookup_field: lookup_value}
qs = self.get_queryset()
return get_object_or_404(qs, **lookup_query)

@decorators.detail_route()
def valid_versions(self, request, **kwargs):
"""Maintain state of versions that are wanted."""
project = get_object_or_404(
Project.objects.api(request.user), pk=kwargs['pk'])
project = self.get_project_for_user_or_404(
kwargs[self.lookup_field])
if (not project.num_major or not project.num_minor or
not project.num_point):
return Response(
Expand Down Expand Up @@ -124,8 +129,8 @@ def translations(self, *_, **__):

@detail_route()
def subprojects(self, request, **kwargs):
project = get_object_or_404(
Project.objects.api(request.user), pk=kwargs['pk'])
project = self.get_project_for_user_or_404(
kwargs[self.lookup_field])
rels = project.subprojects.all()
children = [rel.child for rel in rels]
return Response({
Expand All @@ -134,26 +139,26 @@ def subprojects(self, request, **kwargs):

@detail_route()
def active_versions(self, request, **kwargs):
project = get_object_or_404(
Project.objects.api(request.user), pk=kwargs['pk'])
project = self.get_project_for_user_or_404(
kwargs[self.lookup_field])
versions = project.versions.filter(active=True)
return Response({
'versions': VersionSerializer(versions, many=True).data,
})

@decorators.detail_route(permission_classes=[permissions.IsAdminUser])
def token(self, request, **kwargs):
project = get_object_or_404(
Project.objects.api(request.user), pk=kwargs['pk'])
project = self.get_project_for_user_or_404(
kwargs[self.lookup_field])
token = GitHubService.get_token_for_project(project, force_local=True)
return Response({
'token': token,
})

@decorators.detail_route()
def canonical_url(self, request, **kwargs):
project = get_object_or_404(
Project.objects.api(request.user), pk=kwargs['pk'])
project = self.get_project_for_user_or_404(
kwargs[self.lookup_field])
return Response({
'url': project.get_docs_url(),
})
Expand All @@ -168,8 +173,8 @@ def sync_versions(self, request, **kwargs): # noqa: D205
:returns: the identifiers for the versions that have been deleted.
"""
project = get_object_or_404(
Project.objects.api(request.user), pk=kwargs['pk'])
project = self.get_project_for_user_or_404(
kwargs[self.lookup_field])

# If the currently highest non-prerelease version is active, then make
# the new latest version active as well.
Expand Down

0 comments on commit 5a904bf

Please sign in to comment.