From 23844dd879b263ecd2b50e35b4073c2294955b42 Mon Sep 17 00:00:00 2001 From: igor_nadein Date: Fri, 27 Feb 2026 12:06:40 +0300 Subject: [PATCH] =?UTF-8?q?=D0=BF=D0=B5=D1=80=D0=BC=D0=B8=D1=88=D0=B5?= =?UTF-8?q?=D0=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/lib/permissions.ts | 84 +++++++++++++++++++++++++++++++++ 1 file changed, 84 insertions(+) create mode 100644 frontend/src/lib/permissions.ts diff --git a/frontend/src/lib/permissions.ts b/frontend/src/lib/permissions.ts new file mode 100644 index 00000000..7063f085 --- /dev/null +++ b/frontend/src/lib/permissions.ts @@ -0,0 +1,84 @@ +import type { User } from "@/types/api"; + +/** + * Проверяет, может ли пользователь обрабатывать (approve/reject) заявления. + * + * Соответствует backend функции _user_can_process_requests из requests_app/views.py + * + * Возвращает true если: + * - Пользователь является staff или superuser + * - Имеет модельное право `requests_app.can_process_requests` + * - Является руководителем хотя бы одного отдела + * - Имеет департаментное право `can_process_requests` или `view_request` + */ +export function canProcessRequests(user?: User | null): boolean { + if (!user) return false; + + const auth = user.auth; + if (!auth) return false; + + // Staff или superuser имеют полный доступ + if (auth.is_staff || auth.is_superuser) { + return true; + } + + // Проверка модельного права requests_app.can_process_requests + if (auth.permissions?.includes("requests_app.can_process_requests")) { + return true; + } + + // Проверка через permissions_by_app + if (auth.permissions_by_app?.["requests_app"]?.includes("can_process_requests")) { + return true; + } + + // Проверка, является ли пользователь руководителем отдела + const departments = user.departments || []; + const isHead = departments.some((dept) => dept.is_head); + if (isHead) { + return true; + } + + // Дополнительная проверка прав на модели (могут быть в общем списке) + const allPermissions = auth.permissions || []; + const hasAnyProcessPerm = allPermissions.some((perm) => + perm.includes("view_request") || + perm.includes("change_request") + ); + + return hasAnyProcessPerm; +} + +/** + * Проверяет, может ли пользователь управлять всеми заявлениями + * (просматривать все, удалять любые и т.д.). + * + * Это более высокий уровень доступа, чем canProcessRequests. + * + * Возвращает true если: + * - Пользователь является staff или superuser + * - Имеет право `requests_app.can_view_all_requests` + */ +export function canManageRequests(user?: User | null): boolean { + if (!user) return false; + + const auth = user.auth; + if (!auth) return false; + + // Staff или superuser имеют полный доступ + if (auth.is_staff || auth.is_superuser) { + return true; + } + + // Проверка права на просмотр всех заявлений + if (auth.permissions?.includes("requests_app.can_view_all_requests")) { + return true; + } + + // Проверка через permissions_by_app + if (auth.permissions_by_app?.["requests_app"]?.includes("can_view_all_requests")) { + return true; + } + + return false; +}