izaac-2/backend/users/permissions.py
2025-08-31 23:05:53 +02:00

70 lines
2.7 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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