mirror of
https://github.com/pinry/pinry.git
synced 2025-11-13 08:35:41 +01:00
43 lines
1.3 KiB
Python
43 lines
1.3 KiB
Python
|
|
from rest_framework import permissions
|
||
|
|
|
||
|
|
|
||
|
|
class IsOwnerOrReadOnly(permissions.IsAuthenticatedOrReadOnly):
|
||
|
|
"""
|
||
|
|
Object-level permission to only allow owners of an object to edit it.
|
||
|
|
Assumes the model instance has an `owner` attribute.
|
||
|
|
"""
|
||
|
|
def __init__(self, owner_field_name="owner"):
|
||
|
|
self.__owner_field_name = owner_field_name
|
||
|
|
|
||
|
|
def __call__(self):
|
||
|
|
return self
|
||
|
|
|
||
|
|
def has_object_permission(self, request, view, obj):
|
||
|
|
# Read permissions are allowed to any request,
|
||
|
|
# so we'll always allow GET, HEAD or OPTIONS requests.
|
||
|
|
if request.method in permissions.SAFE_METHODS:
|
||
|
|
return True
|
||
|
|
|
||
|
|
return getattr(obj, self.__owner_field_name) == request.user
|
||
|
|
|
||
|
|
|
||
|
|
class OwnerOnly(permissions.IsAuthenticatedOrReadOnly):
|
||
|
|
|
||
|
|
def has_permission(self, request, view):
|
||
|
|
return request.user.is_authenticated()
|
||
|
|
|
||
|
|
def has_object_permission(self, request, view, obj):
|
||
|
|
return obj.owner == request.user
|
||
|
|
|
||
|
|
|
||
|
|
class SuperUserOnly(permissions.BasePermission):
|
||
|
|
"""
|
||
|
|
The request is authenticated as a user, or is a read-only request.
|
||
|
|
"""
|
||
|
|
|
||
|
|
def has_permission(self, request, view):
|
||
|
|
return request.user.is_superuser
|
||
|
|
|
||
|
|
def has_object_permission(self, request, view, obj):
|
||
|
|
return request.user.is_superuser
|