Skip to content

Commit 0f0a7fa

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 68ceee9 commit 0f0a7fa

File tree

1 file changed

+15
-10
lines changed

1 file changed

+15
-10
lines changed

readthedocs/restapi/views/model_views.py

+15-10
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,11 @@ class ProjectViewSet(UserSelectViewSet):
9494
filter_fields = ('slug',) # django-filter<2.0.0
9595
filterset_fields = ('slug',)
9696

97+
def get_project_for_user_or_404(self, lookup_value):
98+
lookup_query = {self.lookup_field: lookup_value}
99+
qs = self.get_queryset()
100+
return get_object_or_404(qs, **lookup_query)
101+
97102
@decorators.action(detail=True)
98103
def translations(self, *_, **__):
99104
translations = self.get_object().translations.all()
@@ -103,8 +108,8 @@ def translations(self, *_, **__):
103108

104109
@decorators.action(detail=True)
105110
def subprojects(self, request, **kwargs):
106-
project = get_object_or_404(
107-
Project.objects.api(request.user), pk=kwargs['pk'])
111+
project = self.get_project_for_user_or_404(
112+
kwargs[self.lookup_field])
108113
rels = project.subprojects.all()
109114
children = [rel.child for rel in rels]
110115
return Response({
@@ -113,26 +118,26 @@ def subprojects(self, request, **kwargs):
113118

114119
@decorators.action(detail=True)
115120
def active_versions(self, request, **kwargs):
116-
project = get_object_or_404(
117-
Project.objects.api(request.user), pk=kwargs['pk'])
121+
project = self.get_project_for_user_or_404(
122+
kwargs[self.lookup_field])
118123
versions = project.versions.filter(active=True)
119124
return Response({
120125
'versions': VersionSerializer(versions, many=True).data,
121126
})
122127

123128
@decorators.action(detail=True, permission_classes=[permissions.IsAdminUser])
124129
def token(self, request, **kwargs):
125-
project = get_object_or_404(
126-
Project.objects.api(request.user), pk=kwargs['pk'])
130+
project = self.get_project_for_user_or_404(
131+
kwargs[self.lookup_field])
127132
token = GitHubService.get_token_for_project(project, force_local=True)
128133
return Response({
129134
'token': token,
130135
})
131136

132137
@decorators.action(detail=True)
133138
def canonical_url(self, request, **kwargs):
134-
project = get_object_or_404(
135-
Project.objects.api(request.user), pk=kwargs['pk'])
139+
project = self.get_project_for_user_or_404(
140+
kwargs[self.lookup_field])
136141
return Response({
137142
'url': project.get_docs_url(),
138143
})
@@ -149,8 +154,8 @@ def sync_versions(self, request, **kwargs): # noqa: D205
149154
150155
:returns: the identifiers for the versions that have been deleted.
151156
"""
152-
project = get_object_or_404(
153-
Project.objects.api(request.user), pk=kwargs['pk'])
157+
project = self.get_project_for_user_or_404(
158+
kwargs[self.lookup_field])
154159

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

0 commit comments

Comments
 (0)