Appearance
Scripts útiles de los backends
Comandos de gestión y scripts incluidos en auth-backend y backend-seleccion-postulantes. Se agrupan según su propósito:
- Arranque y configuración: se ejecutan en cada despliegue o una única vez.
- Datos de prueba y emulaciones: solo para el entorno de test.
- Importación / exportación: migración de datos y configuración.
- Mantenimiento y servicios: tareas periódicas.
- Utilidades de desarrollo: diagramas y auditorías.
Ejecución en los contenedores
Desde el directorio del stack en el host (${DEPLOY_BASE_PATH}/idp o ${DEPLOY_BASE_PATH}/seleccionador):
sh
# Comando de gestión de Django
docker compose exec auth-backend python manage.py <comando> [opciones]
docker compose exec backend-seleccion-postulantes python manage.py <comando> [opciones]
# Script de la carpeta scripts/ (django-extensions runscript)
docker compose exec backend-seleccion-postulantes \
python manage.py runscript <script> [--script-args <arg1> <arg2> ...]Los scripts de scripts/ definen una función run() y se ejecutan con runscript (django-extensions, incluido en requirements.prod.txt); no funcionan con python scripts/<script>.py.
Para copiar archivos generados entre el contenedor y el host:
sh
docker compose cp backend-seleccion-postulantes:/app/<ruta> ./<destino>
docker compose cp ./<origen> backend-seleccion-postulantes:/app/<ruta>Requisito: SYSTEM_STATUS
En ambos backends, manage.py lee SYSTEM_STATUS del .env (por defecto False). Si es False, solo se permiten check, runserver, help, version y shell; cualquier otro comando (incluidos migrate, runscript y todos los de esta página) imprime [STANDBY] '<comando>' omitido y termina sin hacer nada.
auth-backend
Arranque y configuración
Los tres primeros se ejecutan automáticamente en entrypoint.sh en cada arranque del contenedor.
| Comando | Argumentos | Descripción |
|---|---|---|
rotate_signing_keys | — | Ejecuta la rotación del ciclo de vida de las claves de firma de tokens. Transaccional. |
create_default_scopes | — | Crea los scopes OAuth2 definidos en DEFAULT_SCOPES que no existan. No modifica los existentes. |
create_claim_definitions | — | Crea/activa las definiciones de claims de ENABLED_PRESET_CLAIM_DEFINITIONS y desactiva las que no estén en esa lista. |
create_super_admin | Ver abajo | Crea un usuario administrador interno. Se usa una vez al inicializar un entorno. |
create_super_admin
sh
docker compose exec auth-backend python manage.py create_super_admin \
--username <usuario> \
--password '<contraseña>' \
--first_name <nombre> \
--last_name <apellido>| Opción | Requerido | Descripción |
|---|---|---|
--username | Uno de --username o --email | Identificador de login |
--email | Uno de --username o --email | Identificador de login |
--password | Sí | Debe cumplir la política de contraseñas |
--first_name | Sí | Nombre |
--last_name | Sí | Apellido |
- Crea
IdentityUser(is_admin=True, usuario interno),LoginIdentifier,UserCredentialyPasswordCredential. - Si el identificador ya existe, no crea nada.
WARNING
La contraseña queda en el historial de la shell. Cámbiela tras el primer ingreso o limpie el historial.
Datos de prueba
create_postulantes_prueba
Solo para entornos de prueba. Crea N cuentas de postulante externo en el IDP y escribe un JSON con sus datos (incluida la contraseña en texto plano), que sirve como fuente de identidades para el seeder de postulaciones del backend seleccionador.
sh
docker compose exec auth-backend python manage.py create_postulantes_prueba 500 \
--output /app/private_files/seeders/postulantes_prueba.json \
--password-fija 'Prueba123!' \
--confirmo-entorno-de-prueba| Argumento / opción | Requerido | Default | Descripción |
|---|---|---|---|
cantidad (posicional) | Sí | — | Cantidad de cuentas a crear (> 0) |
--output | Sí | — | Ruta del JSON de salida (crea el directorio si no existe) |
--prefijo | No | postulante.prueba | Prefijo del username (<prefijo>.<0001>.<hex6>) |
--seed | No | — | Semilla de Faker/random para reproducir el lote |
--password-fija | No | — | Misma contraseña para todo el lote (mín. 8, una mayúscula, un dígito y uno de !@#$%*) |
--confirmo-entorno-de-prueba | Sí | — | Confirmación explícita; sin ella el comando falla |
Crea por cada cuenta: IdentityUser, LoginIdentifier (username), atributos de documento de identidad, tipo de documento y fecha de nacimiento, UserCredential y PasswordCredential. El email generado usa el dominio postulante-prueba.eje.gob.bo.
TIP
Escriba el JSON dentro de /app/private_files/ para que quede en el volumen storage/private del host; fuera de los volúmenes se pierde al recrear el contenedor.
Mantenimiento y servicios
Envío de notificaciones pendientes (incluye seguimiento de Ciudadanía Digital) mediante EnvioNotificacionDispatcher:
| Comando | Opciones | Modo de uso |
|---|---|---|
notificacion_sender_cron | — | Procesa una vez y termina. Pensado para cron / programador de tareas. |
notification_sender_service | --interval N (default 30 s) | Bucle continuo; termina ordenadamente con SIGTERM/SIGINT. Pensado como servicio de larga duración. |
sh
docker compose exec auth-backend python manage.py notificacion_sender_cronbackend-seleccion-postulantes
Arranque
entrypoint.sh lanza en segundo plano un bucle que ejecuta cada 30 minutos:
limpiar_segmentos_huerfanos
Elimina los segmentos de subidas de documentos abandonadas a mitad de carga (usuario que cierra la pestaña o cancela): selecciona DocumentoUsuario sin archivo final cuyo último segmento tenga más de 3 horas y borra sus segmentos. Sin argumentos.
sh
docker compose exec backend-seleccion-postulantes python manage.py limpiar_segmentos_huerfanosDatos de prueba y emulaciones
Flujo típico para preparar una convocatoria completa en el entorno de test:
Los emuladores procesan lo que esté pendiente en el momento en que se ejecutan, por lo que la convocatoria debe estar en la fase correspondiente, con comisión conformada y sesión activa.
create_empty_convocatoria (runscript)
Crea una convocatoria de prueba usando seeders/convocatorias/main.py (crear_convocatoria_prueba).
sh
docker compose exec backend-seleccion-postulantes \
python manage.py runscript create_empty_convocatoria
# Con argumentos opcionales (posicionales)
docker compose exec backend-seleccion-postulantes \
python manage.py runscript create_empty_convocatoria \
--script-args <area_jurisdiccional> <caracter> <no_usado> <forma_presentacion>Sin argumentos usa los valores por defecto de crear_convocatoria_prueba.
seeder
Genera postulaciones de prueba (usuarios, perfiles, CV, documentos y postulaciones) para una convocatoria existente.
sh
docker compose exec backend-seleccion-postulantes \
python manage.py seeder --convocatoria 109 --cantidad 50| Opción | Default | Descripción |
|---|---|---|
--convocatoria | PostulacionSeederConfig.CONVOCATORIA_ID_DEFAULT | ID de la convocatoria (debe existir) |
--cantidad | 10 | Cantidad de postulaciones |
--no-transaction | desactivado | Sin transacción; ante error quedan datos parciales (depuración) |
--quiet | desactivado | Sin logs detallados |
--resumen | desactivado | Muestra el resumen de postulaciones existentes y termina |
Requisitos:
- Catálogos cargados (provincias, municipios, etc.) y la convocatoria creada.
- Archivo de identidades
seeders_data/test_500_1.json(relativo a/app). Para usar cuentas generadas concreate_postulantes_prueba, copie el JSON al contenedor en esa ruta.
Salida:
- Exporta un XLSX de credenciales en
seeders_data/credenciales_conv{ID}.xlsxdentro del almacenamiento público (PUBLIC_MEDIA_ROOT). Se sobrescribe en cada ejecución para la misma convocatoria.
DANGER
El XLSX contiene contraseñas en texto plano y se guarda en el almacenamiento público, que nginx sirve en /files/. No ejecute el seeder en producción y elimine el archivo cuando ya no sea necesario.
emular_dmh
Emula la Revisión de Documentación Mínima Habilitante de una comisión.
sh
docker compose exec backend-seleccion-postulantes \
python manage.py emular_dmh --comision <ID>Por cada miembro responsable (o subcomisión) con postulaciones asignadas en la sesión activa:
- Inicia la revisión individual de cada postulación pendiente.
- Marca aleatoriamente (≈1 de cada 3) un respaldo requerido como "no cumple".
- Finaliza la revisión y solicita la aprobación de los miembros participantes.
Las aprobaciones usan un cliente simulado (FakeIDPApprovalClient) que no llama a servicios externos y las da por aprobadas.
emular_cme
Emula la Calificación de Méritos de una comisión. Mismo flujo que emular_dmh: por cada postulación pendiente califica las acreditaciones curriculares considerando la cantidad declarada y descartando aleatoriamente algunas (≈1 de cada 3), finaliza la calificación y solicita aprobaciones con el cliente simulado.
sh
docker compose exec backend-seleccion-postulantes \
python manage.py emular_cme --comision <ID>emular_rendicion_examen
Emula la rendición del examen de admisión en línea.
sh
docker compose exec backend-seleccion-postulantes \
python manage.py emular_rendicion_examen --comision <ID>Requisitos: la comisión debe ser de recepción de examen de admisión y la programación del examen debe estar en modalidad en línea; de lo contrario el comando falla.
Por cada recinto habilitado con miembro responsable:
- Asegura estaciones de examen habilitadas para toda la capacidad del recinto.
- Inicia cada sesión programada pendiente.
- Registra asistencia (probabilidad 90 % por postulante).
- Rinde el examen de cada asistente eligiendo opciones al azar.
- Fuerza el fin de la rendición, actualiza las rendiciones finalizadas y cierra la sesión.
No pasa por el registro JWT de estaciones ni por sesiones de comisión.
Mutaciones GraphQL de seeders
El esquema de administración expone seedConvocatoriaPrueba y seedPostulacionesPrueba(convocatoria, cantidad), que reutilizan la misma lógica. Solo funcionan con DEBUG=True y no requieren sesión. seedPostulacionesPrueba se ejecuta en un hilo en segundo plano y devuelve de inmediato la URL del XLSX de credenciales.
WARNING
Mantenga DEBUG=False en producción: con DEBUG=True estas mutaciones quedan accesibles sin autenticación.
Correcciones de datos (runscript)
| Script | Descripción |
|---|---|
simular_periodos_impugnacion | Para cada informe de cierre de fase con resultados publicados (en fases que admiten impugnación) sin periodo de impugnación, crea uno con recepción abierta hasta 30 días desde ahora. Completa la fecha de publicación si falta. |
set_origenes_impugnados | Marca como impugnado el origen de cada resultado de fase que tenga una impugnación asociada. |
clean_variables_plantilla | Elimina las variables de plantillas SGC cuya clave no esté en CLAVES_VAR_CHOICES. |
sh
docker compose exec backend-seleccion-postulantes \
python manage.py runscript simular_periodos_impugnacionImportación / exportación
Configuración SGC
Exporta e importa la configuración del Sistema de Gestión de Calidad (procedimientos, registros/plantillas, formatos de CV, versiones, plazos, comisiones y parámetros). Útil para trasladar la configuración entre entornos.
sh
# Exportar
docker compose exec backend-seleccion-postulantes \
python manage.py exportar_configuracion_sgc /app/private_files/sgc_export
# Importar (probar primero con --dry-run)
docker compose exec backend-seleccion-postulantes \
python manage.py importar_configuracion_sgc /app/private_files/sgc_export \
--usuario <email> --dry-run| Comando | Argumentos |
|---|---|
exportar_configuracion_sgc | carpeta (posicional): carpeta de salida |
importar_configuracion_sgc | carpeta (posicional); --usuario <email> (requerido, UsuarioBase que registra la importación); --dry-run (revierte todo al final) |
La importación es transaccional: crea versiones nuevas y pasa las vigentes al historial. En --dry-run o ante error, elimina además los archivos subidos (el rollback de base de datos no cubre el almacenamiento).
Para mover la exportación entre entornos, cópiela al host con docker compose cp (o tómela de storage/private/ si se escribió en /app/private_files).
Datos históricos
Migran convocatorias de sistemas anteriores desde backups SQL Server (configuración de conexión en datos_historicos/services/conexion_backups).
| Comando | Opciones | Descripción |
|---|---|---|
comparar_esquemas | — | Analiza los esquemas de las bases históricas y escribe el resultado en datos_historicos/analisis_esquema |
exportar_datos_historicos | --familia F (por defecto ambas), --anio A (requiere --familia), --salida DIR (default private_files/exports_json) | Lee las bases de backup y escribe un JSON por convocatoria. No modifica la base de Django |
importar_datos_historicos | --archivo FILE, --carpeta DIR (default private_files/exports_json), --reemplazar | Importa los JSON. Sin --reemplazar omite convocatorias ya importadas |
DANGER
importar_datos_historicos --reemplazar borra en cascada la convocatoria existente antes de importarla.
Utilidades de desarrollo
Pensadas para el entorno local de desarrollo, no para los contenedores.
| Script (runscript) | Backend | Descripción |
|---|---|---|
generar_graficas | Ambos | Genera diagramas de modelos (graph_models) por app y globales en diagramas/. Instala graphviz con sudo apt-get, por lo que no funciona dentro del contenedor. |
auditar_types_graphql | Seleccionador | Compara lo que expone un schema GraphQL con lo que consulta su frontend y genera un reporte Markdown. |
sh
python manage.py runscript auditar_types_graphql \
--script-args <schema> <carpeta_front> <salida.md><schema>: admin, comision, postulante o estacion_examen.
