Skip to content
Snippets Groups Projects
permissions.py 1.68 KiB
Newer Older
  • Learn to ignore specific revisions
  • from django.core.exceptions import ObjectDoesNotExist
    
    from rest_framework.permissions import BasePermission
    
    from funkwhale_api.common import preferences
    
    
    
    class ConditionalAuthentication(BasePermission):
        def has_permission(self, request, view):
    
    Eliot Berriot's avatar
    Eliot Berriot committed
            if preferences.get("common__api_authentication_required"):
    
    Eliot Berriot's avatar
    Eliot Berriot committed
                return (request.user and request.user.is_authenticated) or (
                    hasattr(request, "actor") and request.actor
                )
    
    class OwnerPermission(BasePermission):
        """
        Ensure the request user is the owner of the object.
    
        Usage:
    
        class MyView(APIView):
            model = MyModel
            permission_classes = [OwnerPermission]
            owner_field = 'owner'
            owner_checks = ['read', 'write']
        """
    
    Eliot Berriot's avatar
    Eliot Berriot committed
    
    
    Eliot Berriot's avatar
    Eliot Berriot committed
            "GET": "read",
            "OPTIONS": "read",
            "HEAD": "read",
            "POST": "write",
            "PUT": "write",
            "PATCH": "write",
            "DELETE": "write",
    
        }
    
        def has_object_permission(self, request, view, obj):
            method_check = self.perms_map[request.method]
    
    Eliot Berriot's avatar
    Eliot Berriot committed
            owner_checks = getattr(view, "owner_checks", ["read", "write"])
    
            if method_check not in owner_checks:
                # check not enabled
                return True
    
    
    Eliot Berriot's avatar
    Eliot Berriot committed
            owner_field = getattr(view, "owner_field", "user")
    
            owner_exception = getattr(view, "owner_exception", Http404)
            try:
                owner = operator.attrgetter(owner_field)(obj)
            except ObjectDoesNotExist:
                raise owner_exception
    
    
            if not owner or not request.user.is_authenticated or owner != request.user: