85 lines
5.1 KiB
Markdown
85 lines
5.1 KiB
Markdown
# 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`.
|