Files
ctms/backend/app/core/rbac.py
T
2026-05-29 10:20:42 +08:00

43 lines
1.2 KiB
Python

from __future__ import annotations
from dataclasses import dataclass
from typing import Iterable
@dataclass(frozen=True)
class Scope:
trial_id: str | None = None
site_id: str | None = None
doc_type: str | None = None
ROLE_ACTIONS: dict[str, set[str]] = {
"ADMIN": {
"view",
"create_document",
"create_version",
"submit",
"approve",
"distribute",
"ack",
"delete_document",
},
"PM": {"view", "create_document", "create_version", "submit", "approve", "distribute", "ack", "delete_document"},
"CRA": {"view", "create_version", "submit", "ack"},
"PV": {"view", "create_version", "submit", "ack"},
"CTA": {"view", "create_version", "submit", "ack"},
}
def is_allowed(action: str, user, membership) -> bool:
if getattr(user, "is_admin", False):
return action in ROLE_ACTIONS["ADMIN"]
member_role = getattr(membership, "role_in_study", None)
if member_role:
return action in ROLE_ACTIONS.get(member_role, set())
return False
def is_scope_allowed(action: str, scope: Scope, user, membership) -> bool:
return is_allowed(action, user, membership)