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)