Mini-LMS – Hoja de Ruta | Profe Diego · CEOGET
$ 0 – 10 min

¿Qué están construyendo?

// El problema → ¿Qué es un LMS? → Los actores → El reto del progreso

💭 Para arrancar, piensen en esto
¿Alguna vez completaron una lección en Duolingo o un módulo en YouTube Learning y apareció una barrita de progreso avanzando? ¿Cómo creen que el sistema sabe cuánto llevan completado?
El problema real

Un docente que comparte materiales por WhatsApp, correo o PDF no tiene forma de saber si sus estudiantes realmente los leyeron, cuánto llevan avanzado, ni qué lecciones les costaron más. El estudiante tampoco puede llevar un registro ordenado de lo que ha completado.

Su plataforma resuelve exactamente eso: un espacio donde el docente crea y el estudiante aprende con seguimiento real.

¿Qué es un LMS?

Learning Management System — Sistema de Gestión del Aprendizaje.

  • El docente crea cursos con múltiples lecciones
  • El estudiante se inscribe en los cursos que le interesan
  • El sistema registra el progreso por lección y por curso
  • El docente puede ver quiénes están inscritos en sus cursos

Plataformas reales: Moodle, Canvas, Coursera, Google Classroom. La suya es la versión en consola.

¿Quiénes usan la app?
  • Docente: crea cursos, les agrega lecciones, y consulta quiénes están inscritos y cómo van.
  • Estudiante: explora los cursos disponibles, se inscribe, va completando lecciones y consulta su progreso.

El docente no puede inscribirse en cursos. El estudiante no puede crear cursos. Sus vistas son completamente distintas.

El reto especial: calcular el progreso

Este proyecto tiene un desafío algorítmico que los otros no tienen: calcular qué porcentaje de un curso ha completado un estudiante.

Python desde cero
75%
Diseño gráfico básico
33%
Excel para todos
100%

Pregunta: ¿cómo calcularían el porcentaje? ¿Qué datos necesitan para eso?

✏️ Actividad X — hablen en equipo (3 min)
Sin abrir el computador: ¿cuáles son las 3 acciones mínimas que debe poder hacer un docente? ¿Y las 3 acciones mínimas que debe poder hacer un estudiante?

Bonus: ¿qué debería pasar cuando un estudiante completa todas las lecciones de un curso?
Pista: el progreso no es una opinión, es un cálculo. ¿Qué necesitan contar para hacerlo?

$ 10 – 20 min

¿Cómo se organizan?

// Roles del equipo → Tablero Kanban → El reto de las 4 entidades

⚠️ Atención: este es el proyecto más complejo de los tres
Tienen 4 archivos JSON y 3 servicios distintos. Si no se organizan bien desde el inicio, van a tener conflictos entre lo que cada uno programó. La planificación vale doble aquí.
Roles sugeridos del equipo
🧭
Líder / Coordinador
Gestiona el Kanban y garantiza que los JSON sean consistentes entre todos.
🖥️
Dev Menús (UI)
Construye los 3 menús en consola: principal, docente, estudiante.
⚙️
Dev Cursos + Lecciones
Implementa curso_service.py y la lógica de agregar lecciones a un curso.
📊
Dev Matrícula + Progreso
Implementa inscripciones y el cálculo de progreso. El reto más difícil.

El Dev de Matrícula + Progreso necesita entender bien cómo se relacionan los 4 JSON antes de escribir una sola línea.

Tablero Kanban del proyecto
Por hacer
🗂️ Crear estructura de carpetas
📄 Definir Usuarios.json
📄 Definir Cursos.json
📄 Definir Lecciones.json
📄 Definir Progreso.json
🖥️ Menú principal
🖥️ Menú docente
🖥️ Menú estudiante
🔐 Auth (login)
⚙️ Crear curso
⚙️ Agregar lección
⚙️ Ver cursos disponibles
⚙️ Inscribirse en curso
⚙️ Marcar lección completada
🏆 Calcular progreso %
📝 README.md
En progreso
Vacío al inicio.
¡Muevan tarjetas aquí
cuando las empiecen!
Hecho ✓
Aquí llega
el trabajo
terminado.

La tarjeta 🏆 en rosa es el "boss challenge" del proyecto: la más difícil, la que más lógica requiere, y la que más impresiona en la exposición.

La regla de coordinación: los JSON son el contrato del equipo
🤝 Antes de programar

Todo el equipo decide juntos la estructura exacta de los 4 JSON. Nadie empieza a programar hasta que todos estén de acuerdo.

🔑 Los campos que conectan

El campo curso_id en Lecciones.json debe ser exactamente el mismo id de Cursos.json. Si uno los cambia sin avisar, todo se rompe.

📋 Ejemplo de datos primero

Escriban a mano los 4 JSON con 2–3 registros de ejemplo antes de escribir una función. Si los datos se ven bien a mano, el código va a ser más fácil.

✏️ Actividad Y — decidan ahora (5 min)
¿Quién toma qué rol? Asignen un nombre a cada rol y cada persona debe saber cuáles tarjetas del Kanban son su responsabilidad esta semana. Decisión importante: ¿quién va a encarar la tarjeta de 🏆 calcular progreso?
Esa tarea es la más compleja. Que la tome quien se sienta más cómodo con la lógica. El resto del equipo puede apoyarla una vez que las otras funciones estén listas.

$ 20 – 30 min

¿Por dónde empieza el código?

// Entidades y relaciones → JSON × 4 → Arquitectura → CRUD → El cálculo del progreso

