feature/app-selector

This commit is contained in:
2026-05-26 16:59:32 -06:00
parent 904fa965c8
commit dbf68986da
34 changed files with 792 additions and 169 deletions

View File

@@ -104,18 +104,45 @@ async def get_my_permissions(
# Nota: bootstrap_super_admin ya hace commit e intenta no duplicar si el rol ya existe
permission_service.bootstrap_super_admin(user_id, company_id)
# 4. Obtener permisos finales
# 4. Sincronizar permisos de sistema desde claim de Keycloak (si viene en el token)
# El claim 'allowed_systems' puede contener ["fixed_asset"], ["inventory"], o ambos.
# Solo sincroniza si el claim está presente; si no, los permisos de sistema se asignan
# manualmente desde el panel de administración.
_VALID_SYSTEMS = frozenset(("fixed_asset", "inventory"))
keycloak_systems = current_user.get("allowed_systems") or []
if keycloak_systems:
for sys_code in keycloak_systems:
if sys_code in _VALID_SYSTEMS:
try:
permission_service.grant_direct_permission(
user_id=user_id,
company_id=company_id,
permission_code=f"system.{sys_code}.access",
assigned_by="keycloak_sync",
)
except ValueError:
# El permiso de sistema aún no existe en BD (sync pendiente); se ignora.
pass
# 5. Obtener permisos finales
permissions = permission_service.get_user_permissions(user_id, company_id)
# 5. Obtener roles
roles = permission_service.get_user_roles(user_id, company_id)
role_names = [role.name for role in roles]
# 6. Derivar sistemas permitidos desde los permisos de sistema
allowed_systems = [
sys for sys in ("inventory", "fixed_asset")
if f"system.{sys}.access" in permissions
]
return UserPermissionsResponse(
user_id=user_id,
company_id=company_id,
permissions=list(permissions),
roles=role_names,
allowed_systems=allowed_systems,
)

View File

@@ -60,6 +60,10 @@ class UserPermissionsResponse(BaseModel):
roles: List[str] = Field(
default_factory=list, description="Lista de nombres de roles del usuario"
)
allowed_systems: List[str] = Field(
default_factory=list,
description="Sistemas a los que el usuario tiene acceso: fixed_asset, inventory",
)
class UserCompanyRoleResponse(BaseModel):

View File

@@ -200,6 +200,14 @@ permissions_csv = [
("csv_upload.process", "Procesar Cargas Masivas CSV", "csv_upload", "process"),
]
# ============================================================================
# ACCESO A SISTEMAS (SCAII / SCAF)
# ============================================================================
permissions_system_access = [
("system.inventory.access", "Acceso al sistema Inventario (SCAII)", "system", "access"),
("system.fixed_asset.access", "Acceso al sistema Activo Fijo (SCAF)", "system", "access"),
]
def register_core_permissions():
"""Registra los permisos granulados de la aplicación según Sidebar."""
registry.register_many(permissions_audit)
@@ -222,6 +230,7 @@ def register_core_permissions():
registry.register_many(permissions_settings)
registry.register_many(permissions_help)
registry.register_many(permissions_csv)
registry.register_many(permissions_system_access)
# Ejecutar registro al importar este módulo
register_core_permissions()