100 lines
8.3 KiB
Markdown
100 lines
8.3 KiB
Markdown
# Changelog Oficial — Admin Edu-Space (UniCABA)
|
|
|
|
Todas las modificaciones notables a este proyecto serán documentadas en este archivo.
|
|
El formato está basado en [Keep a Changelog](https://keepachangelog.com/es-ES/1.1.0/) y este proyecto se adhiere a [Semantic Versioning](https://semver.org/lang/es/).
|
|
|
|
---
|
|
|
|
## [Unreleased]
|
|
### Planificado (Fase 2 del Roadmap MVP)
|
|
- **Co-docencia en Cátedras:** Asignación de múltiples profesores (titular, adjunto, ayudante) a una misma comisión.
|
|
- **Matriz de Conflictos:** Detección de solapamiento físico, docente y control de aforo en tiempo real.
|
|
- **Regla de Restricción Diaria del Alumno:** Validación para impedir cursar dos materias regulares el mismo día, con motor de excepciones para cursos cortos o autorización de Bedelía.
|
|
- **Libro de Calificaciones (*Gradebook*):** Carga rápida de notas y seguimiento de regularidad.
|
|
- **Grilla Semanal Drag & Drop:** Asignación visual interactiva para la oficina de Bedelía.
|
|
|
|
---
|
|
|
|
## [2.2.0] - 2026-09-19
|
|
### Añadido
|
|
- **Herramienta de Purga y Reinicio de Datos Académicos (`reset_academic_data`):**
|
|
- Script CLI `backend/scripts/reset_academic_data.py` con argumentos de limpieza granular (`--all`, `--reservations`, `--classrooms`, `--careers`, `--yes`).
|
|
- Endpoint de API `POST /api/v1/admin/reset-academic-data` protegido por JWT (rol `admin`) con registro en `AuditLog`.
|
|
- Panel interactivo "Zona de Reinicio y Purga Académica" en `/admin/google_sheets_import` con checkboxes independientes para reservas, aulas, comisiones, asignaturas y carreras.
|
|
- Modal modal de confirmación con advertencias de seguridad para prevenir purgas accidentales.
|
|
- Preservación íntegra de usuarios del sistema, credenciales de acceso, roles RBAC y registros de auditoría.
|
|
- **Configuración Global Dinámica de Google Sheets:**
|
|
- Nuevo modelo `SystemSetting` (`backend/app/models/setting.py`) para almacenamiento persistente clave-valor en base de datos.
|
|
- Endpoints `GET /api/v1/admin/sheets-config` y `POST /api/v1/admin/sheets-config`.
|
|
- Normalizador de enlaces en `GoogleSheetsImporter` compatible con URLs compartidas de edición (`/spreadsheets/d/.../edit`) o enlaces publicados (`/pub?output=csv`).
|
|
- Interfaz web con formulario de edición de URL, botón de guardado en caliente, restauración a URL oficial predeterminada y acceso directo a Google Docs.
|
|
- **Visualización de Asignaturas Reales:**
|
|
- Tabla de asignaturas recientemente sincronizadas conectada a la base de datos real en lugar de datos de muestra (*mock*).
|
|
|
|
### Corregido
|
|
- **Fallo por Timeout en Google Sheets Academic Sync:**
|
|
- Solucionado el corte prematuro de conexión en el BFF (`frontend/src/services/apiClient.js`), aumentando el timeout base a 25s y el timeout específico de sincronización a 90s (anteriormente limitado a 5s en operaciones que toman ~6.7s).
|
|
- Eliminado el enmascaramiento silencioso de errores en el BFF, permitiendo reportar fallos reales o éxitos detallados (+carreras, +aulas, +materias, +comisiones, +reservas).
|
|
|
|
---
|
|
|
|
## [2.1.0] - 2026-09-19
|
|
### Añadido
|
|
- **Ficha Detallada de Reserva (`schedule.view_reservation`):**
|
|
- Implementación en BFF Node.js de la ruta `/schedule/view_reservation` (soportando parámetros `:id`, `?id=` o selección automática del primer registro).
|
|
- Vistas y controladores para modificar reservas con selectores en cascada (`/schedule/edit_reservation`).
|
|
- Endpoints de acción rápida en backend y BFF: `POST /schedule/confirm_reservation` y `POST /schedule/cancel_reservation`.
|
|
- Actualización de enlaces en `today.html`, `list.html`, `dashboard.html` y `view.html` para navegar directamente con el identificador de la reserva (`?id=...`).
|
|
- **Creación y Asociación de Comisiones a Asignaturas (`admin/commissions_list`):**
|
|
- Botón destacado `+ Nueva Comisión` en el encabezado y en el estado vacío de la tabla.
|
|
- Modal interactivo `#modalAddCommission` con selección obligatoria y clara de la **Asignatura / Materia Asociada** (`<select name="subject_id" required>`), mostrando código oficial, nombre y carrera.
|
|
- Campos completos de cursada: cuatrimestre (1C/2C/Anual), año lectivo, turno, docente a cargo, cupo máximo y días/horarios.
|
|
- Generación y configuración automática de enlace a Google Meet institucional cuando no se ingresa un enlace personalizado.
|
|
- Alerta de confirmación visual (`?created=1`) al registrar y vincular una comisión exitosamente.
|
|
- Tabla de comisiones actualizada con visualización explícita del código de materia, nombre y badge de carrera.
|
|
- **Enriquecimiento de la API REST:**
|
|
- Endpoint `GET /api/v1/reservations/<id>` ampliado con objetos relacionales anidados: `classroom` (código, edificio, piso, capacidad, descripción, virtualidad), `commission` (código, código compuesto, materia), `user` (docente, nombre, apellido, correo), duración en minutos y enlaces virtuales.
|
|
- Endpoint `POST /api/v1/admin/commissions` con validación estricta de existencia de asignatura y resolución inteligente de unicidad.
|
|
|
|
---
|
|
|
|
## [2.0.0] - 2026-09-18
|
|
### Añadido
|
|
- **Reingeniería de Arquitectura Fullstack (Desacople Monolito -> Backend + BFF):**
|
|
- Desacople completo del backend Python/Flask como una **API REST pura** bajo `/api/v1/` retornando exclusivamente JSON.
|
|
- Implementación del **Frontend BFF** en Node.js + Express con renderizado de servidor mediante Nunjucks.
|
|
- Autenticación sin estado (*Stateless*) basada en tokens JWT firmados con algoritmo HS256.
|
|
- Almacenamiento seguro del token de acceso en cookies del navegador con directivas `HttpOnly`, `SameSite=Lax` y `Secure`.
|
|
- Inyección transparente del token `Bearer` en peticiones internas mediante cliente Axios centralizado.
|
|
- **Dashboards Personalizados por Rol Institucional:**
|
|
- **Dashboard de Bedelía (`/dashboard?role=bedelia`):** Métricas operativas de campus físico y virtual, cartelera del día y panel de aprobación de solicitudes pendientes.
|
|
- **Dashboard de Docente (`/dashboard?role=docente`):** Sesiones del día con botones directos para ingresar a reuniones virtuales (Meet/Teams/Zoom) y formulario de solicitud de aulas.
|
|
- **Dashboard de Alumno (`/dashboard?role=alumno`):** Brújula de cursada *"¿Dónde curso hoy?"* con ubicación por piso/aula o enlace virtual, junto al calendario de exámenes y entregas.
|
|
- **Dashboard de Administrador (`/dashboard?role=admin`):** Cockpit institucional de capacidad, usuarios, auditoría RBAC y distribución de comisiones.
|
|
- Selector dinámico de vista previa de roles en el banner superior para administradores.
|
|
- **Cartelera del Día Interactiva (`/schedule/today_schedule`):**
|
|
- Grilla estructurada en bloques horarios (07:00 a 21:00 hs) con métricas en tiempo real de ocupación y reservas confirmadas/pendientes.
|
|
- Filtro dinámico para ocultar clases virtuales (`hide_virtual=1`) y segmentación por pisos o turnos.
|
|
- **Seguridad Enterprise (SecurityFilterChain):**
|
|
- Pipeline centralizado de cabeceras de blindaje OWASP (`nosniff`, `SAMEORIGIN`, `X-XSS-Protection`, `Strict-Transport-Security`).
|
|
- Rate limiting dinámico contra ataques de fuerza bruta en endpoints de autenticación.
|
|
|
|
### Corregido
|
|
- **Resolución de Colisión de Horarios en Clases Virtuales (Importador de Google Sheets):**
|
|
- Corrección de la búsqueda de duplicados en `sheets_importer.py` que limitaba indebidamente la unicidad a `(classroom_id, start_time, end_time)`.
|
|
- Habilitación de concurrencia ilimitada para el aula virtual (`Campus Virtual · VIRTUAL`) mediante discriminación por `commission_id`.
|
|
- El total de reservas registradas aumentó de **363 a 643** (incorporando **280 clases virtuales** que eran descartadas por falso conflicto).
|
|
- Generación y guardado automático de enlaces institucionales de Google Meet (`https://meet.google.com/edu-{materia}-{comision}`).
|
|
|
|
---
|
|
|
|
## [1.0.0] - 2026-09-04
|
|
### Añadido
|
|
- **Versión Monolítica Base (`legacy_admin-edu-space`):**
|
|
- Aplicación monolítica en Flask con plantillas Jinja2 y persistencia SQLAlchemy (SQLite / PostgreSQL).
|
|
- Modelado de datos inicial para sedes, aulas físicas, materias, comisiones, usuarios y reservas.
|
|
- Sistema de roles inicial (Admin, Bedelía, Docente, Alumno) basado en sesión tradicional de Flask-Login.
|
|
- Calendario de reservas mensual y semanal con FullCalendar.
|
|
- Prototipo experimental de algoritmo genético para optimización de ocupación áulica.
|
|
- Módulo de sincronización inicial con planillas de Google Sheets.
|