Skip to content
Snippets Groups Projects
Commit f081f2d2 authored by James Graham's avatar James Graham
Browse files

Add necessary permission checks to metadata item API endpoints

parent 79715c6d
Branches dev
No related tags found
No related merge requests found
...@@ -87,3 +87,17 @@ class IsAdminOrReadOnly(permissions.BasePermission): ...@@ -87,3 +87,17 @@ class IsAdminOrReadOnly(permissions.BasePermission):
request.method in permissions.SAFE_METHODS or request.method in permissions.SAFE_METHODS or
request.user.is_superuser request.user.is_superuser
) )
class IsOwnerOrReadOnly(permissions.BasePermission):
"""
Grant owner and admins write access - all others get read-only.
"""
message = 'You do not have permission to access this resource.'
def has_permission(self, request, view):
return bool(
request.method in permissions.SAFE_METHODS or
view.get_datasource().owner == request.user or
request.user.is_superuser
)
...@@ -21,15 +21,20 @@ from provenance import models as prov_models ...@@ -21,15 +21,20 @@ from provenance import models as prov_models
class MetadataItemApiViewset(viewsets.ModelViewSet): class MetadataItemApiViewset(viewsets.ModelViewSet):
"""
API ViewSet for viewing and managing dynamic metadata items on a data sources.
"""
serializer_class = serializers.MetadataItemSerializer serializer_class = serializers.MetadataItemSerializer
permission_classes = [permissions.IsAdminOrReadOnly] permission_classes = [permissions.IsOwnerOrReadOnly]
def get_datasource(self):
return get_object_or_404(models.DataSource, pk=self.kwargs['datasource_pk'])
def get_queryset(self): def get_queryset(self):
return models.MetadataItem.objects.filter(datasource=self.kwargs['datasource_pk']) return models.MetadataItem.objects.filter(datasource=self.kwargs['datasource_pk'])
def perform_create(self, serializer): def perform_create(self, serializer):
datasource = get_object_or_404(models.DataSource, pk=self.kwargs['datasource_pk']) serializer.save(datasource=self.get_datasource())
serializer.save(datasource=datasource)
class DataSourceApiViewset(viewsets.ReadOnlyModelViewSet): class DataSourceApiViewset(viewsets.ReadOnlyModelViewSet):
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment