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 Python/CustomTkinter para gestionar inventario hotelero y planificar eventos con validación de recursos y persistencia en JSON. Arquitectura MVC.
Traceback (most recent call last):
File "/tmp/tmppij57at4/repo/main.py", line 11, in <module>
app = App()
^^^^^
File "/tmp/tmppij57at4/repo/hotel_planner/ui/app.py", line 29, in __init__
super().__init__()
File "/tmp/tmppij57at4/venv/lib/python3.12/site-packages/customtkinter/windows/ctk_tk.py", line 40, in __init__
CTK_PARENT_CLASS.__init__(self, **pop_from_dict_by_set
Resumen
✅ Repositorio accesible
✅ report.md con ≥2000 palabras
✅ Archivos Python
✅ Configuración de dependencias
✅ Punto de entrada
✅ Ejecución
6/6 verificaciones pasadas.
Verificación automática — los resultados son orientativos. El profesor revisará en detalle.
Construiste una aplicación de escritorio (CustomTkinter, MVC de verdad) para gestionar un inventario hotelero de salas, empleados y objetos, y planificar eventos que consumen esos recursos. El corazón es un Scheduler que valida disponibilidad por solapamiento de intervalos, respeta restricciones de co-requisito y exclusión entre recursos, y hasta busca el siguiente hueco libre. Para ser primer año, el alcance y la calidad del diseño son sobresalientes.
Ejecución
La GUI (python main.py) no arrancó en mi entorno, pero no es culpa tuya: falla al no haber servidor gráfico (X11) — el mismo aborto de xcb/Tkinter que vio la verificación automática. Como separaste bien la lógica de la vista, probé el backend directamente con tus datos reales (default_data.json, 81 recursos y 9 eventos) y corrí tus tests. Resultados:
py_compile de los 28 módulos: OK.
Tus tests (tests/test_constraints.py): 5 passed en 0.07s.
Programar un evento válido → (True, None); sobre-reservar una sala ocupada → rechazado con libres: 0; pedir 15 camareros de 12 → rechazado; pedir 12 → aceptado.
find_next_available con dos eventos en 10-12 y 14-16 devolvió justo el hueco 12:00-13:00.
JSON corrupto, archivo inexistente y fin <= inicio → todos manejados con mensajes claros, sin ningún Traceback.
Todo el motor de planificación funciona correctamente.
Lo que está bien
Motor de scheduling correcto y bien diseñado: índices ordenados con bisect, conteo de reservas por solapamiento de intervalos, y un barrido sweep line (resource_usage_intervals) para saber cuántas unidades están en uso en cada tramo. Nivel alto.
Arquitectura MVC genuina: modelo, Scheduler, Controller y vistas de verdad separados. Tanto que pude probar el backend sin la GUI — eso es señal de buen diseño.
Polimorfismo real: Room/Employee/Item sobre Resource, cada uno extendiendo to_dict().
Escritura atómica (archivo .tmp + os.replace) para no corromper datos si falla el guardado. Patrón maduro, poco común en un principiante.
Escribiste tus propios tests unitarios y pasan. Excelente hábito.
Qué mejorar
Bug real en "Añadir Recurso".Inventory.add_resource (inventory.py:22) no tiene return, así que devuelve None. Pero el controlador espera el recurso de vuelta: added = ...add_resource(room); return (True, added.to_dict()) (controller.py:93-94). Lo verifiqué: al añadir una sala, el controlador responde (False, "'NoneType' object has no attribute 'to_dict'")aunque el recurso sí se añade. O sea, la UI mostraría un error engañoso al añadir cualquier recurso. Arréglalo haciendo que add_resource devuelva el recurso añadido (return resource).
Duplicación al fusionar recursos. En inventory.py, cuando ya existe un recurso con ese nombre, sumas la cantidad a la entrada existente… pero luego igualmente haces self.resources.append(resource) (inventory.py:38), dejando dos filas con el mismo nombre. Probé Item('Silla', 10) + Item('Silla', 5) y quedan dos entradas (15 y 5). No se nota con los datos de ejemplo (nombres únicos), pero el append debería ir dentro de un else.
Limpieza menor: quedan varios print("DEBUG ...") en app.py (mejor logging), algún except Exception: pass que se traga errores, y código de carga casi idéntico entre load_events y load_events_from_list que podrías unificar.
Sobre el informe
Muy completo (2.797 palabras) y en general honesto: MVC, escritura atómica, ruta de persistencia ~/.hotel_planner/data.json, tests… todo coincide con el código. Un matiz: presentas la recurrencia (diaria/semanal/mensual…) como funcionalidad, pero en el código es solo un campo que se guarda — el scheduler no expande eventos recurrentes (tú mismo lo dejaste como TODO en scheduler.py:92 y una nota en scheduler.py:45). Un evento "diario" solo ocupa su intervalo único. Vale la pena aclarar en el informe que la recurrencia se almacena pero aún no se aplica.
En resumen: un proyecto ambicioso y bien construido, con un motor correcto y tests propios. Corrige el contrato de add_resource y quedará también sólido en el flujo de añadir recursos. ¡Muy buen trabajo!
Activity
github-actions commentedon Jun 26, 2026
Verificación Automática — Proyecto I 🤖
Repositorio analizado:
https://github.com/Stark040301/Hotel_Planner_Project1. Repositorio
✅ El repositorio es accesible y fue clonado correctamente.
2. Informe (
report.md)✅
report.md— 2,797 palabras (mínimo: 2,000).3. Proyecto Python
pyproject.toml.✅
requirements.txtencontrado.Dependencias declaradas:
customtkinter,tkcalendar,darkdetect,iniconfig,markdown-it-py,mdurl,packaging,pillow,pluggy,PygmentsArchivos Python (28, 5,442 líneas en total):
main.pyhotel_planner/core/scheduler.pyhotel_planner/models/inventory.pyhotel_planner/models/store.pyhotel_planner/models/inventory_store.pyhotel_planner/models/event.pyhotel_planner/models/resource.pyhotel_planner/models/event_store.pyhotel_planner/ui/vertical_segmented.pyhotel_planner/ui/__init__.pyhotel_planner/ui/app.pyhotel_planner/ui/io_worker.pyhotel_planner/ui/advanced_ui.pyhotel_planner/ui/styles.pyhotel_planner/ui/controller.py4. Punto de Entrada
✅ Punto de entrada detectado:
main.py5. Ejecución
✅ El proyecto se ejecuta.
Resumen
6/6 verificaciones pasadas.
Verificación automática — los resultados son orientativos. El profesor revisará en detalle.
apiad commentedon Jul 15, 2026
🔍 Revisión de Código — Claude Code
Qué hace tu proyecto
Construiste una aplicación de escritorio (CustomTkinter, MVC de verdad) para gestionar un inventario hotelero de salas, empleados y objetos, y planificar eventos que consumen esos recursos. El corazón es un
Schedulerque valida disponibilidad por solapamiento de intervalos, respeta restricciones de co-requisito y exclusión entre recursos, y hasta busca el siguiente hueco libre. Para ser primer año, el alcance y la calidad del diseño son sobresalientes.Ejecución
La GUI (
python main.py) no arrancó en mi entorno, pero no es culpa tuya: falla al no haber servidor gráfico (X11) — el mismo aborto dexcb/Tkinter que vio la verificación automática. Como separaste bien la lógica de la vista, probé el backend directamente con tus datos reales (default_data.json, 81 recursos y 9 eventos) y corrí tus tests. Resultados:py_compilede los 28 módulos: OK.tests/test_constraints.py): 5 passed en 0.07s.(True, None); sobre-reservar una sala ocupada → rechazado conlibres: 0; pedir 15 camareros de 12 → rechazado; pedir 12 → aceptado.find_next_availablecon dos eventos en 10-12 y 14-16 devolvió justo el hueco12:00-13:00.fin <= inicio→ todos manejados con mensajes claros, sin ningúnTraceback.Todo el motor de planificación funciona correctamente.
Lo que está bien
bisect, conteo de reservas por solapamiento de intervalos, y un barrido sweep line (resource_usage_intervals) para saber cuántas unidades están en uso en cada tramo. Nivel alto.Scheduler,Controllery vistas de verdad separados. Tanto que pude probar el backend sin la GUI — eso es señal de buen diseño.Room/Employee/ItemsobreResource, cada uno extendiendoto_dict()..tmp+os.replace) para no corromper datos si falla el guardado. Patrón maduro, poco común en un principiante.Qué mejorar
Inventory.add_resource(inventory.py:22) no tienereturn, así que devuelveNone. Pero el controlador espera el recurso de vuelta:added = ...add_resource(room); return (True, added.to_dict())(controller.py:93-94). Lo verifiqué: al añadir una sala, el controlador responde(False, "'NoneType' object has no attribute 'to_dict'")aunque el recurso sí se añade. O sea, la UI mostraría un error engañoso al añadir cualquier recurso. Arréglalo haciendo queadd_resourcedevuelva el recurso añadido (return resource).inventory.py, cuando ya existe un recurso con ese nombre, sumas la cantidad a la entrada existente… pero luego igualmente hacesself.resources.append(resource)(inventory.py:38), dejando dos filas con el mismo nombre. ProbéItem('Silla', 10)+Item('Silla', 5)y quedan dos entradas (15 y 5). No se nota con los datos de ejemplo (nombres únicos), pero elappenddebería ir dentro de unelse.print("DEBUG ...")enapp.py(mejorlogging), algúnexcept Exception: passque se traga errores, y código de carga casi idéntico entreload_eventsyload_events_from_listque podrías unificar.Sobre el informe
Muy completo (2.797 palabras) y en general honesto: MVC, escritura atómica, ruta de persistencia
~/.hotel_planner/data.json, tests… todo coincide con el código. Un matiz: presentas la recurrencia (diaria/semanal/mensual…) como funcionalidad, pero en el código es solo un campo que se guarda — el scheduler no expande eventos recurrentes (tú mismo lo dejaste comoTODOenscheduler.py:92y una nota enscheduler.py:45). Un evento "diario" solo ocupa su intervalo único. Vale la pena aclarar en el informe que la recurrencia se almacena pero aún no se aplica.En resumen: un proyecto ambicioso y bien construido, con un motor correcto y tests propios. Corrige el contrato de
add_resourcey quedará también sólido en el flujo de añadir recursos. ¡Muy buen trabajo!docs(reviews): add Proyecto I code reviews (batch 9: #302-#314)