45 lines
1.3 KiB
Python
45 lines
1.3 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",
|
|
},
|
|
"QA": {"view", "create_document", "create_version", "submit", "approve", "distribute", "ack"},
|
|
"PM": {"view", "create_document", "create_version", "submit", "approve", "distribute", "ack", "delete_document"},
|
|
"CRA": {"view", "create_version", "submit", "ack"},
|
|
"PV": {"view", "create_version", "submit", "ack"},
|
|
"IMP": {"view", "create_version", "submit", "ack"},
|
|
}
|
|
|
|
|
|
def is_allowed(action: str, user, membership) -> bool:
|
|
role_value = user.role.value if hasattr(user.role, "value") else str(user.role)
|
|
if role_value == "ADMIN":
|
|
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)
|