-
Notifications
You must be signed in to change notification settings - Fork 6
Expand file tree
/
Copy pathviewsets.py
More file actions
42 lines (33 loc) · 1.53 KB
/
viewsets.py
File metadata and controls
42 lines (33 loc) · 1.53 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
from django.core.exceptions import ImproperlyConfigured
from rest_framework import viewsets, renderers
from rest_framework.permissions import IsAuthenticated
from api import permissions
class OwnerViewSet(viewsets.ModelViewSet):
"""
A simple ViewSet for objects filtered by their 'owner' attribute.
To use it, at minimum you'll need to provide the `serializer_class` attribute and
the `model` attribute shortcut.
"""
permission_classes = [IsAuthenticated, permissions.IsOwner]
def get_queryset(self):
return self.model.objects.filter(owner=self.request.user)
def perform_create(self, serializer):
serializer.save(owner=self.request.user)
class BaseAppViewSet(viewsets.ModelViewSet):
"""
A ViewSet for the Workspace model, which filters workspaces by membership and role.
"""
lookup_field = 'id'
permission_classes = [IsAuthenticated, permissions.IsAppUser]
renderer_classes = [renderers.JSONRenderer]
def get_queryset(self):
# Prefer direct workspace relation, then support app->workspace chain.
if hasattr(self.model, 'workspace'):
return self.model.objects.filter(
workspace__workspacemember__user=self.request.user).distinct()
elif hasattr(self.model, 'app'):
return self.model.objects.filter(
app__workspace__workspacemember__user=self.request.user).distinct()
raise ImproperlyConfigured(
f"{self.__class__.__name__} requires a model with a 'workspace' or 'app' field."
)