fix: add CanViewRequest permission for recipients and cc_users to view request details

This commit is contained in:
Игорь Надеин 2025-12-29 16:08:15 +03:00
parent a4911f1145
commit 5e0e058b3a
2 changed files with 46 additions and 1 deletions

View File

@ -37,6 +37,43 @@ class IsRecipientOfRequest(BasePermission):
return obj.recipients.filter(id=user.id).exists()
class CanViewRequest(BasePermission):
"""Проверяет, может ли пользователь просматривать заявку.
Доступ разрешается если пользователь:
- staff/superuser
- автор заявки (employee)
- получатель заявки (recipients)
- в копии заявки (cc_users)
"""
message = "У вас нет доступа к этой заявке."
def has_permission(self, request: Request, view: Any) -> bool:
return bool(getattr(request.user, "is_authenticated", False))
def has_object_permission(self, request: Request, view: Any, obj: Any) -> bool:
user = request.user
# Staff/superuser могут просматривать любые заявки
if getattr(user, "is_staff", False) or getattr(user, "is_superuser", False):
return True
# Автор заявки
if getattr(obj, "employee_id", None) == user.id:
return True
# Получатель заявки (recipients)
if obj.recipients.filter(id=user.id).exists():
return True
# В копии заявки (cc_users)
if obj.cc_users.filter(id=user.id).exists():
return True
return False
class CommentsPermission(BasePermission):
"""Комментарии: модельные права, staff, head.

View File

@ -27,6 +27,7 @@ from rest_framework.serializers import (
from ..permissions import AdminOrActionOrModelPerms, AdminOrDeptAllowed, IsSelfOrStaff
from .permissions import (
CanViewRequest,
CommentsPermission,
DeptCanProcess,
DeptChangeRequest,
@ -96,7 +97,14 @@ class RequestViewSet(viewsets.ModelViewSet):
if self.action == "cancel":
return [IsSelfOrStaff()]
if self.action == "retrieve":
return [(IsSelfOrStaff | DeptViewRequest | AdminOrActionOrModelPerms)()]
# Автор, получатель, в копии, по отделу, staff/admin
return [
(
CanViewRequest
| DeptViewRequest
| AdminOrActionOrModelPerms
)()
]
if self.action == "destroy":
return [
(IsSelfOrStaff | AdminOrActionOrModelPerms | DeptChangeRequest)(),