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)