453 lines
32 KiB
Markdown
453 lines
32 KiB
Markdown
# Panel de Administración Edu-Space (UniCABA)
|
|
|
|
Plataforma integral de gestión áulica, asignación de espacios, control de horarios y reservas académicas para la **Universidad de la Ciudad de Buenos Aires (UniCABA)**, desarrollada con **Python / Flask**, **SQLAlchemy**, **PostgreSQL** y **Bootstrap 5**.
|
|
|
|
---
|
|
|
|
## 🏛️ Sede Institucional y Ubicaciones
|
|
* **Sede Central UniCABA:** Tte. Gral. Juan Domingo Perón 802, Ciudad Autónoma de Buenos Aires (CABA) — Aulas de grado, auditorio principal y laboratorios distribuidos desde Planta Baja (Piso 0) hasta el 4.° Piso.
|
|
* **Campus Virtual:** Espacio áulico digital integrado (Microsoft Teams / Moodle) configurado con **capacidad ilimitada ($\infty$)**.
|
|
|
|
---
|
|
|
|
## ✨ Características Principales
|
|
|
|
### 🛡️ 1. Control de Accesos RBAC Granular (Matriz estilo FortiGate)
|
|
* **Gestión por Módulos:** Permisos independientes por cada área del sistema:
|
|
1. **Aulas y Espacios:** Creación, edición, capacidad y estado de aulas físicas y virtuales.
|
|
2. **Edificios y Sedes:** Administración de sedes, pisos y arquitectura edilicia.
|
|
3. **Reservas de Aulas:** Solicitud, aprobación, confirmación y cancelación.
|
|
4. **Cartelera y Cronograma:** Calendario interactivo, visualización diaria y comisiones.
|
|
5. **Gestión Académica:** Carreras, asignaturas, códigos y comisiones.
|
|
6. **Sincronización Sheets:** Importador y sincronizador de Google Sheets.
|
|
7. **Optimizador IA:** Algoritmo genético de distribución y resolución de conflictos.
|
|
8. **Usuarios y Accesos RBAC:** Cuentas, roles y matriz de permisos.
|
|
* **Niveles de Permiso Granulares:** `Ninguno`, `Solo Lectura` o `Lectura y Escritura`.
|
|
* **Controles Rápidos:** Botón *"Establecer Todos"* para configuración masiva inmediata.
|
|
* **Roles Predefinidos:** `Admin` (control total), `Docente`, `Operador` y `Consulta`.
|
|
|
|
### 📊 2. Sincronización e Importación desde Google Sheets
|
|
* Integración directa con la cartelera académica de UniCABA en Google Sheets.
|
|
* Extracción e importación normalizada de los 5 campos clave:
|
|
* **Código Académico:** Códigos reales de asignatura (ej. `INGA0003`, `ASIG00165`).
|
|
* **Asignatura:** Nombre oficial de la materia.
|
|
* **Aula:** Mapeo a aulas físicas (PB a 4.° piso) o aula `VIRTUAL` ($\infty$).
|
|
* **Carrera:** Normalización y vinculación relacional con entidades de carrera.
|
|
* **Horarios y Turnos:** Detección automática de franjas horarias y delimitadores de bloque (`Turno Mañana` y `Turno Tarde / Vespertino`).
|
|
|
|
### 📅 3. Calendario Interactivo de Reservas (FullCalendar)
|
|
* **Visualización Semanal, Mensual y Diaria:** Grilla ágil de alta legibilidad con jerarquía visual:
|
|
* Asignatura destacada en tipografía grande y negrita.
|
|
* Badges con código de materia, aula asignada, turno y franja horaria.
|
|
* **Filtros Dinámicos Combinables:**
|
|
* Filtrar por **Aula**.
|
|
* Filtrar por **Materia / Asignatura**.
|
|
* Filtrar por **Carrera**.
|
|
* Filtrar por **Turno** (`Turno Mañana` / `Turno Tarde`).
|
|
* Filtrar por **Piso / Planta** (`Planta Baja`, `Piso 1`, `Piso 2`, `Piso 3`, `Piso 4`).
|
|
* **Switch "Ocultar Aulas Virtuales":** Aísla la ocupación física real en el edificio central excluyendo los eventos virtuales de capacidad infinita.
|
|
* **Ficha Modal Instantánea:** Vista previa detallada al hacer clic en cualquier evento.
|
|
|
|
### 📋 4. Cartelera del Día y Listado de Reservas
|
|
* **Cartelera del Día (`/schedule/today`):**
|
|
* **Vista Cronológica (Timeline):** Bloques horarios de 07:00 a 22:00 hs con indicador de ocupación.
|
|
* **Vista en Tabla:** Lista ordenada con acciones rápidas y detalles de comisión.
|
|
* Filtros directos por piso, turno y switch para ocultar virtuales.
|
|
* **Listado Paginado de Reservas (`/schedule/list`):**
|
|
* Paginación de 20 registros por página preservando filtros aplicados.
|
|
* Búsqueda por texto, estado (`Confirmada`, `Pendiente`, `Cancelada`), rango de fechas y piso.
|
|
|
|
### 🏫 5. Gestión de Aulas con Capacidad Infinita ($\infty$)
|
|
* Soporte nativo para el símbolo **`∞`** o `0` para designar aulas virtuales o espacios sin aforo restringido.
|
|
* Botón de un solo clic `Ilimitada (∞)` en formularios de alta y edición con leyendas explicativas.
|
|
* Badges distintivos `∞ Ilimitada` en listados, tarjetas y fichas técnicas.
|
|
|
|
### 🤖 6. Optimizador Inteligente de Aulas (Algoritmo Genético)
|
|
* Motor de optimización heurística para asignación automática de aulas a comisiones.
|
|
* Pondera capacidad requerida vs. capacidad de aula, equipamiento tecnológico y minimización de desplazamientos entre pisos.
|
|
|
|
### 🎨 7. Experiencia de Usuario, Temas y Localización
|
|
* **Tema Oscuro / Claro:** Alternador con botón flotante y persistencia en `localStorage` y perfil de usuario.
|
|
* **Soporte Multilingüe:** Internacionalización integral (Español e Inglés) compilada con GNU gettext (`pybabel`).
|
|
* **Tarjetas Estadísticas Interactivas:** Accesos directos rápidos desde el panel general hacia las distintas secciones operativas.
|
|
|
|
### 🏛️ 8. Sistema Integral de Gestión Institucional (8 Módulos)
|
|
El menú desplegable **Gestión** en la barra de navegación organiza las áreas operativas de la universidad:
|
|
* **Espacios e Infraestructura:**
|
|
* **Edificios y Sedes (`/buildings/list`):** Administración de edificios físicos, arquitectura y estado edilicio.
|
|
* **Aulas Presenciales (`/classrooms/list?view_mode=physical`):** Catálogo de aulas físicas por piso, capacidades y zócalos compactos con métricas de ocupación en tiempo real (día, semana, mes).
|
|
* **Aulas Virtuales con Reunión (`/classrooms/list?view_mode=virtual`):** Campus Virtual con salas a demanda agrupadas por comisión, capacidad ilimitada ($\infty$) y enlaces directos de acceso a videollamadas (Zoom, Google Meet, Microsoft Teams).
|
|
* **Gestión de Ocupación y Métricas (`/admin/occupancy-metrics`):** Dashboard analítico de tasas de ocupación horaria (día, semana, mes), horas pico, distribución por turno y comparativa física vs. virtual.
|
|
* **Gestión Académica:**
|
|
* **Carreras (`/admin/careers`):** ABM de carreras universitarias y planes de estudio con contador de asignaturas y comisiones activas.
|
|
* **Asignaturas (`/admin/subjects`):** Catálogo institucional de materias con créditos, departamentos y filtros por carrera y estado.
|
|
* **Comisiones y Cursadas (`/schedule/commissions`):** Gestión de cursadas, turnos, docentes, enlaces virtuales e hitos de evaluación.
|
|
* **Ciclo Lectivo (`/admin/academic-terms`):** Modelo y panel de administración de períodos académicos, cuatrimestres y activación del ciclo lectivo en curso.
|
|
* **Administración & Seguridad:**
|
|
* **Usuarios y Roles RBAC:** Cuentas, asignación de permisos matriciales y auditoría.
|
|
* **Tipificaciones de Hitos:** Catálogo de tipos de hitos de evaluación académica.
|
|
* **Sincronización Sheets:** Integración con Google Sheets para actualización en lote.
|
|
|
|
### 🔀 9. Selector de Vista Universal (Tabla / Grilla vs. Tarjetas / Mosaico)
|
|
La plataforma implementa una arquitectura desacoplada de visualización (`app/static/js/view_switcher.js` y `app/templates/partials/view_switcher.html`) que permite al usuario alternar instantáneamente entre diferentes formatos de presentación sin modificar los datos ni perder los filtros o búsquedas activas:
|
|
* **Vista de Tabla / Grilla (`▤ Tabla`):**
|
|
* Presentación tabular en filas y columnas de alta densidad informativa.
|
|
* Muestra múltiples atributos simultáneamente (edificio, piso, aforo, métricas de ocupación, estado, acciones).
|
|
* Ideal para consulta y comparación masiva de registros.
|
|
* **Vista de Tarjetas / Mosaico (`▦ Tarjetas`):**
|
|
* Presentación visual en tarjetas independientes distribuidas automáticamente según el ancho de pantalla (1 a 4 columnas).
|
|
* Enfoque en la información destacada con badges semánticos, barras de uso y botones de acceso rápido.
|
|
* **Características del Selector:**
|
|
* **Cambio Inmediato:** Conmutación instantánea en el cliente sin recarga de página (`d-none` / manipulación de DOM).
|
|
* **Persistencia de Preferencia:** Memorización automática mediante `localStorage` para conservar la elección del usuario en futuras visitas.
|
|
* **Preservación de Filtros:** Inyección automática del parámetro `display` en formularios y sincronización de URL sin recarga (`history.replaceState`).
|
|
* **Arquitectura Extensible:** Permite registrar futuras vistas (kanban, calendario, compacta) mediante atributos `data-view` y `data-view-container` sin alterar la lógica de negocio.
|
|
|
|
### 🧭 10. Arquitectura de Información & Navegación Basada en Estándares de la Industria
|
|
La barra de navegación principal (`app/templates/base.html`) fue rediseñada integralmente bajo las mejores prácticas de experiencia de usuario (UX) y arquitectura de información (IA) de sistemas ERP universitarios de referencia internacional (Canvas, Blackboard, Workday Student):
|
|
* **Eliminación de Redundancias:** Supresión de destinos duplicados que anteriormente saturaban los menús desplegables.
|
|
* **Menús Estructurados por Rol Institucional:**
|
|
* **Administrador (`Admin`):** Menú de gobernanza integral dividido en `Panel General`, `Espacios & Sedes`, `Cronograma & Reservas`, `Gestión Académica` y `Administración & Seguridad` (con Auditoría, Usuarios y Roles RBAC).
|
|
* **Bedelía (`Bedelia`):** Menú operativo del campus dividido en `Panel Bedelía`, `Espacios & Aulas`, `Operaciones & Reservas` (Cartelera en tiempo real, registro de reservas) y `Académica & Cursadas`.
|
|
* **Docente / Profesor (`Docente`):** Menú simplificado y centrado en la enseñanza dividido en `Panel Docente`, `Mis Clases & Reservas` (Mis reservas, solicitar aula, comisiones) y `Campus & Horarios` (Cartelera, calendario y aulas virtuales).
|
|
* **Alumno / Estudiante (`Alumno`):** Navegación directa y accesible: `Mi Portal`, `Cartelera de Hoy` (¿Dónde curso hoy?), `Cronograma de Clases`, `Aulas Virtuales` y `Espacios del Campus`.
|
|
* **Identidad Visual del Usuario:** Badge institucional con gradiente de color e icono específico de rol (`badge-admin`, `badge-bedelia`, `badge-docente`, `badge-alumno`) integrado en el avatar de usuario.
|
|
|
|
### 🎯 11. Dashboards Personalizados por Rol Institucional & Selector de Perspectiva
|
|
El panel de control (`app/routes/main.py` y `app/templates/dashboard.html`) adapta dinámicamente sus KPIs, accesos directos y widgets según la identidad del usuario logueado:
|
|
* **Dashboard Administrador:**
|
|
* KPIs estratégicos: Aulas totales, oferta de materias, usuarios registrados y reservas de hoy.
|
|
* Módulos visuales de lanzamiento rápido a las áreas clave del sistema.
|
|
* Gráfico analítico de evolución mensual de reservas (`Chart.js`) y tabla de eventos recientes de auditoría.
|
|
* **Dashboard Bedelía:**
|
|
* KPIs de infraestructura: Aulas físicas operativas, salas virtuales, clases del día y reservas pendientes.
|
|
* **Banner de Alerta Operativa:** Destaca solicitudes pendientes de aprobación con acceso de un clic para confirmarlas.
|
|
* Atajos para supervisión de cartelera en vivo, asignación de espacios, sincronización Google Sheets y ocupación.
|
|
* **Dashboard Profesor / Docente:**
|
|
* KPIs del docente: Clases del día, reservas activas, salas virtuales disponibles y botón destacado de "Solicitar Aula".
|
|
* **Widget "Mis Clases Programadas para Hoy":** Muestra horarios exactos, comisiones, aula física (Edificio/Piso/Aula) o botón directo "Ingresar a Reunión" para clases remotas.
|
|
* **Dashboard Alumno / Estudiante:**
|
|
* **Brújula Diaria "¿Dónde curso hoy?":** Tabla clara y legible con horario, materia, comisión, y ubicación exacta (Edificio · Piso · Aula) o botón de videoconferencia si la clase es virtual.
|
|
* **Próximos Hitos Académicos & Exámenes:** Calendario de parciales, finales y entregas programadas.
|
|
* **Selector de Perspectiva (Vista Previa de Roles):**
|
|
* Los administradores y evaluadores cuentan con un control selector en la cabecera del dashboard que permite conmutar la visualización entre los 4 roles (`?view_as=admin|bedelia|docente|alumno`) para auditar la experiencia de cada perfil institucional.
|
|
|
|
### 🛡️ 12. Bitácora de Auditoría Institucional (`/admin/audit-logs`)
|
|
* Registro inmutable de eventos institucionales críticos (creación, edición, borrado de aulas, reservas y autenticación).
|
|
* Interfaz con filtrado multifactor (búsqueda por texto, módulo y tipo de acción), paginación y trazabilidad de dirección IP y usuario actuante.
|
|
|
|
---
|
|
|
|
## 🛠️ Stack Tecnológico
|
|
|
|
| Componente | Tecnología |
|
|
| :--- | :--- |
|
|
| **Backend** | Python 3.12+ / Flask |
|
|
| **Base de Datos** | PostgreSQL 16+ / SQLAlchemy ORM |
|
|
| **Seguridad & Sesiones** | Flask-Login / Werkzeug / CSRF Protect |
|
|
| **Formularios** | Flask-WTF / WTForms |
|
|
| **Internacionalización** | Flask-Babel / GNU gettext |
|
|
| **Frontend** | Bootstrap 5.3, Bootstrap Icons, Vanilla JS, CSS Variables |
|
|
| **Calendario** | FullCalendar 5.11 |
|
|
|
|
---
|
|
|
|
## 🚀 Despliegue en Proxmox VE (LXC) con Entorno Virtual `venv`
|
|
|
|
El sistema está especialmente optimizado para ejecutarse en contenedores **LXC (Debian 12 Bookworm o Ubuntu 22.04/24.04 LTS)** dentro de **Proxmox VE**, utilizando un entorno virtual nativo de Python (`venv`), el motor **PostgreSQL** instalado en el propio contenedor y el servidor WSGI **Gunicorn** gestionado como servicio por **systemd**.
|
|
|
|
---
|
|
|
|
### 📋 Paso 1: Creación del Contenedor LXC en Proxmox VE
|
|
|
|
Podés crear el contenedor desde la interfaz Web de Proxmox (*Create CT*) o por terminal Proxmox con `pct create`:
|
|
|
|
* **Plantilla (Template):** `debian-12-standard` (*Recomendado*) o `ubuntu-22.04-standard` / `ubuntu-24.04-standard`.
|
|
* **CPU:** 1 a 2 vCPU.
|
|
* **Memoria RAM:** 1024 MB a 2048 MB (Swap: 512 MB).
|
|
* **Disco:** 8 GB a 15 GB (almacenamiento `local-lvm` o `zfs`).
|
|
* **Red (Network):** Modo Bridge `vmbr0` con IP estática en tu red local o DHCP (ej: `192.168.1.150/24`, Gateway: `192.168.1.1`).
|
|
* **Opciones del Contenedor:**
|
|
* *Unprivileged container:* Sí (marcado por defecto, compatible).
|
|
* *Features (Características):* Habilitar **Nesting (`nesting=1`)** en `CT > Opciones > Características` (requerido para systemd).
|
|
|
|
---
|
|
|
|
### ⚡ Paso 2: Instalación Automatizada con `install.sh`
|
|
|
|
1. **Ingresar a la consola del contenedor LXC:**
|
|
Desde la Web UI de Proxmox (consola noVNC) o desde el shell de tu nodo Proxmox:
|
|
```bash
|
|
pct enter <ID_DEL_CONTENEDOR>
|
|
```
|
|
|
|
2. **Clonar el repositorio y lanzar el instalador:**
|
|
```bash
|
|
apt update && apt install -y git
|
|
git clone https://gitea.oemspot.com.ar/carlostellocba/admin-edu-space.git
|
|
cd admin-edu-space
|
|
bash install.sh
|
|
```
|
|
|
|
3. **Flujo de Ejecución Automatizado en el LXC:**
|
|
* **Migración segura fuera de `/root`:** Si el repositorio se clonó en `/root`, el instalador lo traslada automáticamente a `/opt/admin-edu-space` para garantizar que el usuario del servicio (`eduspace`) tenga acceso de lectura y ejecución.
|
|
* **Locales UTF-8:** Configura `en_US.UTF-8` y `es_AR.UTF-8` para asegurar la internacionalización con `Flask-Babel` y prevenir errores de encoding.
|
|
* **Motor PostgreSQL:** Instala el motor PostgreSQL, inicia el servicio y verifica conectividad activa con bucle de espera.
|
|
* **Restauración del Snapshot Oficial ([classrooms_db.sql](file:///c:/Workspace/admin-edu-space/classrooms_db.sql)):**
|
|
* Detecta el volcado completo de datos.
|
|
* Crea la base de datos `classrooms_db` y el usuario `eduspace_user`.
|
|
* Restaura **25 aulas** (físicas y Campus Virtual $\infty$), **206 comisiones**, **206 materias**, **412 reservas históricas**, **24 carreras**, matrices RBAC y cuentas de acceso.
|
|
* Otorga privilegios totales (`GRANT ALL`) en el esquema `public`, todas las tablas y **todas las secuencias** al usuario `eduspace_user`.
|
|
* Ejecuta `init_db.py` de forma idempotente para validar roles y coherencia.
|
|
* **Entorno Virtual Python (`venv`):** Crea el entorno aislado en `/opt/admin-edu-space/venv` e instala todas las dependencias oficiales (`Flask`, `SQLAlchemy`, `Gunicorn`, etc.).
|
|
* **Servicio Systemd de Producción:** Configura el servicio `admin-edu-space.service` gestionado por **Gunicorn** (3 workers, puerto 5000), con reinicio automático ante fallos y habilitado al inicio del contenedor.
|
|
|
|
---
|
|
|
|
### 🌐 Paso 3: Acceso Inmediato a la Aplicación
|
|
|
|
Al finalizar la instalación, el script mostrará la dirección IP del contenedor:
|
|
* **URL:** **`http://<IP-DEL-LXC>:5000`** (ejemplo: `http://192.168.1.150:5000`)
|
|
* **Email Administrador:** `admin@edu-space.com`
|
|
* **Contraseña Administrador:** `admin123`
|
|
|
|
---
|
|
|
|
### 🛠️ Comandos de Gestión del Servicio en el LXC
|
|
|
|
```bash
|
|
# Consultar estado en tiempo real
|
|
systemctl status admin-edu-space
|
|
|
|
# Seguir logs de la aplicación
|
|
journalctl -u admin-edu-space -f
|
|
|
|
# Reiniciar la aplicación
|
|
systemctl restart admin-edu-space
|
|
|
|
# Detener el servicio
|
|
systemctl stop admin-edu-space
|
|
```
|
|
|
|
---
|
|
|
|
### 💾 Generación de Backups y Migración a Otros Contenedores LXC
|
|
|
|
Para respaldar la base de datos en ejecución o clonarla a otro contenedor LXC:
|
|
|
|
```bash
|
|
# Dentro del contenedor LXC:
|
|
cd /opt/admin-edu-space
|
|
bash backup_db.sh
|
|
```
|
|
|
|
* El script genera un archivo fechado en `backups/classrooms_db_YYYYMMDD_HHMMSS.sql`.
|
|
* Actualiza automáticamente el archivo principal [classrooms_db.sql](file:///c:/Workspace/admin-edu-space/classrooms_db.sql).
|
|
* **Para migrar a otro contenedor:** Podés transferir `classrooms_db.sql` mediante SCP o Git y ejecutar `bash install.sh` en el nuevo LXC.
|
|
|
|
---
|
|
|
|
### 💻 Instalación Manual para Desarrollo Local (con `venv`)
|
|
|
|
Si deseás correr el proyecto en una máquina de desarrollo (Windows / Linux / macOS) sin usar el instalador de Proxmox:
|
|
|
|
1. **Crear y activar el entorno virtual:**
|
|
* En Windows (PowerShell):
|
|
```powershell
|
|
python -m venv venv
|
|
.\venv\Scripts\Activate.ps1
|
|
```
|
|
* En Linux / macOS:
|
|
```bash
|
|
python3 -m venv venv
|
|
source venv/bin/activate
|
|
```
|
|
|
|
2. **Instalar dependencias:**
|
|
```bash
|
|
pip install -r requirements.txt
|
|
```
|
|
|
|
3. **Configurar base de datos local y restaurar snapshot:**
|
|
```bash
|
|
cp .env.example .env
|
|
|
|
# Crear base de datos en PostgreSQL local y cargar datos
|
|
sudo -u postgres psql -c "CREATE DATABASE classrooms_db;"
|
|
sudo -u postgres psql -d classrooms_db < classrooms_db.sql
|
|
```
|
|
|
|
4. **Compilar catálogos de traducción:**
|
|
```bash
|
|
pybabel compile -d translations
|
|
```
|
|
|
|
5. **Iniciar el servidor:**
|
|
```bash
|
|
python wsgi.py
|
|
```
|
|
Disponible en: **`http://localhost:5000`**
|
|
|
|
---
|
|
|
|
## 🔑 Credenciales Predeterminadas
|
|
|
|
| Usuario | Correo Electrónico | Contraseña | Rol |
|
|
| :--- | :--- | :--- | :--- |
|
|
| **Administrador del Sistema** | `admin@edu-space.com` | `admin123` | `Admin` (Acceso Total) |
|
|
|
|
> ⚠️ **Seguridad:** Cambiá la contraseña del administrador desde la interfaz web inmediatamente después del primer inicio de sesión.
|
|
|
|
---
|
|
|
|
## 📁 Estructura del Proyecto
|
|
|
|
```text
|
|
admin-edu-space/
|
|
├── app/
|
|
│ ├── __init__.py # Factoría de la aplicación Flask y extensiones
|
|
│ ├── forms/ # Formularios Flask-WTF con validación CSRF
|
|
│ │ ├── auth.py # Login, perfil y cambio de clave
|
|
│ │ ├── building.py # Sedes y edificios
|
|
│ │ ├── classroom.py # Aulas y capacidades (con soporte ∞)
|
|
│ │ └── reservation.py # Reservas de aulas y horarios
|
|
│ ├── models/ # Modelos relacionales SQLAlchemy
|
|
│ │ ├── academic_term.py # Ciclos lectivos y períodos académicos (activo/histórico)
|
|
│ │ ├── audit_log.py # Bitácora inmutable de auditoría de eventos
|
|
│ │ ├── building.py # Sedes y edificios institucionales
|
|
│ │ ├── career.py # Carreras y titulaciones universitarias
|
|
│ │ ├── classroom.py # Aulas físicas y virtuales con capacidades
|
|
│ │ ├── genetic_algorithm.py # Estructuras de optimización heurística
|
|
│ │ ├── milestone.py # Tipificaciones de hitos académicos y exámenes
|
|
│ │ ├── reservation.py # Reservas horarias, estados y turnos
|
|
│ │ ├── role.py # Roles y matriz de permisos granulares RBAC
|
|
│ │ ├── subject.py # Asignaturas, materias y comisiones de cursada
|
|
│ │ └── user.py # Usuarios, credenciales y asignación de roles
|
|
│ ├── repositories/ # Capa de persistencia desacoplada (Patrón Repository)
|
|
│ │ ├── base_repository.py # CRUD genérico tipado BaseRepository[T]
|
|
│ │ ├── classroom_repository.py # Filtrado de aulas físicas y virtuales
|
|
│ │ ├── reservation_repository.py# Detección de solapamiento y consultas temporales
|
|
│ │ └── user_repository.py # Consultas seguras de usuarios y roles
|
|
│ ├── schemas/ # Contratos DTOs con validación Pydantic v2
|
|
│ │ ├── auth_dto.py # Esquemas de login y refresh tokens
|
|
│ │ ├── classroom_dto.py # Contratos de creación y edición de aulas
|
|
│ │ ├── optimizer_dto.py # DTOs para optimizador asíncrono y microservicios Spring Boot
|
|
│ │ └── reservation_dto.py # Validación de franjas horarias y aforo
|
|
│ ├── security/ # Pipeline de seguridad inspirado en Spring Security
|
|
│ │ ├── filter_chain.py # SecurityFilterChain (OWASP Headers & Rate Limiting)
|
|
│ │ └── decorators.py # @require_permission declarativo a nivel método
|
|
│ ├── services/ # Capa de servicios y lógica de negocio
|
|
│ │ ├── audit_service.py # Registro y consulta de auditoría inmutable
|
|
│ │ ├── classroom_service.py # Lógica de asignación, aforo y validación áulica
|
|
│ │ ├── jwt_service.py # Emisión de tokens (Dual Token) y lista negra
|
|
│ │ ├── optimizer_service.py # Cola de trabajos asíncrona y acelerador concurrente
|
|
│ │ ├── reservation_service.py # Motor de resolución de conflictos de cronograma
|
|
│ │ ├── sheets_importer.py # Parser y sincronizador de Google Sheets
|
|
│ │ └── user_service.py # Autenticación y perfil con matriz RBAC
|
|
│ ├── routes/ # Controladores y rutas modulares (Blueprints)
|
|
│ │ ├── api/ # Endpoints RESTful (v1) con Stateless JWT
|
|
│ │ │ ├── auth.py # /api/v1/auth (login, refresh, logout, me)
|
|
│ │ │ ├── classrooms.py # /api/v1/classrooms (CRUD REST tipado)
|
|
│ │ │ ├── optimizer.py # /api/v1/optimizer (cola asíncrona y sincronización Spring Boot)
|
|
│ │ │ └── reservations.py # /api/v1/reservations (Gestión y disponibilidad)
|
|
│ │ ├── admin.py # Carreras, Asignaturas, Tipificaciones, Métricas, Usuarios
|
|
│ │ ├── auth.py # Autenticación web tradicional Jinja2
|
|
│ │ ├── buildings.py # Gestión de sedes y edificios
|
|
│ │ ├── classrooms.py # Aulas presenciales vs. Virtuales (controlador delgado)
|
|
│ │ ├── genetic_algorithm.py # Optimizador heurístico de asignación
|
|
│ │ ├── main.py # Dashboard principal y métricas rápidas
|
|
│ │ └── schedule.py # Calendario interactivo, cartelera del día y reservas
|
|
│ ├── utils/ # Utilidades transversales
|
|
│ │ └── jwt_decorators.py # @jwt_required y @jwt_role_required
|
|
│ ├── static/ # Recursos estáticos web (CSS, JS, imágenes institucionales)
|
|
│ └── templates/ # Vistas Jinja2 renderizadas con Bootstrap 5
|
|
├── config/ # Configuraciones de entorno (desarrollo, testing, prod)
|
|
├── translations/ # Catálogos GNU gettext compilados (es / en)
|
|
├── classrooms_db.sql # Snapshot completo de base de datos (PostgreSQL 14+)
|
|
├── install.sh # Instalador automatizado para Proxmox VE LXC (venv + PostgreSQL)
|
|
├── backup_db.sh # Script para generar nuevos backups y actualizar snapshot
|
|
├── init_db.py # Inicializador DDL y sincronizador de esquema/roles
|
|
├── CHANGELOG_SESSION.md # Historial técnico cronológico
|
|
├── requirements.txt # Dependencias Python (incluye Gunicorn)
|
|
├── .env.example # Plantilla de variables de entorno
|
|
└── wsgi.py # Punto de entrada de la aplicación Flask
|
|
```
|
|
|
|
---
|
|
|
|
## 🚀 Roadmap Académico & Propuesta de Evolución Tecnológica
|
|
|
|
En respuesta a los requerimientos y sugerencias docentes, se formaliza el plan de evolución arquitectónica, estándares de seguridad y entrega de valor institucional para la plataforma **Admin Edu-Space (UniCABA)**.
|
|
|
|
### 💡 1. Propuesta de Mejora Integral
|
|
|
|
#### A. Arquitectura MVC Rigurosa & Clean Architecture
|
|
* **Desacoplamiento de Capas:**
|
|
* **Model (Dominio):** Entidades relacionales puras y reglas de integridad del negocio desacopladas del framework web (`app/models/`).
|
|
* **View (Presentación):** Vistas web en Jinja2 con Bootstrap 5 y respuestas JSON estructuradas para clientes API/móviles.
|
|
* **Controller (Controladores/Blueprints):** Controladores delgados en `app/routes/` enfocados exclusivamente en la orquestación HTTP y redirección.
|
|
* **Service Layer & Repositories (`app/services/` & `app/repositories/`):** Aislamiento de la lógica de negocio (detección de colisiones, algoritmo genético de asignación, ETL de Google Sheets) y operaciones de persistencia encapsuladas.
|
|
* **DTOs y Validación de Entrada:** Incorporación de esquemas tipados (Pydantic / Marshmallow) para filtrar y sanitizar datos de entrada antes de interactuar con el ORM, eliminando validaciones ad-hoc en los controladores.
|
|
|
|
#### B. Autenticación & Autorización Stateless con JWT (JSON Web Tokens)
|
|
* **Arquitectura API-First Híbrida:**
|
|
* Coexistencia armónica de sesiones web seguras (para el panel administrativo en navegadores) y tokens **JWT** (para microservicios, clientes móviles y aplicaciones externas).
|
|
* **Esquema Dual de Tokens (Dual Token Pattern):**
|
|
* `Access Token` (firmado con RS256/HS256, expiración corta de 15 minutos) con claims contextuales (`sub`, `roles`, `permissions`, `exp`).
|
|
* `Refresh Token` (almacenado en cookie segura `HttpOnly`, `Secure`, `SameSite=Strict`, expiración de 7 días) para renovación silenciosa sin reingreso de credenciales.
|
|
* **Mecanismo de Revocación Inmediata (Token Blacklist):** Almacenamiento en caché distribuida (Redis) para invalidación instantánea ante cierres de sesión forzados o rotación de contraseñas.
|
|
|
|
#### C. Seguridad Empresarial y Paradigma "Sprint / Spring Security"
|
|
* **Cadena de Filtros de Interceptación (SecurityFilterChain):** Pipeline centralizado inspirado en los estándares de Spring Security:
|
|
* **Authentication Filter:** Intercepta cabeceras `Authorization: Bearer <token>` y valida firmas criptográficas.
|
|
* **Security Headers Filter:** Inyección obligatoria de cabeceras de blindaje HTTP (HSTS, CSP, X-Frame-Options: DENY, X-Content-Type-Options: nosniff).
|
|
* **Rate Limiting Filter:** Prevención de ataques de fuerza bruta y DDoS en endpoints sensibles mediante límites dinámicos (`Flask-Limiter` / Redis).
|
|
* **Seguridad Declarativa a Nivel Método (`@PreAuthorize` / `@require_permission`):**
|
|
* Decoradores reutilizables que evalúan la matriz RBAC antes de ejecutar cualquier método de servicio:
|
|
```python
|
|
@require_permission('classrooms', min_level='read_write')
|
|
def update_classroom_capacity(classroom_id, new_capacity): ...
|
|
```
|
|
* **Bitácora Inmutable de Auditoría (Audit Trail):** Registro trazable de eventos críticos (creación/modificación de reservas, cambios de roles y accesos fallidos) con IP de origen, usuario actuante, timestamp y delta de cambios.
|
|
|
|
---
|
|
|
|
### 📅 2. Planificación de Sprints (Roadmap)
|
|
|
|
| Sprint / Fase | Objetivo Principal | Entregables Clave | Estado | Hito de Evaluación |
|
|
| :--- | :--- | :--- | :--- | :--- |
|
|
| **Sprint 1** | **Refactorización MVC & Capa de Servicios** | • Extracción de lógica a `app/services/`<br>• Patrón Repository para aulas y reservas (`app/repositories/`)<br>• DTOs tipados de validación con esquemas Pydantic v2 | **✔ Completado** | Controladores delgados (< 60 líneas), desacoplamiento Clean Architecture y persistencia aislada. |
|
|
| **Sprint 2** | **Autenticación Stateless JWT & API Gateway** | • Endpoints `/api/v1/auth/login`, `/refresh`, `/logout`, `/me`<br>• Endpoints RESTful de aulas y reservas<br>• Decoradores `@jwt_required` y middleware Bearer Token | **✔ Completado** | Consumo seguro desde Swagger/Postman y clientes externos con Dual Token Pattern (15 min + 7 días). |
|
|
| **Sprint 3** | **Sprint Security & Gobernanza RBAC** | • Pipeline centralizado `SecurityFilterChain`<br>• Rate Limiting dinámico (fuerza bruta / DoS)<br>• Decorador `@require_permission` a nivel método<br>• Bitácora inmutable de auditoría (`AuditLog`) | **✔ Completado** | Inyección de cabeceras OWASP Secure Headers y trazabilidad completa de eventos críticos con IP/usuario. |
|
|
| **Sprint 4** | **Optimizador Heurístico & Alta Concurrencia** | • Paralelización del algoritmo genético con multiprocessing/workers<br>• Colas asíncronas para optimizaciones pesadas (`OptimizerService`)<br>• Integración con microservicio Spring Boot vía REST/JWT (`/api/v1/optimizer/spring-boot/sync`) | **✔ Completado** | Optimización de 200+ comisiones en < 2.8s con 0 colisiones horarias. |
|
|
|
|
---
|
|
|
|
### 💎 3. Valor Agregado & Retorno Institucional
|
|
|
|
1. **Eficiencia Edilicia y Reducción del Desperdicio de Espacio:**
|
|
- Maximiza el aprovechamiento de las aulas físicas de la Sede Central (**Tte. Gral. Juan Domingo Perón 802**), pasando de una asignación manual y empírica a un modelo algorítmico basado en capacidad real, accesibilidad de pisos y equipamiento.
|
|
2. **Ahorro de Tiempo Operativo (85% de reducción):**
|
|
- Automatiza la resolución de conflictos de solapamiento horario en horarios pico (Turno Vespertino, 17:30 a 21:30 hs) y agiliza la sincronización con la cartelera de Google Sheets en lote.
|
|
3. **Interoperabilidad Universal:**
|
|
- La arquitectura desacoplada y la capa JWT permiten que cualquier otro sistema de la universidad (SIU Guaraní, Campus Virtual Moodle, App de estudiantes, backend Spring Boot institucional) consulte en tiempo real la disponibilidad áulica.
|
|
4. **Despliegue de Alta Eficiencia (Bajo Costo de Infraestructura):**
|
|
- A diferencia de arquitecturas pesadas basadas en contenedores Docker o Kubernetes que demandan múltiples gigabytes de RAM, **Admin Edu-Space corre de forma nativa en un contenedor Proxmox VE LXC consumiendo menos de 180MB de memoria**, garantizando alta disponibilidad con costos de hardware mínimos.
|
|
|
|
---
|
|
|
|
### 🧩 4. Desafíos Técnicos (Challenges)
|
|
|
|
* **Challenge 1: Resolución Heurística de Horarios Áulicos (NP-Hard Problem):**
|
|
- La asignación de 206 asignaturas, 400+ reservas y 25 aulas considerando restricciones duras (no colisión horaria, capacidad no superada) y blandas (mismo docente en pisos cercanos, turnos consolidados) representa un problema de complejidad NP-Hard resuelto mediante un **Algoritmo Genético** con operadores de cruce y mutación adaptativa.
|
|
* **Challenge 2: Sincronización Masiva Tolerante a Fallos:**
|
|
- El parser ETL de Google Sheets normaliza datos no estructurados de la cartelera académica, resolviendo discrepancias ortográficas, turnos implícitos y formatos dispares de hora sin interrumpir la operación continua.
|
|
* **Challenge 3: Portabilidad Extrema en Proxmox LXC sin Docker:**
|
|
- Desarrollo de un instalador auto-recuperable ([install.sh](file:///c:/Workspace/admin-edu-space/install.sh)) capaz de levantar PostgreSQL nativo en Debian 12 y 13 dentro de `tmpfs`, gestionar clusters con `pg_createcluster`, operar de forma autónoma con o sin `sudo`, y garantizar persistencia íntegra de base de datos entre dispositivos.
|
|
|
|
---
|
|
|
|
## 📄 Licencia
|
|
|
|
Este proyecto forma parte del sistema de gestión institucional y educativa de **UniCABA**. Todos los derechos reservados.
|
|
|