пермишен

This commit is contained in:
igor_nadein 2026-02-27 12:06:40 +03:00
parent 007adadef4
commit a9f435ae79

View File

@ -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;
}