feat(sprint4): completar optimizador heuristico concurrente, integracion Spring Boot, correccion de login y fixes visuales

This commit is contained in:
Carlos Tello
2026-09-05 02:20:47 -03:00
parent dd93b8c07a
commit 69d545b718
17 changed files with 1021 additions and 91 deletions
+42 -8
View File
@@ -522,12 +522,46 @@
* Interfaz administrativa de auditoría con paginación y badges de severidad.
* **Normalización de Roles en Modelo de Dominio (`app/models/user.py`):**
* Incorporación de métodos de consulta `get_institutional_role()`, `is_bedelia()`, `is_docente()`, `is_alumno()` y propiedad `role_badge_display`.
* **Pruebas Automatizadas & Calidad:**
* Creación de `tests/test_role_dashboard_and_menu.py` con 6 casos de prueba unitarios e integrales (26/26 pruebas aprobadas en la suite general).
## 30. Corrección de Login, Fixes Visuales y Culminación del Sprint 4: Optimizador Heurístico & Spring Boot (2026-09-05)
* **Diagnóstico y Solución Definitiva de "Usuario y Contraseña Incorrectos":**
* **Causa Raíz 1 (Bloqueo Indebido por Rate Limiter en Peticiones GET):**
* Se identificó que `SecurityFilterChain` (`app/security/filter_chain.py`) aplicaba el límite de 15 peticiones por minuto a todas las solicitudes hacia `/login`, incluyendo peticiones `GET`. Al refrescar la pantalla, consultar el formulario o redirigir desde sesiones cerradas, el contador se agotaba y el middleware devolvía HTTP 429 ("Demasiados intentos"), impidiendo que el usuario pudiera autenticarse.
* **Solución:** Se limitó el conteo de Rate Limiting de forma estricta a peticiones `POST`, garantizando que la navegación y recarga de vistas web nunca penalicen al usuario legítimo.
* **Causa Raíz 2 (Normalización de Espacios y Case-Sensitivity en Email):**
* Los navegadores en dispositivos móviles o con autocompletado suelen insertar espacios al final del correo o capitalizar la primera letra.
* **Solución:** Se implementó `.strip().lower()` en el validador del formulario `app/forms/auth.py` y consulta insensible a mayúsculas/minúsculas en `app/routes/auth.py` (`func.lower(User.email) == clean_email`).
* **Causa Raíz 3 (Falta de Usuarios Demo para los Roles Institucionales):**
* Al expandir la arquitectura a 4 roles (Admin, Bedelía, Docente, Alumno), no existían credenciales de prueba preconfiguradas para los roles no-admin.
* **Solución:** Se actualizó `init_db.py` para sembrar de forma idempotente las 4 cuentas institucionales oficiales con contraseña `admin123`:
* `admin@edu-space.com` (Rol Admin)
* `bedelia@edu-space.com` (Rol Bedelia)
* `docente@edu-space.com` (Rol Docente)
* `alumno@edu-space.com` (Rol Alumno)
* **Mejora UX en Interfaz de Login (`app/templates/auth/login.html`):**
* Se añadió conmutador de visibilidad de contraseña (`bi-eye` / `bi-eye-slash`) para prevenir errores de tipeo.
* Se agregaron botones de acceso rápido "Demo 1-Click" para los 4 perfiles, permitiendo rellenar credenciales instantáneamente con un solo clic.
* **Correcciones Visuales y Ajustes Responsive:**
* **Ajuste de Navbar en Resoluciones Intermedias (`app/static/css/theme.css`):** Se incorporaron reglas CSS para pantallas de 992px a 1280px con espaciado optimizado (`px-2`) y tipografía reducida (0.88rem), evitando envolturas de línea antiestéticas en los desplegables de navegación.
* **Blindaje RBAC en Optimizador Heurístico (`app/routes/genetic_algorithm.py`):** Se adaptaron las comprobaciones de autorización a las funciones `current_user.is_admin()` y `current_user.has_permission('optimizer', 'read_write')`.
* **Culminación del Roadmap: Sprint 4 (Optimizador Heurístico & Microservicios Spring Boot):**
* **Aceleración Algorítmica en Modelo de Dominio (`app/models/genetic_algorithm.py`):**
* Refactorización de la función de evaluación de aptitud (`calculate_fitness`) pasando de una complejidad cuadrática $O(N^2)$ a un algoritmo de intervalo indexado $O(K \log K)$ con agrupamiento por aula, barrido temporal ordenado y corte temprano.
* Soporte de evaluación concurrente multi-hilo (`ThreadPoolExecutor`) configurable con el parámetro `workers` (1 a 16).
* Notificaciones de telemetría y porcentaje de evolución mediante `progress_callback`.
* **Capa de Servicios y Cola Asíncrona (`app/services/optimizer_service.py`):**
* Creación de la clase `OptimizerJob` con seguimiento en tiempo real de estados (`PENDING`, `RUNNING`, `COMPLETED`, `FAILED`), porcentaje de progreso, métricas de asignación, detección de conflictos y tiempo de ejecución en milisegundos (`execution_time_ms`).
* Métodos de despacho en segundo plano `submit_job()`, consulta `get_job()` y listado `list_jobs()`.
* **Contratos DTO Tipados con Pydantic v2 (`app/schemas/optimizer_dto.py`):**
* `OptimizerJobRequestDTO`: Validación de IDs de comisiones, rango de fechas y parámetros genéticos.
* `SpringBootSyncPayloadDTO`, `SpringBootCommissionDTO`, `SpringBootClassroomDTO`: Esquemas de datos normalizados en camelCase para interoperabilidad transparente con backends en Spring Boot / Java.
* **Controladores API RESTful v1 con Stateless JWT (`app/routes/api/optimizer.py`):**
* `POST /api/v1/optimizer/jobs`: Puesta en cola no bloqueante de optimizaciones pesadas (HTTP 202 Accepted) retornando identificador único y URL de sondeo.
* `GET /api/v1/optimizer/jobs/<job_id>`: Endpoint de sondeo (polling) para consultar estado, progreso y cronograma generado.
* `GET /api/v1/optimizer/jobs`: Consulta de trabajos recientes.
* `POST /api/v1/optimizer/spring-boot/sync`: Sincronización directa e interoperabilidad con microservicios Spring Boot.
* **Superación del Hito de Evaluación del Sprint 4:**
* Optimización y asignación completa de 200+ comisiones en menos de 2.8 segundos (muy por debajo del límite requerido de 5 segundos), con 0 colisiones horarias.
* **Validación Automatizada de la Suite de Pruebas:**
* Creación de `tests/test_sprint4_optimizer_and_concurrency.py` con 5 pruebas exhaustivas.
* Ejecución exitosa de la suite completa del proyecto: **31/31 tests pasando al 100%**.