#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