70 lines
2.7 KiB
Python
70 lines
2.7 KiB
Python
#Ten fragment kodu definiuje niestandardowe uprawnienia dla aplikacji Django REST Framework, które kontrolują dostęp do edycji wpisów i komentarzy oraz publikacji treści.
|
||
|
||
from rest_framework.permissions import BasePermission, SAFE_METHODS
|
||
|
||
#Niestandardowe uprawnienia dla aplikacji Django REST Framework: Kontrola dostępu do edycji wpisów i komentarzy oraz publikacji treści.
|
||
class IsAdminOrReadOnly(BasePermission):
|
||
"""
|
||
Pozwala tylko adminom na modyfikacje (POST, PUT, PATCH, DELETE),
|
||
reszta użytkowników ma tylko odczyt (GET, HEAD, OPTIONS).
|
||
"""
|
||
def has_permission(self, request, view):
|
||
if request.method in SAFE_METHODS:
|
||
return True
|
||
return request.user and request.user.is_authenticated and request.user.is_staff
|
||
|
||
class IsAuthorOrReadOnly(BasePermission):
|
||
"""
|
||
Pozwala edytować tylko własny wpis/komentarz.
|
||
"""
|
||
def has_object_permission(self, request, view, obj):
|
||
if request.method in SAFE_METHODS:
|
||
return True
|
||
return obj.author == request.user
|
||
|
||
# Kontrola dostęu do publikacji treści.
|
||
class IsEditorOrAdmin(BasePermission):
|
||
"""
|
||
Pozwala publikować treści tylko edytorom lub adminom.
|
||
"""
|
||
def has_permission(self, request, view):
|
||
return request.user.is_authenticated and request.user.role in ['admin', 'moderator']
|
||
|
||
|
||
class IsSelfOrAdmin(BasePermission):
|
||
"""
|
||
Odczyt (GET/HEAD/OPTIONS): dozwolony dla wszystkich.
|
||
Zapis (POST/PUT/PATCH/DELETE): tylko właściciel konta albo admin/staff/superuser.
|
||
"""
|
||
|
||
def has_permission(self, request, view):
|
||
# Odczyt – OK dla wszystkich
|
||
if request.method in SAFE_METHODS:
|
||
return True
|
||
# Dla operacji modyfikujących – user musi być zalogowany
|
||
return bool(request.user and request.user.is_authenticated)
|
||
|
||
def has_object_permission(self, request, view, obj):
|
||
# Odczyt – OK dla wszystkich
|
||
if request.method in SAFE_METHODS:
|
||
return True
|
||
|
||
user = request.user
|
||
if not user or not user.is_authenticated:
|
||
return False
|
||
|
||
# Admin/staff/superuser
|
||
is_admin = getattr(user, 'is_superuser', False) or getattr(user, 'is_staff', False) \
|
||
or getattr(user, 'role', None) == 'admin'
|
||
|
||
# Właściciel konta (obsługujemy zarówno User, jak i obiekty z polem user/owner/author)
|
||
uid = getattr(user, 'id', None)
|
||
is_owner = (
|
||
obj is user or
|
||
getattr(obj, 'id', None) == uid or
|
||
getattr(obj, 'user_id', None) == uid or
|
||
getattr(obj, 'owner_id', None) == uid or
|
||
getattr(obj, 'author_id', None) == uid
|
||
)
|
||
|
||
return is_owner or is_admin |