27 KiB
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.
🏛️ 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.
- Edificios y Sedes (
- 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.
- Carreras (
- 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.
🛠️ 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) oubuntu-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-lvmozfs). - Red (Network): Modo Bridge
vmbr0con 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) enCT > Opciones > Características(requerido para systemd).
⚡ Paso 2: Instalación Automatizada con install.sh
-
Ingresar a la consola del contenedor LXC: Desde la Web UI de Proxmox (consola noVNC) o desde el shell de tu nodo Proxmox:
pct enter <ID_DEL_CONTENEDOR> -
Clonar el repositorio y lanzar el instalador:
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 -
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-spacepara garantizar que el usuario del servicio (eduspace) tenga acceso de lectura y ejecución. - Locales UTF-8: Configura
en_US.UTF-8yes_AR.UTF-8para asegurar la internacionalización conFlask-Babely 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):
- Detecta el volcado completo de datos.
- Crea la base de datos
classrooms_dby el usuarioeduspace_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 esquemapublic, todas las tablas y todas las secuencias al usuarioeduspace_user. - Ejecuta
init_db.pyde forma idempotente para validar roles y coherencia.
- Entorno Virtual Python (
venv): Crea el entorno aislado en/opt/admin-edu-space/venve instala todas las dependencias oficiales (Flask,SQLAlchemy,Gunicorn, etc.). - Servicio Systemd de Producción: Configura el servicio
admin-edu-space.servicegestionado por Gunicorn (3 workers, puerto 5000), con reinicio automático ante fallos y habilitado al inicio del contenedor.
- Migración segura fuera de
🌐 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
# 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:
# 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.
- Para migrar a otro contenedor: Podés transferir
classrooms_db.sqlmediante SCP o Git y ejecutarbash install.shen 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:
-
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 base de datos local y restaurar snapshot:
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 -
Compilar catálogos de traducción:
pybabel compile -d translations -
Iniciar el servidor:
python wsgi.pyDisponible 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
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
│ │ └── 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
│ │ ├── 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)
│ │ │ └── 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.
- Model (Dominio): Entidades relacionales puras y reglas de integridad del negocio desacopladas del framework web (
- 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 seguraHttpOnly,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).
- Authentication Filter: Intercepta cabeceras
- 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:
@require_permission('classrooms', min_level='read_write') def update_classroom_capacity(classroom_id, new_capacity): ...
- Decoradores reutilizables que evalúan la matriz RBAC antes de ejecutar cualquier método de servicio:
- 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/• Patrón Repository para aulas y reservas ( app/repositories/)• 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• Endpoints RESTful de aulas y reservas • 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• Rate Limiting dinámico (fuerza bruta / DoS) • Decorador @require_permission a nivel método• 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 • Colas asíncronas para optimizaciones pesadas • Integración con microservicio Spring Boot vía REST/JWT |
⏳ En Curso | Optimización de 200+ comisiones en menos de 5 segundos con 0 colisiones horarias. |
💎 3. Valor Agregado & Retorno Institucional
- 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.
- 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.
- 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.
- 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) capaz de levantar PostgreSQL nativo en Debian 12 y 13 dentro de
tmpfs, gestionar clusters conpg_createcluster, operar de forma autónoma con o sinsudo, y garantizar persistencia íntegra de base de datos entre dispositivos.
- Desarrollo de un instalador auto-recuperable (install.sh) capaz de levantar PostgreSQL nativo en Debian 12 y 13 dentro de
📄 Licencia
Este proyecto forma parte del sistema de gestión institucional y educativa de UniCABA. Todos los derechos reservados.