Skip to content

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.

ComandoArgumentosDescripció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_adminVer abajoCrea 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ónRequeridoDescripción
--usernameUno de --username o --emailIdentificador de login
--emailUno de --username o --emailIdentificador de login
--passwordSíDebe cumplir la política de contraseñas
--first_nameSíNombre
--last_nameSíApellido
  • Crea IdentityUser (is_admin=True, usuario interno), LoginIdentifier, UserCredential y PasswordCredential.
  • 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ónRequeridoDefaultDescripción
cantidad (posicional)Sí—Cantidad de cuentas a crear (> 0)
--outputSí—Ruta del JSON de salida (crea el directorio si no existe)
--prefijoNopostulante.pruebaPrefijo del username (<prefijo>.<0001>.<hex6>)
--seedNo—Semilla de Faker/random para reproducir el lote
--password-fijaNo—Misma contraseña para todo el lote (mín. 8, una mayúscula, un dígito y uno de !@#$%*)
--confirmo-entorno-de-pruebaSí—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:

ComandoOpcionesModo 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_cron

backend-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_huerfanos

Datos 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ónDefaultDescripción
--convocatoriaPostulacionSeederConfig.CONVOCATORIA_ID_DEFAULTID de la convocatoria (debe existir)
--cantidad10Cantidad de postulaciones
--no-transactiondesactivadoSin transacción; ante error quedan datos parciales (depuración)
--quietdesactivadoSin logs detallados
--resumendesactivadoMuestra 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 con create_postulantes_prueba, copie el JSON al contenedor en esa ruta.

Salida:

  • Exporta un XLSX de credenciales en seeders_data/credenciales_conv{ID}.xlsx dentro 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:

  1. Inicia la revisión individual de cada postulación pendiente.
  2. Marca aleatoriamente (≈1 de cada 3) un respaldo requerido como "no cumple".
  3. 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:

  1. Asegura estaciones de examen habilitadas para toda la capacidad del recinto.
  2. Inicia cada sesión programada pendiente.
  3. Registra asistencia (probabilidad 90 % por postulante).
  4. Rinde el examen de cada asistente eligiendo opciones al azar.
  5. 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) ​

ScriptDescripción
simular_periodos_impugnacionPara 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_impugnadosMarca como impugnado el origen de cada resultado de fase que tenga una impugnación asociada.
clean_variables_plantillaElimina 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_impugnacion

Importació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
ComandoArgumentos
exportar_configuracion_sgccarpeta (posicional): carpeta de salida
importar_configuracion_sgccarpeta (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).

ComandoOpcionesDescripció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), --reemplazarImporta 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)BackendDescripción
generar_graficasAmbosGenera 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_graphqlSeleccionadorCompara 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.