🗺️ La gran diferencia de este proyecto
PQRS tiene 2 entidades. CRM tiene 2. Este tiene 4 entidades que se relacionan entre sí. Antes de escribir una función, tienen que entender cómo se conectan.
Las 4 entidades y cómo se relacionan
👨‍🏫
Usuario
Usuarios.json
rol: docente
o estudiante
docente crea
📚
Curso
Cursos.json
tiene docente_id
contiene
📄
Lección
Lecciones.json
tiene curso_id
registrada en
📊
Progreso
Progreso.json
liga estudiante
+ curso + lección

Progreso.json es el archivo más importante: registra que tal estudiante completó tal lección de tal curso. Contar esos registros es como se calcula el porcentaje.

Estructura de carpetas en Spyder

Noten que hay 3 archivos de servicio, no 1 como en los otros proyectos.

# Tu carpeta raíz se llama: MiniLMS_Console/ │ ├── main.py │ ├── menus/ │ ├── menu_principal.py │ ├── menu_docente.py │ └── menu_estudiante.py │ ├── services/ │ ├── auth_service.py │ ├── curso_service.py # cursos y lecciones │ ├── matricula_service.py # inscripciones │ └── progreso_service.py # 🏆 el reto │ ├── utils/ │ ├── file_manager.py │ └── validators.py │ ├── data/ │ ├── Usuarios.json │ ├── Cursos.json │ ├── Lecciones.json │ └── Progreso.json │ └── README.md
Los 4 archivos JSON con ejemplos
📄 Cursos.json
{ "id": "C001", "titulo": "Python básico", "descripcion": "Intro a Python", "docente_id": "U001" }
📄 Lecciones.json
{ "id": "L001", "curso_id": "C001", "titulo": "Variables", "contenido": "En esta lección..." }
📄 Progreso.json
{ "id": "P001", "estudiante_id": "U002", "curso_id": "C001", "leccion_id": "L001", "estado": "completada" }
🔑 La clave del progreso
# Para calcular el % de un curso:
total = contar lecciones con ese curso_id
hechas = contar registros en Progreso donde estudiante_id y curso_id coincidan
% = (hechas / total) × 100
El flujo de datos — mismo patrón, más capas
Arranque
main.py
Presentación
menus/
Lógica (×3)
services/
Herramientas
utils/
Datos (×4)
data/
curso_service.py
crear_curso(usuario) listar_cursos_docente(usuario) agregar_leccion(curso_id) listar_cursos_disponibles() editar_curso(id, datos)
matricula_service.py
inscribir_estudiante(est, curso) listar_cursos_estudiante(est) ver_inscritos_curso(curso_id)
progreso_service.py 🏆
marcar_leccion_completada(est, lecc) calcular_progreso(est, curso) listar_lecciones_con_estado(est, curso)
CRUD aplicado al proyecto Mini-LMS
Operación Entidad Ejemplo concreto en su app ¿Quién lo hace?
CREATE Curso / Lección Docente crea un nuevo curso y le agrega lecciones Docente
CREATE Progreso Estudiante se inscribe en un curso (primer registro) o marca lección como completada Estudiante
READ Cursos / Lecciones Estudiante ve cursos disponibles / Docente ve sus cursos y quiénes están inscritos Ambos
READ Progreso Estudiante consulta cuánto lleva completado de cada curso (el cálculo %) Estudiante
UPDATE Curso / Lección Docente edita el título o descripción de un curso Docente
DELETE Curso Docente elimina un curso (y sus lecciones) Docente
🏆
El calcular progreso es una operación READ especial: no solo lee datos, también los procesa matemáticamente. Para hacerlo, necesitan leer Lecciones.json (para saber cuántas hay en el curso) y Progreso.json (para saber cuántas completó ese estudiante). Esos dos números dan el porcentaje. Es el único cálculo del proyecto que cruza dos archivos JSON al mismo tiempo.
✏️ Actividad Z — abran Spyder (5 min)
Creen la carpeta MiniLMS_Console/ con todas las subcarpetas y archivos vacíos. Si terminan antes: escriban a mano los 4 JSON con 2 registros de ejemplo cada uno siguiendo exactamente los campos que vieron arriba. Asegúrense de que los id coincidan entre archivos.
Ejemplo: si en Cursos.json existe "id": "C001", en Lecciones.json el campo curso_id de esa lección debe ser exactamente "C001".

🙋
Espacio para preguntas

No hay preguntas malas. Si algo no quedó claro, este es el momento.

💭 Sobre las entidades ¿Quedó claro cómo se relacionan los 4 JSON? ¿Por qué Progreso.json necesita el leccion_id y no solo el curso_id?
🏆 Sobre el progreso ¿Tienen idea de cómo sería la función calcular_progreso()? ¿Qué contarían y cómo?
💻 Sobre el código ¿Por qué hay 3 servicios y no solo 1? ¿Qué problema resuelve cada uno? ¿Qué función iría en matricula_service.py?
🤝 Sobre el equipo ¿Cómo van a asegurarse de que los 4 JSON que cada uno use sean consistentes? ¿Dónde van a guardar el "contrato" de los campos acordados?
🚀
Para la próxima sesión, deben llegar con:
✅ Carpetas y archivos creados  ·  ✅ Los 4 JSON con 2–3 registros de ejemplo (ids consistentes)  ·  ✅ Kanban montado con tareas asignadas  ·  ✅ main.py con menú de 3 opciones  ·  ✅ Decidido quién encara calcular_progreso()
Temporizador
10:00
Bloque X
Scroll to Top