# Resumen de Cambios - Sesión de Desarrollo (Rama `dev`) **Fecha:** 2026-09-02 / 2026-09-03 **Proyecto:** Admin Edu-Space (Flask + PostgreSQL) **Rama:** `dev` --- ## 1. Auditoría Git y Puesta en Producción * **Informe Técnico Completo (`DEPLOYMENT_AUDIT.md`):** * Análisis de ramas locales y remotas (`main`, `dev`, `origin/planning`, `origin/commissions`, `origin/spanish`). * Manual de despliegue en producción con arquitectura WSGI (Gunicorn), Nginx como proxy inverso, Systemd unit y contenedorización Docker / Docker Compose. * **Archivos Base:** * Creación de `.env.example` con todas las variables requeridas (PostgreSQL, Flask, Secret Key, Babel). * Creación de `init_db.py` para bootstrap inicial seguro de base de datos y usuario administrador por defecto (`admin@edu-space.com` / `admin123`). --- ## 2. Base de Datos y Modelos * **Preferencia de Idioma Persistente:** * Migración en PostgreSQL agregando la columna `preferred_language VARCHAR(10)` a la tabla `users`. * Actualización del modelo `User` en `app/models/user.py` con el campo `preferred_language`. --- ## 3. Implementación de Vistas y Plantillas Faltantes * **Perfil de Usuario (`app/templates/auth/profile.html`):** * Vista completa con datos del usuario, rol, estado, fecha de registro y reservas recientes. * Formulario interactivo para configurar la **Preferencia de Idioma** (*Detectar automáticamente del navegador*, *Español*, *English*). * **Cambio de Contraseña (`app/templates/auth/change_password.html`):** * Formulario seguro para actualización de credenciales. * **Manejo de Errores (`app/templates/auth/403.html`):** * Pantalla de error 403 Forbidden estilizada. --- ## 4. Correcciones de UX y Bugs de Rutas * **Navbar Limpio (`app/templates/base.html`):** * Eliminación del bloque duplicado del menú de usuario `System Administrator`. * **Corrección de BuildError en Comisiones:** * En `app/routes/classrooms.py`, se agregó el alias de ruta `@classrooms_bp.route('/', endpoint='index')` para resolver enlaces a `classrooms.index`. * En `app/templates/schedule/commissions.html`, se reemplazó el filtro inválido de Django `truncatewords(20)` por el filtro estándar de Jinja2 `truncate(100)`. * **Corrección Visual en `/genetic-optimizer` (`app/templates/genetic_optimizer.html`):** * Se agregó el espaciado `pt-5 mt-4` evitando que la barra de navegación fija superior (`fixed-top`) se monte sobre el contenido. * Rediseño de tarjeta hero con contraste óptimo y reemplazo de iconos faltantes por Bootstrap Icons (`bi bi-...`). * **Corrección en Calendario (`app/templates/schedule/calendar.html`):** * Inclusión de contenedor con espaciado superior y bundle de localización `locales-all.min.js` para FullCalendar. --- ## 5. Internacionalización (i18n) y Localización al Español * **Configuración del Motor Babel (`config/config.py` y `babel.cfg`):** * Configuración de `BABEL_TRANSLATION_DIRECTORIES` con ruta absoluta. * Actualización del método de extracción Jinja2 en `babel.cfg`. * **Formularios con Traducción Lazy (`lazy_gettext`):** * `app/forms/auth.py` (`LoginForm`). * `app/forms/classroom.py` (`ClassroomForm`, `ClassroomResourceForm`). * `app/forms/reservation.py` (`ReservationForm`). * **Traducción Integral de Plantillas:** * `app/templates/auth/login.html`: Pantalla de login traducida y con selector de idioma visible. * `app/templates/dashboard.html`: Todas las tarjetas estadísticas, acciones rápidas y tablas. * `app/templates/classrooms/list.html` y `add.html`: Filtros, estados vacíos, cabeceras y formularios. * `app/templates/schedule/today.html`: Horario del día, métricas y botones. * `app/templates/schedule/calendar.html`: Vistas, leyendas y eventos. * `app/templates/genetic_optimizer.html`: Estado del algoritmo y controles. * `app/templates/partials/language_switcher.html`: Muestra "Español" en lugar de "Spanish". * **Compilación de Catálogos:** * Compilación binaria de `messages.po` a `messages.mo` en `translations/es/` y `translations/en/` con 0 mensajes pendientes. --- ## 6. Lógica de Detección y Precedencia de Idiomas En `app/__init__.py` (`get_locale()`): 1. **Parámetro URL (`?lang=`):** Máxima prioridad para cambio explícito. 2. **Preferencia en Perfil del Usuario (`current_user.preferred_language`):** Sobrescribe la configuración del navegador en toda la sesión si el usuario está autenticado. 3. **Preferencia de Sesión (`session['language']`):** Cambio manual mediante el dropdown. 4. **Detección Automática del Navegador (`request.accept_languages.best_match()`):** Valor por defecto para visitantes no autenticados y pantalla de login. * Al cerrar sesión (`logout`), se limpia la sesión para que el login use el navegador. * Al cambiar el idioma en el selector siendo usuario autenticado, se sincroniza automáticamente con su perfil en base de datos. --- ## 7. Configuración del Entorno de Desarrollo * Se creó `.vscode/settings.json` apuntando al intérprete del entorno virtual (`venv\Scripts\python.exe`), solucionando falsos positivos del analizador estático para `flask_wtf` y `flask_babel`.