| |
|
|
|
|
| |
|
|
| |
| TASK_CREATE = "task:create" |
| TASK_READ_OWN = "task:read:own" |
| TASK_READ_TEAM = "task:read:team" |
| TASK_READ_ALL = "task:read:all" |
| TASK_UPDATE_OWN = "task:update:own" |
| TASK_UPDATE_ALL = "task:update:all" |
|
|
| |
| AGENT_TRIGGER_DEV = "agent:trigger:dev" |
| AGENT_TRIGGER_MKT = "agent:trigger:mkt" |
| AGENT_TRIGGER_KNOW = "agent:trigger:know" |
|
|
| |
| CODE_APPROVE = "code:approve" |
| CONTENT_PUBLISH = "content:publish" |
|
|
| |
| STATS_VIEW_OWN = "stats:view:own" |
| STATS_VIEW_TEAM = "stats:view:team" |
| STATS_VIEW_ALL = "stats:view:all" |
| LEADS_VIEW_ALL = "leads:view:all" |
|
|
| |
| CONTENT_REJECT = "content:reject" |
| INFO_REQUEST = "info:request" |
|
|
| |
| USER_MANAGE = "user:manage" |
| USER_MANAGE_TEAM = "user:manage:team" |
| MCP_MANAGE = "mcp:manage" |
| BRAND_ASSET_MANAGE = "brand:manage" |
|
|
| |
|
|
| ROLE_PERMISSIONS: dict[str, set[str]] = { |
| "system_admin": { |
| TASK_CREATE, |
| TASK_READ_OWN, |
| TASK_READ_TEAM, |
| TASK_READ_ALL, |
| TASK_UPDATE_OWN, |
| TASK_UPDATE_ALL, |
| AGENT_TRIGGER_DEV, |
| AGENT_TRIGGER_MKT, |
| AGENT_TRIGGER_KNOW, |
| CODE_APPROVE, |
| CONTENT_PUBLISH, |
| CONTENT_REJECT, |
| INFO_REQUEST, |
| STATS_VIEW_OWN, |
| STATS_VIEW_TEAM, |
| STATS_VIEW_ALL, |
| LEADS_VIEW_ALL, |
| USER_MANAGE, |
| MCP_MANAGE, |
| BRAND_ASSET_MANAGE, |
| USER_MANAGE_TEAM, |
| }, |
| "admin": { |
| TASK_CREATE, |
| TASK_READ_OWN, |
| TASK_READ_TEAM, |
| TASK_READ_ALL, |
| TASK_UPDATE_OWN, |
| TASK_UPDATE_ALL, |
| AGENT_TRIGGER_DEV, |
| AGENT_TRIGGER_MKT, |
| AGENT_TRIGGER_KNOW, |
| CODE_APPROVE, |
| CONTENT_PUBLISH, |
| CONTENT_REJECT, |
| INFO_REQUEST, |
| STATS_VIEW_OWN, |
| STATS_VIEW_TEAM, |
| STATS_VIEW_ALL, |
| LEADS_VIEW_ALL, |
| USER_MANAGE, |
| MCP_MANAGE, |
| BRAND_ASSET_MANAGE, |
| USER_MANAGE_TEAM, |
| }, |
| "manager": { |
| TASK_CREATE, |
| TASK_READ_TEAM, |
| TASK_UPDATE_OWN, |
| AGENT_TRIGGER_DEV, |
| AGENT_TRIGGER_MKT, |
| AGENT_TRIGGER_KNOW, |
| CODE_APPROVE, |
| CONTENT_PUBLISH, |
| CONTENT_REJECT, |
| INFO_REQUEST, |
| STATS_VIEW_TEAM, |
| LEADS_VIEW_ALL, |
| USER_MANAGE_TEAM, |
| MCP_MANAGE, |
| BRAND_ASSET_MANAGE, |
| }, |
| "employee": { |
| TASK_CREATE, |
| TASK_READ_OWN, |
| TASK_UPDATE_OWN, |
| AGENT_TRIGGER_KNOW, |
| STATS_VIEW_OWN, |
| }, |
| "sales": {TASK_CREATE, TASK_READ_OWN, TASK_READ_TEAM, TASK_UPDATE_OWN, AGENT_TRIGGER_MKT, LEADS_VIEW_ALL}, |
| "marketing": { |
| TASK_CREATE, |
| TASK_READ_OWN, |
| TASK_READ_TEAM, |
| TASK_UPDATE_OWN, |
| AGENT_TRIGGER_MKT, |
| AGENT_TRIGGER_KNOW, |
| STATS_VIEW_OWN, |
| LEADS_VIEW_ALL, |
| BRAND_ASSET_MANAGE, |
| INFO_REQUEST, |
| }, |
| } |
|
|
| |
| ALL_PERMISSIONS = [ |
| TASK_CREATE, |
| TASK_READ_TEAM, |
| TASK_READ_ALL, |
| TASK_UPDATE_ALL, |
| AGENT_TRIGGER_DEV, |
| AGENT_TRIGGER_MKT, |
| AGENT_TRIGGER_KNOW, |
| CODE_APPROVE, |
| CONTENT_PUBLISH, |
| CONTENT_REJECT, |
| INFO_REQUEST, |
| STATS_VIEW_TEAM, |
| STATS_VIEW_ALL, |
| LEADS_VIEW_ALL, |
| USER_MANAGE, |
| USER_MANAGE_TEAM, |
| MCP_MANAGE, |
| BRAND_ASSET_MANAGE, |
| ] |
|
|
|
|
| def get_role_permissions(role: str) -> set[str]: |
| """Returns the set of permissions for a given role (case-insensitive).""" |
| return ROLE_PERMISSIONS.get(role.lower(), set()) |
|
|
|
|
| def has_permission(user: dict, permission: str) -> bool: |
| """ |
| Checks if a user has a specific permission. |
| Args: |
| user: User dictionary (usually from profiles table) |
| permission: The permission scope to check (e.g. TASK_CREATE) |
| """ |
| if not user: |
| return False |
|
|
| |
| overrides = user.get("permission_overrides") or {} |
| if permission in overrides: |
| return bool(overrides[permission]) |
|
|
| |
| user_role = user.get("role", "viewer").lower() |
| role_perms = get_role_permissions(user_role) |
| return permission in role_perms |
|
|