Delete Classrooms and students create
Browse files- app/main.py +31 -0
- app/templates/classroom_dashboard.html +17 -8
- app/templates/course_details.html +12 -3
app/main.py
CHANGED
|
@@ -329,6 +329,21 @@ class ClassroomManager(HFDatasetManager):
|
|
| 329 |
|
| 330 |
return student_name_found # Retornamos el nombre para la notificación
|
| 331 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 332 |
user_mgr = UserManager()
|
| 333 |
classroom_manager = ClassroomManager()
|
| 334 |
|
|
@@ -837,6 +852,22 @@ def add_student(course_id):
|
|
| 837 |
flash('Estudiante ya existe o error al agregar', 'red')
|
| 838 |
return redirect(url_for('course_details', course_id=course_id))
|
| 839 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 840 |
@app.route('/api/courses')
|
| 841 |
def api_courses():
|
| 842 |
"""Devuelve la lista de cursos y sus estudiantes para el frontend."""
|
|
|
|
| 329 |
|
| 330 |
return student_name_found # Retornamos el nombre para la notificación
|
| 331 |
|
| 332 |
+
def delete_course(self, course_id):
|
| 333 |
+
"""Elimina un curso por ID."""
|
| 334 |
+
self.classrooms = [c for c in self.classrooms if c['id'] != course_id]
|
| 335 |
+
self.save()
|
| 336 |
+
return True
|
| 337 |
+
|
| 338 |
+
def delete_student(self, course_id, student_id):
|
| 339 |
+
"""Elimina un estudiante de un curso."""
|
| 340 |
+
course = self.get_course(course_id)
|
| 341 |
+
if course:
|
| 342 |
+
course['students'] = [s for s in course['students'] if s.get('id') != student_id]
|
| 343 |
+
self.save()
|
| 344 |
+
return True
|
| 345 |
+
return False
|
| 346 |
+
|
| 347 |
user_mgr = UserManager()
|
| 348 |
classroom_manager = ClassroomManager()
|
| 349 |
|
|
|
|
| 852 |
flash('Estudiante ya existe o error al agregar', 'red')
|
| 853 |
return redirect(url_for('course_details', course_id=course_id))
|
| 854 |
|
| 855 |
+
@app.route('/classroom/<course_id>/delete', methods=['POST'])
|
| 856 |
+
@login_required
|
| 857 |
+
def delete_course(course_id):
|
| 858 |
+
classroom_manager.delete_course(course_id)
|
| 859 |
+
flash('Curso eliminado', 'green')
|
| 860 |
+
return redirect(url_for('classroom_dashboard'))
|
| 861 |
+
|
| 862 |
+
@app.route('/classroom/<course_id>/delete_student/<student_id>', methods=['POST'])
|
| 863 |
+
@login_required
|
| 864 |
+
def delete_student(course_id, student_id):
|
| 865 |
+
if classroom_manager.delete_student(course_id, student_id):
|
| 866 |
+
flash('Estudiante eliminado', 'green')
|
| 867 |
+
else:
|
| 868 |
+
flash('Error al eliminar estudiante', 'red')
|
| 869 |
+
return redirect(url_for('course_details', course_id=course_id))
|
| 870 |
+
|
| 871 |
@app.route('/api/courses')
|
| 872 |
def api_courses():
|
| 873 |
"""Devuelve la lista de cursos y sus estudiantes para el frontend."""
|
app/templates/classroom_dashboard.html
CHANGED
|
@@ -16,14 +16,23 @@
|
|
| 16 |
|
| 17 |
<div class="card-grid">
|
| 18 |
{% for course in courses %}
|
| 19 |
-
<
|
| 20 |
-
|
| 21 |
-
|
| 22 |
-
<
|
| 23 |
-
|
| 24 |
-
|
| 25 |
-
|
| 26 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 27 |
{% else %}
|
| 28 |
<div style="grid-column: 1 / -1; text-align: center; color: var(--text-dim);">
|
| 29 |
<p>No hay cursos creados. ¡Crea el primero arriba!</p>
|
|
|
|
| 16 |
|
| 17 |
<div class="card-grid">
|
| 18 |
{% for course in courses %}
|
| 19 |
+
<div class="card glass" style="text-align: left; align-items: flex-start; position: relative;">
|
| 20 |
+
<a href="{{ url_for('course_details', course_id=course.id) }}"
|
| 21 |
+
style="text-decoration: none; color: inherit; flex: 1;">
|
| 22 |
+
<div style="display: flex; justify-content: space-between; width: 100%;">
|
| 23 |
+
<h2 style="margin: 0;">{{ course.name }}</h2>
|
| 24 |
+
<i class="fas fa-chalkboard-teacher" style="font-size: 1.5rem; margin: 0;"></i>
|
| 25 |
+
</div>
|
| 26 |
+
<p class="text-dim" style="margin-top: 1rem;">{{ course.students|length }} Estudiantes inscritos</p>
|
| 27 |
+
</a>
|
| 28 |
+
<form action="{{ url_for('delete_course', course_id=course.id) }}" method="POST"
|
| 29 |
+
style="position: absolute; top: 1rem; right: 1rem;" onsubmit="return confirm('¿Eliminar este curso?');">
|
| 30 |
+
<button type="submit" class="btn"
|
| 31 |
+
style="background: rgba(239, 68, 68, 0.2); color: #ef4444; padding: 0.5rem; border-radius: 0.5rem;">
|
| 32 |
+
<i class="fas fa-trash"></i>
|
| 33 |
+
</button>
|
| 34 |
+
</form>
|
| 35 |
+
</div>
|
| 36 |
{% else %}
|
| 37 |
<div style="grid-column: 1 / -1; text-align: center; color: var(--text-dim);">
|
| 38 |
<p>No hay cursos creados. ¡Crea el primero arriba!</p>
|
app/templates/course_details.html
CHANGED
|
@@ -27,9 +27,18 @@
|
|
| 27 |
<ul style="list-style: none; padding: 0; margin-top: 1rem; max-height: 400px; overflow-y: auto;">
|
| 28 |
{% for student in course.students %}
|
| 29 |
<li
|
| 30 |
-
style="padding: 0.8rem; border-bottom: 1px solid rgba(255,255,255,0.1); display: flex; align-items: center;
|
| 31 |
-
<
|
| 32 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 33 |
</li>
|
| 34 |
{% else %}
|
| 35 |
<li class="text-dim">No hay estudiantes inscritos.</li>
|
|
|
|
| 27 |
<ul style="list-style: none; padding: 0; margin-top: 1rem; max-height: 400px; overflow-y: auto;">
|
| 28 |
{% for student in course.students %}
|
| 29 |
<li
|
| 30 |
+
style="padding: 0.8rem; border-bottom: 1px solid rgba(255,255,255,0.1); display: flex; align-items: center; justify-content: space-between;">
|
| 31 |
+
<div style="display: flex; align-items: center; gap: 0.5rem;">
|
| 32 |
+
<i class="fas fa-user-graduate" style="color: var(--accent);"></i>
|
| 33 |
+
{{ student.name }}
|
| 34 |
+
</div>
|
| 35 |
+
<form action="{{ url_for('delete_student', course_id=course.id, student_id=student.id) }}"
|
| 36 |
+
method="POST" onsubmit="return confirm('¿Eliminar a {{ student.name }}?');">
|
| 37 |
+
<button type="submit" class="btn"
|
| 38 |
+
style="background: rgba(239, 68, 68, 0.2); color: #ef4444; padding: 0.3rem 0.6rem; font-size: 0.8rem;">
|
| 39 |
+
<i class="fas fa-trash"></i>
|
| 40 |
+
</button>
|
| 41 |
+
</form>
|
| 42 |
</li>
|
| 43 |
{% else %}
|
| 44 |
<li class="text-dim">No hay estudiantes inscritos.</li>
|