Split course by teachers
Browse files- app/main.py +21 -9
app/main.py
CHANGED
|
@@ -323,16 +323,19 @@ class ClassroomManager(HFDatasetManager):
|
|
| 323 |
else:
|
| 324 |
print("[ClassroomManager] Failed to save to HF, data saved locally only")
|
| 325 |
|
| 326 |
-
def get_courses(self):
|
|
|
|
|
|
|
| 327 |
return self.classrooms
|
| 328 |
|
| 329 |
def get_course(self, course_id):
|
| 330 |
return next((c for c in self.classrooms if c['id'] == course_id), None)
|
| 331 |
|
| 332 |
-
def create_course(self, name):
|
| 333 |
course = {
|
| 334 |
"id": str(uuid.uuid4()),
|
| 335 |
"name": name,
|
|
|
|
| 336 |
"students": []
|
| 337 |
}
|
| 338 |
self.classrooms.append(course)
|
|
@@ -1015,7 +1018,7 @@ def guia_gestion():
|
|
| 1015 |
@app.route('/classroom/dashboard')
|
| 1016 |
@login_required
|
| 1017 |
def classroom_dashboard():
|
| 1018 |
-
courses = classroom_manager.get_courses()
|
| 1019 |
return render_template('classroom_dashboard.html', title="Gestión de Aulas", courses=courses)
|
| 1020 |
|
| 1021 |
@app.route('/classroom/create', methods=['POST'])
|
|
@@ -1023,7 +1026,7 @@ def classroom_dashboard():
|
|
| 1023 |
def create_course():
|
| 1024 |
name = request.form.get('name')
|
| 1025 |
if name:
|
| 1026 |
-
classroom_manager.create_course(name)
|
| 1027 |
flash('Curso creado exitosamente', 'green')
|
| 1028 |
else:
|
| 1029 |
flash('El nombre del curso es requerido', 'red')
|
|
@@ -1033,8 +1036,8 @@ def create_course():
|
|
| 1033 |
@login_required
|
| 1034 |
def course_details(course_id):
|
| 1035 |
course = classroom_manager.get_course(course_id)
|
| 1036 |
-
if not course:
|
| 1037 |
-
flash('Curso no encontrado', 'red')
|
| 1038 |
return redirect(url_for('classroom_dashboard'))
|
| 1039 |
return render_template('course_details.html', title=course['name'], course=course)
|
| 1040 |
|
|
@@ -1077,7 +1080,12 @@ def delete_student(course_id, student_id):
|
|
| 1077 |
@app.route('/api/courses')
|
| 1078 |
def api_courses():
|
| 1079 |
"""Devuelve la lista de cursos y sus estudiantes para el frontend."""
|
| 1080 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1081 |
return jsonify(courses)
|
| 1082 |
|
| 1083 |
@app.route('/api/faces', methods=['GET', 'POST'])
|
|
@@ -1130,15 +1138,19 @@ class AttendancePDF(FPDF):
|
|
| 1130 |
@app.route('/export/attendance/<student_id>')
|
| 1131 |
@login_required
|
| 1132 |
def export_attendance(student_id):
|
|
|
|
|
|
|
|
|
|
| 1133 |
# Buscar registros del estudiante
|
| 1134 |
all_logs = []
|
| 1135 |
if isinstance(face_mgr.faces, dict):
|
| 1136 |
all_logs = face_mgr.faces.get("attendance_log", [])
|
| 1137 |
|
| 1138 |
-
|
|
|
|
| 1139 |
|
| 1140 |
if not student_logs:
|
| 1141 |
-
flash("No hay registros de asistencia para este estudiante.", "orange")
|
| 1142 |
return redirect(request.referrer or url_for('classroom_dashboard'))
|
| 1143 |
|
| 1144 |
student_name = student_logs[0].get('student_name', 'Estudiante')
|
|
|
|
| 323 |
else:
|
| 324 |
print("[ClassroomManager] Failed to save to HF, data saved locally only")
|
| 325 |
|
| 326 |
+
def get_courses(self, creator_id=None):
|
| 327 |
+
if creator_id:
|
| 328 |
+
return [c for c in self.classrooms if c.get('creator_id') == creator_id]
|
| 329 |
return self.classrooms
|
| 330 |
|
| 331 |
def get_course(self, course_id):
|
| 332 |
return next((c for c in self.classrooms if c['id'] == course_id), None)
|
| 333 |
|
| 334 |
+
def create_course(self, name, creator_id=None):
|
| 335 |
course = {
|
| 336 |
"id": str(uuid.uuid4()),
|
| 337 |
"name": name,
|
| 338 |
+
"creator_id": creator_id,
|
| 339 |
"students": []
|
| 340 |
}
|
| 341 |
self.classrooms.append(course)
|
|
|
|
| 1018 |
@app.route('/classroom/dashboard')
|
| 1019 |
@login_required
|
| 1020 |
def classroom_dashboard():
|
| 1021 |
+
courses = classroom_manager.get_courses(creator_id=current_user.id)
|
| 1022 |
return render_template('classroom_dashboard.html', title="Gestión de Aulas", courses=courses)
|
| 1023 |
|
| 1024 |
@app.route('/classroom/create', methods=['POST'])
|
|
|
|
| 1026 |
def create_course():
|
| 1027 |
name = request.form.get('name')
|
| 1028 |
if name:
|
| 1029 |
+
classroom_manager.create_course(name, creator_id=current_user.id)
|
| 1030 |
flash('Curso creado exitosamente', 'green')
|
| 1031 |
else:
|
| 1032 |
flash('El nombre del curso es requerido', 'red')
|
|
|
|
| 1036 |
@login_required
|
| 1037 |
def course_details(course_id):
|
| 1038 |
course = classroom_manager.get_course(course_id)
|
| 1039 |
+
if not course or course.get('creator_id') != current_user.id:
|
| 1040 |
+
flash('Curso no encontrado o no tienes permiso para verlo', 'red')
|
| 1041 |
return redirect(url_for('classroom_dashboard'))
|
| 1042 |
return render_template('course_details.html', title=course['name'], course=course)
|
| 1043 |
|
|
|
|
| 1080 |
@app.route('/api/courses')
|
| 1081 |
def api_courses():
|
| 1082 |
"""Devuelve la lista de cursos y sus estudiantes para el frontend."""
|
| 1083 |
+
# Si el usuario está autenticado, solo mostramos sus cursos.
|
| 1084 |
+
# Si no, por ahora no mostramos ninguno para mantener la privacidad.
|
| 1085 |
+
if current_user.is_authenticated:
|
| 1086 |
+
courses = classroom_manager.get_courses(creator_id=current_user.id)
|
| 1087 |
+
else:
|
| 1088 |
+
courses = []
|
| 1089 |
return jsonify(courses)
|
| 1090 |
|
| 1091 |
@app.route('/api/faces', methods=['GET', 'POST'])
|
|
|
|
| 1138 |
@app.route('/export/attendance/<student_id>')
|
| 1139 |
@login_required
|
| 1140 |
def export_attendance(student_id):
|
| 1141 |
+
# Buscar cursos del usuario actual para filtrar
|
| 1142 |
+
my_courses = {c['id'] for c in classroom_manager.get_courses(creator_id=current_user.id)}
|
| 1143 |
+
|
| 1144 |
# Buscar registros del estudiante
|
| 1145 |
all_logs = []
|
| 1146 |
if isinstance(face_mgr.faces, dict):
|
| 1147 |
all_logs = face_mgr.faces.get("attendance_log", [])
|
| 1148 |
|
| 1149 |
+
# Filtrar logs: deben ser del estudiante Y de un curso que pertenezca al usuario actual
|
| 1150 |
+
student_logs = [log for log in all_logs if log.get('student_id') == student_id and log.get('course_id') in my_courses]
|
| 1151 |
|
| 1152 |
if not student_logs:
|
| 1153 |
+
flash("No hay registros de asistencia para este estudiante en tus cursos.", "orange")
|
| 1154 |
return redirect(request.referrer or url_for('classroom_dashboard'))
|
| 1155 |
|
| 1156 |
student_name = student_logs[0].get('student_name', 'Estudiante')
|