|
9 | 9 | from guardian.shortcuts import assign_perm, get_objects_for_user, \ |
10 | 10 | get_users_with_perms, remove_perm |
11 | 11 | from rest_framework import mixins, renderers, status |
| 12 | +from rest_framework.decorators import permission_classes |
12 | 13 | from rest_framework.exceptions import PermissionDenied |
13 | 14 | from rest_framework.permissions import IsAuthenticated |
14 | 15 | from rest_framework.response import Response |
@@ -319,33 +320,31 @@ class AppPermsViewSet(BaseDeisViewSet): |
319 | 320 | model = models.App # models class |
320 | 321 | perm = 'use_app' # short name for permission |
321 | 322 |
|
| 323 | + def get_queryset(self): |
| 324 | + return self.model.objects.all() |
| 325 | + |
| 326 | + @permission_classes([permissions.IsAppUser]) |
322 | 327 | def list(self, request, **kwargs): |
323 | | - app = get_object_or_404(self.model, id=kwargs['id']) |
| 328 | + app = self.get_object() |
324 | 329 | perm_name = "api.{}".format(self.perm) |
325 | | - if request.user != app.owner and \ |
326 | | - not request.user.has_perm(perm_name, app) and \ |
327 | | - not request.user.is_superuser: |
328 | | - return Response(status=status.HTTP_403_FORBIDDEN) |
329 | 330 | usernames = [u.username for u in get_users_with_perms(app) |
330 | 331 | if u.has_perm(perm_name, app)] |
331 | 332 | return Response({'users': usernames}) |
332 | 333 |
|
| 334 | + @permission_classes([permissions.IsOwnerOrAdmin]) |
333 | 335 | def create(self, request, **kwargs): |
334 | | - app = get_object_or_404(self.model, id=kwargs['id']) |
335 | | - if request.user != app.owner and not request.user.is_superuser: |
336 | | - return Response(status=status.HTTP_403_FORBIDDEN) |
| 336 | + app = self.get_object() |
337 | 337 | user = get_object_or_404(User, username=request.data['username']) |
338 | 338 | assign_perm(self.perm, user, app) |
339 | 339 | models.log_event(app, "User {} was granted access to {}".format(user, app)) |
340 | 340 | return Response(status=status.HTTP_201_CREATED) |
341 | 341 |
|
| 342 | + @permission_classes([permissions.IsOwnerOrAdmin]) |
342 | 343 | def destroy(self, request, **kwargs): |
343 | | - app = get_object_or_404(self.model, id=kwargs['id']) |
344 | | - if request.user != app.owner and not request.user.is_superuser: |
345 | | - return Response(status=status.HTTP_403_FORBIDDEN) |
| 344 | + app = self.get_object() |
346 | 345 | user = get_object_or_404(User, username=kwargs['username']) |
347 | 346 | if not user.has_perm(self.perm, app): |
348 | | - return Response(status=status.HTTP_403_FORBIDDEN) |
| 347 | + raise PermissionDenied() |
349 | 348 | remove_perm(self.perm, user, app) |
350 | 349 | models.log_event(app, "User {} was revoked access to {}".format(user, app)) |
351 | 350 | return Response(status=status.HTTP_204_NO_CONTENT) |
|
0 commit comments