Corp/backend/api/v1/schedule/permissions.py

106 lines
3.9 KiB
Python

# backend/api/v1/schedule/permissions.py
"""
Права доступа для django-scheduler API.
"""
from rest_framework import permissions
from django.contrib.contenttypes.models import ContentType
from schedule.models import CalendarRelation
class IsOwnerOfCalendar(permissions.BasePermission):
"""
Только owner календаря может изменять/удалять календарь.
Viewer и editor могут только читать календарь.
"""
def has_object_permission(self, request, view, obj):
"""Проверка прав на календарь."""
# SAFE_METHODS (GET, HEAD, OPTIONS) доступны всем участникам
if request.method in permissions.SAFE_METHODS:
return True
# Только owner может изменять/удалять календарь
return self._is_owner(obj, request.user)
@staticmethod
def _is_owner(calendar, user):
"""Проверка, является ли пользователь владельцем календаря."""
if user.is_staff or user.is_superuser:
return True
from django.contrib.auth import get_user_model
User = get_user_model()
ct = ContentType.objects.get_for_model(User)
return CalendarRelation.objects.filter(
calendar=calendar,
content_type=ct,
object_id=user.id,
distinction="owner",
).exists()
class CanEditCalendar(permissions.BasePermission):
"""
Права для событий в календаре:
- owner: полный доступ (create, read, update, delete)
- editor: может создавать, изменять и удалять события
(create, read, update, delete)
- viewer: только чтение (read)
"""
def has_permission(self, request, view):
"""Проверка прав на создание события."""
# Для создания события нужно быть owner или editor календаря
if view.action == "create":
calendar_id = request.data.get("calendar")
if not calendar_id:
return False
from schedule.models import Calendar
try:
calendar = Calendar.objects.get(id=calendar_id)
except Calendar.DoesNotExist:
return False
return self._can_edit(calendar, request.user)
return True
def has_object_permission(self, request, view, obj):
"""Проверка прав на событие."""
# Event object
event = obj
calendar = event.calendar
# SAFE_METHODS (GET, HEAD, OPTIONS) доступны всем участникам
if request.method in permissions.SAFE_METHODS:
return True
# Для изменения/удаления нужны права editor или owner
return self._can_edit(calendar, request.user)
@staticmethod
def _can_edit(calendar, user):
"""Проверка, может ли пользователь редактировать события в календаре."""
if user.is_staff or user.is_superuser:
return True
from django.contrib.auth import get_user_model
User = get_user_model()
ct = ContentType.objects.get_for_model(User)
# Проверяем роль пользователя в календаре
try:
relation = CalendarRelation.objects.get(
calendar=calendar, content_type=ct, object_id=user.id
)
# Owner и editor могут редактировать, viewer - нет
return relation.distinction in ["owner", "editor"]
except CalendarRelation.DoesNotExist:
return False