# Catálogo de permisos y configuración de roles por defecto. # Este módulo es importado tanto por la data migration como por el signal de Organizacion, # por lo que NO debe importar modelos directamente al nivel de módulo. # --- CATÁLOGO DE PERMISOS --- # (codename, descripcion, modulo) PERMISSIONS_CATALOG = [ # Usuarios ('usuarios.view', 'Ver usuarios de la organización', 'usuarios'), ('usuarios.create', 'Crear usuarios en la organización', 'usuarios'), ('usuarios.edit', 'Modificar usuarios de la organización', 'usuarios'), ('usuarios.delete', 'Eliminar usuarios de la organización', 'usuarios'), ('usuarios.manage_roles', 'Asignar y revocar roles a usuarios', 'usuarios'), ('usuarios.change_password', 'Cambiar contraseña de otro usuario', 'usuarios'), # Pedimentos ('pedimentos.view', 'Ver pedimentos', 'pedimentos'), ('pedimentos.create', 'Crear e importar pedimentos', 'pedimentos'), ('pedimentos.edit', 'Modificar pedimentos', 'pedimentos'), ('pedimentos.delete', 'Eliminar pedimentos', 'pedimentos'), ('pedimentos.process', 'Procesar pedimentos contra VUCEM', 'pedimentos'), # Importadores ('importadores.view', 'Ver importadores', 'importadores'), ('importadores.create', 'Crear importadores', 'importadores'), ('importadores.edit', 'Modificar importadores', 'importadores'), ('importadores.delete', 'Eliminar importadores', 'importadores'), # Partidas ('partidas.view', 'Ver partidas', 'partidas'), ('partidas.create', 'Crear partidas', 'partidas'), ('partidas.edit', 'Modificar partidas', 'partidas'), ('partidas.delete', 'Eliminar partidas', 'partidas'), # Remesas ('remesas.view', 'Ver remesas', 'remesas'), # COVEs ('coves.view', 'Ver COVEs', 'coves'), ('coves.create', 'Crear COVEs', 'coves'), ('coves.edit', 'Modificar COVEs', 'coves'), ('coves.delete', 'Eliminar COVEs', 'coves'), # E-Documents ('edocuments.view', 'Ver E-Documents', 'edocuments'), ('edocuments.create', 'Crear E-Documents', 'edocuments'), ('edocuments.edit', 'Modificar E-Documents', 'edocuments'), ('edocuments.delete', 'Eliminar E-Documents', 'edocuments'), # Acuses ('acuses.view', 'Ver acuses', 'acuses'), # Documentos (expediente) ('documentos.view', 'Ver documentos del expediente', 'documentos'), ('documentos.upload', 'Cargar documentos', 'documentos'), ('documentos.download', 'Descargar documentos y ZIPs', 'documentos'), ('documentos.delete', 'Eliminar documentos del expediente', 'documentos'), # VUCEM ('vucem.view', 'Ver credenciales VUCEM', 'vucem'), ('vucem.manage', 'Gestionar credenciales VUCEM', 'vucem'), # Reportes ('reportes.view', 'Ver reportes y dashboard', 'reportes'), ('reportes.export', 'Exportar reportes a CSV/Excel', 'reportes'), # DataStage ('datastage.view', 'Ver DataStages', 'datastage'), ('datastage.create', 'Crear DataStages', 'datastage'), ('datastage.process', 'Procesar DataStages', 'datastage'), ('datastage.delete', 'Eliminar DataStages', 'datastage'), # Organización ('organizacion.view', 'Ver datos de la organización', 'organizacion'), ('organizacion.edit', 'Modificar datos de la organización', 'organizacion'), # Notificaciones ('notificaciones.view', 'Ver notificaciones propias', 'notificaciones'), ('notificaciones.receive', 'Recibir notificaciones automáticas de eventos', 'notificaciones'), # Cards / Analytics ('cards.view', 'Ver dashboard y analytics', 'cards'), # Auditoría ('auditoria.view', 'Ver estado y resultados de auditoría VUCEM', 'auditoria'), ('auditoria.process', 'Lanzar procesos de auditoría y reauditoría', 'auditoria'), ] # Conjuntos reutilizables para armar la matriz de permisos por rol _IMPORTADORES_FULL = ['importadores.view', 'importadores.create', 'importadores.edit', 'importadores.delete'] _PEDIMENTOS_FULL = ['pedimentos.view', 'pedimentos.create', 'pedimentos.edit', 'pedimentos.delete', 'pedimentos.process'] _PARTIDAS_FULL = ['partidas.view', 'partidas.create', 'partidas.edit', 'partidas.delete'] _COVES_FULL = ['coves.view', 'coves.create', 'coves.edit', 'coves.delete'] _EDOCUMENTS_FULL = ['edocuments.view', 'edocuments.create', 'edocuments.edit', 'edocuments.delete'] _DOCUMENTOS_FULL = ['documentos.view', 'documentos.upload', 'documentos.download', 'documentos.delete'] _VUCEM_FULL = ['vucem.view', 'vucem.manage'] _REPORTES_FULL = ['reportes.view', 'reportes.export'] _DATASTAGE_FULL = ['datastage.view', 'datastage.create', 'datastage.process'] # --- ROLES POR DEFECTO --- # Cada entrada: nombre → { descripcion, is_admin_role, permissions } DEFAULT_ROLES = { 'admin': { 'descripcion': 'Administrador de la organización', 'is_admin_role': True, 'permissions': [ 'usuarios.view', 'usuarios.create', 'usuarios.edit', 'usuarios.delete', 'usuarios.manage_roles', 'usuarios.change_password', *_PEDIMENTOS_FULL, *_PARTIDAS_FULL, 'remesas.view', *_COVES_FULL, *_EDOCUMENTS_FULL, 'acuses.view', *_DOCUMENTOS_FULL, *_VUCEM_FULL, *_IMPORTADORES_FULL, *_REPORTES_FULL, *_DATASTAGE_FULL, 'organizacion.view', 'organizacion.edit', 'notificaciones.view', 'notificaciones.receive', 'cards.view', 'auditoria.view', 'auditoria.process', ], }, 'developer': { 'descripcion': 'Desarrollador con acceso técnico avanzado', 'is_admin_role': False, 'permissions': [ 'usuarios.view', 'usuarios.create', *_PEDIMENTOS_FULL, *_PARTIDAS_FULL, 'remesas.view', *_COVES_FULL, *_EDOCUMENTS_FULL, 'acuses.view', *_DOCUMENTOS_FULL, *_VUCEM_FULL, *_IMPORTADORES_FULL, *_REPORTES_FULL, *_DATASTAGE_FULL, 'organizacion.view', 'notificaciones.view', 'notificaciones.receive', 'cards.view', 'auditoria.view', 'auditoria.process', ], }, 'Agente Aduanal': { 'descripcion': 'Agente aduanal operativo', 'is_admin_role': False, 'permissions': [ *_PEDIMENTOS_FULL, *_PARTIDAS_FULL, 'remesas.view', *_COVES_FULL, *_EDOCUMENTS_FULL, 'acuses.view', *_DOCUMENTOS_FULL, *_VUCEM_FULL, *_REPORTES_FULL, 'organizacion.view', 'notificaciones.view', 'notificaciones.receive', 'cards.view', 'auditoria.view', ], }, 'user': { 'descripcion': 'Usuario básico de la organización', 'is_admin_role': False, 'permissions': [ 'pedimentos.view', 'pedimentos.process', 'partidas.view', 'remesas.view', 'coves.view', 'edocuments.view', 'acuses.view', 'documentos.view', 'documentos.upload', 'documentos.download', 'reportes.view', 'datastage.view', 'notificaciones.view', 'notificaciones.receive', 'cards.view', ], }, 'Importador': { 'descripcion': 'Importador con acceso filtrado por RFC', 'is_admin_role': False, 'permissions': [ 'pedimentos.view', 'partidas.view', 'remesas.view', 'coves.view', 'edocuments.view', 'acuses.view', 'documentos.view', 'documentos.download', 'vucem.view', 'vucem.manage', 'reportes.view', 'notificaciones.view', 'notificaciones.receive', 'cards.view', ], }, } def crear_roles_para_organizacion(organizacion): """Crea los 5 roles por defecto para una organización, con sus permisos. Usa get_or_create — seguro de ejecutar múltiples veces.""" from api.rbac.models import RolePermission, OrganizationRole perms_map = {p.codename: p for p in RolePermission.objects.all()} for nombre, config in DEFAULT_ROLES.items(): role, created = OrganizationRole.objects.get_or_create( organizacion=organizacion, nombre=nombre, defaults={ 'descripcion': config['descripcion'], 'is_admin_role': config.get('is_admin_role', False), }, ) if created: role_perms = [perms_map[c] for c in config['permissions'] if c in perms_map] role.permissions.set(role_perms)