You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Aplicación para gestionar eventos deportivos (partidos, entrenamientos y mantenimiento) que valida restricciones de recursos, evita conflictos de horario y sugiere automáticamente el próximo espacio disponible.
Construiste un gestor de eventos deportivos por consola que persiste en SQLite: creas partidos, entrenamientos y mantenimientos, valida las restricciones de recursos de cada tipo, evita que dos eventos solapados usen el mismo recurso, y tiene un scheduler que busca el próximo hueco libre. Lo más valioso es que separaste bien la lógica (base de datos, restricciones, scheduler) de la interfaz — eso hace el código limpio y testeable, y se nota que entendiste el dominio.
Ejecución
Lo corrí de verdad alimentando el menú con entradas por stdin y también invocando la lógica directamente. py_compile de todos los módulos: OK. Aunque tu requirements.txt declara streamlit, pandas y numpy, el programa en realidad solo usa la biblioteca estándar (sqlite3, datetime), así que arrancó sin instalar nada de eso.
Crear un Official Match válido: funciona — asigna los 9 recursos, crea el evento, y al listar aparece con todo correcto.
Conflicto de horario: un segundo evento solapado se rechaza y revierte bien (rollback).
Restricciones violadas y fecha inválida: manejadas con mensajes claros.
Lo que está bien
El flujo completo de crear evento → validar restricciones → asignar recursos → detectar conflicto → hacer rollback funciona end-to-end. Eso es lo difícil y lo lograste.
Usas consultas SQL parametrizadas (?) en todas partes: evitas inyección SQL sin siquiera proponértelo. Muy bien.
El esquema relacional (resources, events, event_resources con clave compuesta) está bien pensado, y INSERT OR IGNORE para sembrar los recursos es idempotente y elegante.
La validación de fecha con try/except sobre datetime.fromisoformat es limpia.
Qué mejorar
El Scheduler revienta la última semana del mes. En scheduler.py:14 usas start_from.replace(day=start_from.day + day, ...). Cuando el día actual + 7 pasa del último día del mes (del 24 en adelante en julio, por ejemplo), Python lanza ValueError: day is out of range for month y el programa cae. Lo reproduje con fecha 31 de julio. La forma correcta es sumar días con timedelta: candidate_start = (start_from + timedelta(days=day)).replace(hour=hour, minute=0, second=0, microsecond=0). Así nunca te sales del mes.
Los recursos se descuentan para siempre, no por horario. En assign_resource_to_event (database.py:205) haces available_quantity = available_quantity - cantidad. Eso convierte available_quantity en un contador global permanente: si un evento del 1 de agosto usa las 2 porterías, ningún otro evento —ni el del 5 de agosto, sin solape— podrá usarlas. Verifiqué que pasa exactamente eso. La idea de tu scheduler es que la disponibilidad dependa del tiempo, así que en vez de descontar el pool global, cuenta cuántas unidades están reservadas solo por los eventos que solapan la franja que consultas (tu consulta de conflicto en database.py:149 ya va por ahí — solo falta no tocar el pool global).
La duración no numérica tumba el programa.float(input(...)) en main.py:66 y main.py:135 no está protegido: si el usuario escribe abc, sale un Traceback y se cierra todo. Envuélvelo en try/except ValueError como ya hiciste con la fecha.
Una restricción no hace nada. En Constraints.py:45, if resources_dict.get("fence",0) < 0 nunca se cumple (una cantidad nunca es negativa), pero el mensaje dice "needs at least 3 fences". Probablemente querías < 3.
Código que sobra.models.py (la clase Resource) y event_templates.py no se importan en ningún lado — toda la gestión la haces por SQL. Y tienes dos ficheros .db en el repo; el código solo usa events/events.db.
Sobre el informe
El informe está muy bien redactado, pero describe cosas que el código no hace todavía. La §4.2 "Exclusión Mutua" (que Field Maintenance no puede usar escaleras) no está implementada en Constraints.py — no hay ninguna lógica de exclusión. La §4.3 "Límites por Tipo" (que un entrenamiento no exceda 25 balones) tampoco: tus restricciones solo validan mínimos, nunca máximos. Y la conclusión afirma que "cumple con todos los requisitos", lo cual queda matizado por los bugs del scheduler. Para la próxima, alinea el informe con lo que el código realmente hace: es mejor un informe honesto y preciso que uno que promete de más.
Muy buen trabajo en el núcleo — arreglando el scheduler y la duración quedaría redondo. ¡Sigue así!
Activity
github-actions commentedon Jun 27, 2026
Verificación Automática — Proyecto I 🤖
Repositorio analizado:
https://github.com/ErielMichel/Furvito-en-la-Polar.git1. Repositorio
✅ El repositorio es accesible y fue clonado correctamente.
2. Informe (
report.md)❌ No se encontró
report.mden el repositorio.3. Proyecto Python
pyproject.toml.requirements.txt.Archivos Python (6, 676 líneas en total):
events/event_templates.pyevents/models.pyevents/main.pyevents/scheduler.pyevents/database.pyevents/Constraints.py4. Punto de Entrada
main.py,app.py, etc.).5. Ejecución
Resumen
2/6 verificaciones pasadas.
Verificación automática — los resultados son orientativos. El profesor revisará en detalle.
ErielMichel commentedon Jun 27, 2026
Actualicé el repositorio
apiad commentedon Jul 16, 2026
🔍 Revisión de Código — Claude Code
Qué hace tu proyecto
Construiste un gestor de eventos deportivos por consola que persiste en SQLite: creas partidos, entrenamientos y mantenimientos, valida las restricciones de recursos de cada tipo, evita que dos eventos solapados usen el mismo recurso, y tiene un scheduler que busca el próximo hueco libre. Lo más valioso es que separaste bien la lógica (base de datos, restricciones, scheduler) de la interfaz — eso hace el código limpio y testeable, y se nota que entendiste el dominio.
Ejecución
Lo corrí de verdad alimentando el menú con entradas por
stdiny también invocando la lógica directamente.py_compilede todos los módulos: OK. Aunque turequirements.txtdeclarastreamlit,pandasynumpy, el programa en realidad solo usa la biblioteca estándar (sqlite3,datetime), así que arrancó sin instalar nada de eso.Lo que está bien
?) en todas partes: evitas inyección SQL sin siquiera proponértelo. Muy bien.resources,events,event_resourcescon clave compuesta) está bien pensado, yINSERT OR IGNOREpara sembrar los recursos es idempotente y elegante.try/exceptsobredatetime.fromisoformates limpia.Qué mejorar
scheduler.py:14usasstart_from.replace(day=start_from.day + day, ...). Cuando el día actual + 7 pasa del último día del mes (del 24 en adelante en julio, por ejemplo), Python lanzaValueError: day is out of range for monthy el programa cae. Lo reproduje con fecha 31 de julio. La forma correcta es sumar días contimedelta:candidate_start = (start_from + timedelta(days=day)).replace(hour=hour, minute=0, second=0, microsecond=0). Así nunca te sales del mes.assign_resource_to_event(database.py:205) hacesavailable_quantity = available_quantity - cantidad. Eso convierteavailable_quantityen un contador global permanente: si un evento del 1 de agosto usa las 2 porterías, ningún otro evento —ni el del 5 de agosto, sin solape— podrá usarlas. Verifiqué que pasa exactamente eso. La idea de tu scheduler es que la disponibilidad dependa del tiempo, así que en vez de descontar el pool global, cuenta cuántas unidades están reservadas solo por los eventos que solapan la franja que consultas (tu consulta de conflicto endatabase.py:149ya va por ahí — solo falta no tocar el pool global).float(input(...))enmain.py:66ymain.py:135no está protegido: si el usuario escribeabc, sale unTracebacky se cierra todo. Envuélvelo entry/except ValueErrorcomo ya hiciste con la fecha.Constraints.py:45,if resources_dict.get("fence",0) < 0nunca se cumple (una cantidad nunca es negativa), pero el mensaje dice "needs at least 3 fences". Probablemente querías< 3.models.py(la claseResource) yevent_templates.pyno se importan en ningún lado — toda la gestión la haces por SQL. Y tienes dos ficheros.dben el repo; el código solo usaevents/events.db.Sobre el informe
El informe está muy bien redactado, pero describe cosas que el código no hace todavía. La §4.2 "Exclusión Mutua" (que Field Maintenance no puede usar escaleras) no está implementada en
Constraints.py— no hay ninguna lógica de exclusión. La §4.3 "Límites por Tipo" (que un entrenamiento no exceda 25 balones) tampoco: tus restricciones solo validan mínimos, nunca máximos. Y la conclusión afirma que "cumple con todos los requisitos", lo cual queda matizado por los bugs del scheduler. Para la próxima, alinea el informe con lo que el código realmente hace: es mejor un informe honesto y preciso que uno que promete de más.Muy buen trabajo en el núcleo — arreglando el scheduler y la duración quedaría redondo. ¡Sigue así!