Skip to content

Commit 5a904bf

Browse files
committed
restapi: decouple ProjectViewSet from the pk
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.
1 parent e393011 commit 5a904bf

File tree

1 file changed

+17
-12
lines changed

1 file changed

+17
-12
lines changed

readthedocs/restapi/views/model_views.py

+17-12
Original file line numberDiff line numberDiff line change
@@ -92,11 +92,16 @@ class ProjectViewSet(UserSelectViewSet):
9292
model = Project
9393
pagination_class = api_utils.ProjectPagination
9494

95+
def get_project_for_user_or_404(self, lookup_value):
96+
lookup_query = {self.lookup_field: lookup_value}
97+
qs = self.get_queryset()
98+
return get_object_or_404(qs, **lookup_query)
99+
95100
@decorators.detail_route()
96101
def valid_versions(self, request, **kwargs):
97102
"""Maintain state of versions that are wanted."""
98-
project = get_object_or_404(
99-
Project.objects.api(request.user), pk=kwargs['pk'])
103+
project = self.get_project_for_user_or_404(
104+
kwargs[self.lookup_field])
100105
if (not project.num_major or not project.num_minor or
101106
not project.num_point):
102107
return Response(
@@ -124,8 +129,8 @@ def translations(self, *_, **__):
124129

125130
@detail_route()
126131
def subprojects(self, request, **kwargs):
127-
project = get_object_or_404(
128-
Project.objects.api(request.user), pk=kwargs['pk'])
132+
project = self.get_project_for_user_or_404(
133+
kwargs[self.lookup_field])
129134
rels = project.subprojects.all()
130135
children = [rel.child for rel in rels]
131136
return Response({
@@ -134,26 +139,26 @@ def subprojects(self, request, **kwargs):
134139

135140
@detail_route()
136141
def active_versions(self, request, **kwargs):
137-
project = get_object_or_404(
138-
Project.objects.api(request.user), pk=kwargs['pk'])
142+
project = self.get_project_for_user_or_404(
143+
kwargs[self.lookup_field])
139144
versions = project.versions.filter(active=True)
140145
return Response({
141146
'versions': VersionSerializer(versions, many=True).data,
142147
})
143148

144149
@decorators.detail_route(permission_classes=[permissions.IsAdminUser])
145150
def token(self, request, **kwargs):
146-
project = get_object_or_404(
147-
Project.objects.api(request.user), pk=kwargs['pk'])
151+
project = self.get_project_for_user_or_404(
152+
kwargs[self.lookup_field])
148153
token = GitHubService.get_token_for_project(project, force_local=True)
149154
return Response({
150155
'token': token,
151156
})
152157

153158
@decorators.detail_route()
154159
def canonical_url(self, request, **kwargs):
155-
project = get_object_or_404(
156-
Project.objects.api(request.user), pk=kwargs['pk'])
160+
project = self.get_project_for_user_or_404(
161+
kwargs[self.lookup_field])
157162
return Response({
158163
'url': project.get_docs_url(),
159164
})
@@ -168,8 +173,8 @@ def sync_versions(self, request, **kwargs): # noqa: D205
168173
169174
:returns: the identifiers for the versions that have been deleted.
170175
"""
171-
project = get_object_or_404(
172-
Project.objects.api(request.user), pk=kwargs['pk'])
176+
project = self.get_project_for_user_or_404(
177+
kwargs[self.lookup_field])
173178

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

0 commit comments

Comments
 (0)