21
21
22
22
from ..permissions import (APIPermission , APIRestrictedPermission ,
23
23
RelatedProjectIsOwner , IsOwner )
24
- from ..serializers import (BuildSerializerFull , BuildSerializer ,
25
- BuildCommandSerializer , ProjectSerializer ,
26
- ProjectSerializerFull , VersionSerializer ,
24
+ from ..serializers import (BuildSerializer , BuildAdminSerializer ,
25
+ BuildCommandSerializer ,
26
+ ProjectSerializer , ProjectAdminSerializer ,
27
+ VersionSerializer , VersionAdminSerializer ,
27
28
DomainSerializer , RemoteOrganizationSerializer ,
28
29
RemoteRepositorySerializer )
29
30
from .. import utils as api_utils
30
31
31
32
log = logging .getLogger (__name__ )
32
33
33
34
34
- class ProjectViewSet (viewsets .ModelViewSet ):
35
+ class UserSelectViewSet (viewsets .ModelViewSet ):
36
+
37
+ """View set that varies serializer class based on request user credentials
38
+
39
+ Viewsets using this class should have an attribute `admin_serializer_class`,
40
+ which is a serializer that might have more fields that only admin/staff
41
+ users require. If the user is staff, this class will be returned instead.
42
+ """
43
+
44
+ def get_serializer_class (self ):
45
+ try :
46
+ if self .request .user .is_staff and self .admin_serializer_class is not None :
47
+ return self .admin_serializer_class
48
+ except AttributeError :
49
+ pass
50
+ return self .serializer_class
51
+
52
+ def get_queryset (self ):
53
+ """Use our API manager method to determine authorization on queryset"""
54
+ return self .model .objects .api (self .request .user )
55
+
56
+
57
+ class ProjectViewSet (UserSelectViewSet ):
35
58
36
59
"""List, filter, etc. Projects."""
37
60
38
61
permission_classes = [APIPermission ]
39
62
renderer_classes = (JSONRenderer ,)
40
63
serializer_class = ProjectSerializer
64
+ admin_serializer_class = ProjectAdminSerializer
41
65
model = Project
42
66
paginate_by = 100
43
67
paginate_by_param = 'page_size'
44
68
max_paginate_by = 1000
45
69
46
- def get_queryset (self ):
47
- return self .model .objects .api (self .request .user )
48
-
49
- def get_serializer_class (self ):
50
- if self .request .user .is_staff :
51
- return ProjectSerializerFull
52
- return self .serializer_class
53
-
54
70
@decorators .detail_route ()
55
71
def valid_versions (self , request , ** kwargs ):
56
72
"""Maintain state of versions that are wanted."""
@@ -171,35 +187,22 @@ def sync_versions(self, request, **kwargs):
171
187
})
172
188
173
189
174
- class VersionViewSet (viewsets . ModelViewSet ):
190
+ class VersionViewSet (UserSelectViewSet ):
175
191
176
192
permission_classes = [APIRestrictedPermission ]
177
193
renderer_classes = (JSONRenderer ,)
178
194
serializer_class = VersionSerializer
195
+ admin_serializer_class = VersionAdminSerializer
179
196
model = Version
180
197
181
- def get_queryset (self ):
182
- return self .model .objects .api (self .request .user )
183
-
184
198
185
- class BuildViewSetBase (viewsets . ModelViewSet ):
199
+ class BuildViewSetBase (UserSelectViewSet ):
186
200
permission_classes = [APIRestrictedPermission ]
187
201
renderer_classes = (JSONRenderer ,)
202
+ serializer_class = BuildSerializer
203
+ admin_serializer_class = BuildAdminSerializer
188
204
model = Build
189
205
190
- def get_queryset (self ):
191
- return self .model .objects .api (self .request .user )
192
-
193
- def get_serializer_class (self ):
194
- """Vary serializer class based on user status
195
-
196
- This is used to allow write to write-only fields on Build by admin users
197
- and to not return those fields to non-admin users.
198
- """
199
- if self .request .user .is_staff :
200
- return BuildSerializerFull
201
- return BuildSerializer
202
-
203
206
204
207
class BuildViewSet (SettingsOverrideObject ):
205
208
@@ -208,18 +211,12 @@ class BuildViewSet(SettingsOverrideObject):
208
211
_default_class = BuildViewSetBase
209
212
210
213
211
- class BuildCommandViewSet (viewsets .ModelViewSet ):
212
-
213
- """This is currently a write-only way to update the commands on build."""
214
-
214
+ class BuildCommandViewSet (UserSelectViewSet ):
215
215
permission_classes = [APIRestrictedPermission ]
216
216
renderer_classes = (JSONRenderer ,)
217
217
serializer_class = BuildCommandSerializer
218
218
model = BuildCommandResult
219
219
220
- def get_queryset (self ):
221
- return self .model .objects .api (self .request .user )
222
-
223
220
224
221
class NotificationViewSet (viewsets .ReadOnlyModelViewSet ):
225
222
permission_classes = (permissions .IsAuthenticated , RelatedProjectIsOwner )
@@ -230,15 +227,12 @@ def get_queryset(self):
230
227
return self .model .objects .api (self .request .user )
231
228
232
229
233
- class DomainViewSet (viewsets . ModelViewSet ):
230
+ class DomainViewSet (UserSelectViewSet ):
234
231
permission_classes = [APIRestrictedPermission ]
235
232
renderer_classes = (JSONRenderer ,)
236
233
serializer_class = DomainSerializer
237
234
model = Domain
238
235
239
- def get_queryset (self ):
240
- return self .model .objects .api (self .request .user )
241
-
242
236
243
237
class RemoteOrganizationViewSet (viewsets .ReadOnlyModelViewSet ):
244
238
permission_classes = [IsOwner ]
0 commit comments