# Copyright © 2017 Tom Hacohen # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as # published by the Free Software Foundation, version 3. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . from rest_framework import permissions from django_etebase.models import Collection, AccessLevels def is_collection_admin(collection, user): member = collection.members.filter(user=user).first() return (member is not None) and (member.accessLevel == AccessLevels.ADMIN) class IsCollectionAdmin(permissions.BasePermission): """ Custom permission to only allow owners of a collection to view it """ message = { 'detail': 'Only collection admins can perform this operation.', 'code': 'admin_access_required', } def has_permission(self, request, view): collection_uid = view.kwargs['collection_uid'] try: collection = view.get_collection_queryset().get(main_item__uid=collection_uid) return is_collection_admin(collection, request.user) except Collection.DoesNotExist: # If the collection does not exist, we want to 404 later, not permission denied. return True class IsCollectionAdminOrReadOnly(permissions.BasePermission): """ Custom permission to only allow owners of a collection to edit it """ message = { 'detail': 'Only collection admins can edit collections.', 'code': 'admin_access_required', } def has_permission(self, request, view): collection_uid = view.kwargs.get('collection_uid', None) # Allow creating new collections if collection_uid is None: return True try: collection = view.get_collection_queryset().get(main_item__uid=collection_uid) if request.method in permissions.SAFE_METHODS: return True return is_collection_admin(collection, request.user) except Collection.DoesNotExist: # If the collection does not exist, we want to 404 later, not permission denied. return True class HasWriteAccessOrReadOnly(permissions.BasePermission): """ Custom permission to restrict write """ message = { 'detail': 'You need write access to write to this collection', 'code': 'no_write_access', } def has_permission(self, request, view): collection_uid = view.kwargs['collection_uid'] try: collection = view.get_collection_queryset().get(main_item__uid=collection_uid) if request.method in permissions.SAFE_METHODS: return True else: member = collection.members.get(user=request.user) return member.accessLevel != AccessLevels.READ_ONLY except Collection.DoesNotExist: # If the collection does not exist, we want to 404 later, not permission denied. return True