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:
- Aulas y Espacios: Creación, edición, capacidad y estado de aulas físicas y virtuales.
- Edificios y Sedes: Administración de sedes, pisos y arquitectura edilicia.
- Reservas de Aulas: Solicitud, aprobación, confirmación y cancelación.
- Cartelera y Cronograma: Calendario interactivo, visualización diaria y comisiones.
- Gestión Académica: Carreras, asignaturas, códigos y comisiones.
- Sincronización Sheets: Importador y sincronizador de Google Sheets.
- Optimizador IA: Algoritmo genético de distribución y resolución de conflictos.
- Usuarios y Accesos RBAC: Cuentas, roles y matriz de permisos.
- Niveles de Permiso Granulares:
Ninguno,Solo LecturaoLectura y Escritura. - Controles Rápidos: Botón "Establecer Todos" para configuración masiva inmediata.
- Roles Predefinidos:
Admin(control total),Docente,OperadoryConsulta.
📊 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ñanayTurno Tarde / Vespertino).
- Código Académico: Códigos reales de asignatura (ej.
📅 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
∞o0para 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
∞ Ilimitadaen 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
localStoragey 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.
🛠️ 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 |
🚀 Instalación y Puesta en Marcha
Prerrequisitos
- Python 3.10 o superior
- PostgreSQL en ejecución con una base de datos creada (ej.
classrooms_db). - Git
Pasos de Configuración
-
Clonar el repositorio:
git clone https://gitea.oemspot.com.ar/carlostellocba/admin-edu-space.git cd admin-edu-space -
Crear y activar el entorno virtual:
- En Windows (PowerShell):
python -m venv venv .\venv\Scripts\Activate.ps1 - En Linux / macOS:
python3 -m venv venv source venv/bin/activate
- En Windows (PowerShell):
-
Instalar dependencias:
pip install -r requirements.txt -
Configurar variables de entorno (
.env): Crear o editar el archivo.enven la raíz del proyecto:SECRET_KEY=clave-secreta-de-produccion-cambiar-en-despliegue DATABASE_URL=postgresql://postgres:postgres@localhost:5432/classrooms_db FLASK_ENV=development FLASK_DEBUG=1 -
Inicializar la Base de Datos: Ejecutar el script de inicialización para crear tablas, roles institucionales, permisos RBAC, sedes y el usuario administrador:
python init_db.py -
Compilar catálogos de traducción (opcional si se modifican textos):
pybabel compile -d translations -
Iniciar el servidor de desarrollo:
python app.pyLa aplicación estará 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) |
📁 Estructura del Proyecto
admin-edu-space/
├── app/
│ ├── __init__.py # Factoría de la aplicación Flask y extensiones
│ ├── models/ # Modelos de base de datos SQLAlchemy
│ │ ├── user.py # Modelo de usuario
│ │ ├── role.py # Roles y matriz de permisos RBAC
│ │ ├── classroom.py # Aulas y capacidades físicas / virtuales
│ │ ├── building.py # Edificios y sedes institucionales
│ │ ├── career.py # Carreras universitarias
│ │ ├── subject.py # Asignaturas y comisiones
│ │ └── reservation.py # Reservas horarias y turnos
│ ├── routes/ # Controladores y rutas (Blueprints)
│ │ ├── auth.py # Autenticación, login y perfil
│ │ ├── main.py # Dashboard y métricas generales
│ │ ├── admin.py # Gestión de usuarios, roles e importación
│ │ ├── classrooms.py # ABM de aulas y equipamiento
│ │ ├── buildings.py # Gestión de sedes y edificios
│ │ ├── schedule.py # Calendario, cartelera del día y reservas
│ │ └── genetic_algorithm.py # Optimizador genético de aulas
│ ├── services/ # Servicios de negocio
│ │ └── sheets_importer.py # Parser y sincronizador de Google Sheets
│ ├── forms/ # Formularios Flask-WTF
│ ├── templates/ # Plantillas Jinja2 (Bootstrap 5)
│ ├── static/ # Archivos CSS, JS e imágenes
│ └── utils/ # Decoradores de autorización y utilidades
├── config/ # Ajustes de configuración
├── translations/ # Catálogos de traducción (es / en)
├── init_db.py # Script DDL y semillero inicial
├── CHANGELOG_SESSION.md # Registro cronológico detallado de cambios
├── requirements.txt # Dependencias del proyecto
├── .env.example # Plantilla de variables de entorno
└── app.py # Punto de entrada de la aplicación
📄 Licencia
Este proyecto forma parte del sistema de gestión institucional y educativa de UniCABA. Todos los derechos reservados.