diff --git a/routes/classes.py b/routes/classes.py index 60655d3..fa2eb29 100644 --- a/routes/classes.py +++ b/routes/classes.py @@ -797,6 +797,125 @@ def cancel_departure(): flash('Erreur lors de l\'annulation du départ', 'error') return redirect(request.referrer or url_for('classes')) +@bp.route('//students//edit', methods=['POST']) +@handle_db_errors +def edit_student(class_id, student_id): + """Modification des informations d'un élève.""" + try: + # Vérifier que la classe existe + class_repo = ClassRepository() + class_group = class_repo.get_or_404(class_id) + + # Vérifier que l'élève existe + student = Student.query.get_or_404(student_id) + + # Vérifier que l'élève est bien dans cette classe actuellement + current_class = student.get_current_class() + if not current_class or current_class.id != class_id: + flash("L'élève n'est pas inscrit dans cette classe", 'error') + return redirect(url_for('classes.students', id=class_id)) + + # Récupérer les données du formulaire + first_name = request.form.get('first_name', '').strip() + last_name = request.form.get('last_name', '').strip() + email = request.form.get('email', '').strip() + + # Validation + if not first_name or not last_name: + flash('Le prénom et le nom sont obligatoires', 'error') + return redirect(url_for('classes.students', id=class_id)) + + # Vérifier l'unicité de l'email si fourni + if email: + existing_student = Student.query.filter_by(email=email).first() + if existing_student and existing_student.id != student_id: + flash('Un autre élève utilise déjà cet email', 'error') + return redirect(url_for('classes.students', id=class_id)) + + # Sauvegarder les anciennes valeurs pour le log + old_values = { + 'first_name': student.first_name, + 'last_name': student.last_name, + 'email': student.email + } + + # Mettre à jour l'élève + student.first_name = first_name + student.last_name = last_name + student.email = email if email else None + + db.session.commit() + + # Log de l'opération + changes = [] + if old_values['first_name'] != first_name: + changes.append(f"prénom: '{old_values['first_name']}' → '{first_name}'") + if old_values['last_name'] != last_name: + changes.append(f"nom: '{old_values['last_name']}' → '{last_name}'") + if old_values['email'] != (email if email else None): + old_email = old_values['email'] or '(vide)' + new_email = email or '(vide)' + changes.append(f"email: '{old_email}' → '{new_email}'") + + if changes: + current_app.logger.info(f'Élève modifié - ID {student_id}: {", ".join(changes)}') + + flash(f'Élève {first_name} {last_name} modifié avec succès', 'success') + return redirect(url_for('classes.students', id=class_id) + '?reload=1') + + except Exception as e: + db.session.rollback() + current_app.logger.error(f'Erreur modification élève {student_id}: {e}') + flash('Erreur lors de la modification de l\'élève', 'error') + return redirect(url_for('classes.students', id=class_id)) + +@bp.route('//students//update-email', methods=['POST']) +@handle_db_errors +def update_student_email(class_id, student_id): + """Mise à jour de l'email d'un élève (AJAX).""" + try: + # Vérifier que la classe existe + class_repo = ClassRepository() + class_group = class_repo.get_or_404(class_id) + + # Vérifier que l'élève existe + student = Student.query.get_or_404(student_id) + + # Vérifier que l'élève est bien dans cette classe actuellement + current_class = student.get_current_class() + if not current_class or current_class.id != class_id: + return jsonify({'success': False, 'error': "L'élève n'est pas inscrit dans cette classe"}), 403 + + # Récupérer le nouvel email + new_email = request.form.get('email', '').strip() + + # Vérifier l'unicité de l'email si fourni + if new_email: + existing_student = Student.query.filter_by(email=new_email).first() + if existing_student and existing_student.id != student_id: + return jsonify({'success': False, 'error': 'Un autre élève utilise déjà cet email'}), 400 + + # Sauvegarder l'ancienne valeur pour le log + old_email = student.email + + # Mettre à jour l'email + student.email = new_email if new_email else None + db.session.commit() + + # Log de l'opération + current_app.logger.info(f'Email élève modifié - ID {student_id}: "{old_email or "(vide)"}" → "{new_email or "(vide)"}"') + + return jsonify({ + 'success': True, + 'message': f'Email de {student.first_name} {student.last_name} mis à jour', + 'new_email': new_email or None + }) + + except Exception as e: + db.session.rollback() + current_app.logger.error(f'Erreur mise à jour email élève {student_id}: {e}') + return jsonify({'success': False, 'error': 'Erreur lors de la mise à jour de l\'email'}), 500 + @bp.route('//import-students-csv', methods=['POST']) @handle_db_errors def import_students_csv(id): diff --git a/templates/class_students.html b/templates/class_students.html index 11869f1..a22219e 100644 --- a/templates/class_students.html +++ b/templates/class_students.html @@ -59,53 +59,9 @@ - {# Statistiques d'effectifs #} -
-
-
-
- - - -
-
-

{{ stats.total_current }}

-

Élèves actuels

-
-
-
- -
-
-
- - - -
-
-

{{ stats.recent_arrivals }}

-

Arrivées (30j)

-
-
-
- -
-
-
- - - -
-
-

{{ stats.recent_departures }}

-

Départs (30j)

-
-
-
-
- {# Liste des élèves actuels #} -
+ {# Tableau des élèves actuels #} +

@@ -116,34 +72,192 @@

{% if current_students %} -
+ {# Version desktop/tablette : tableau complet #} + + + {# Version mobile : cards compactes #} +
{% for student in current_students %} {% set enrollment = student.get_current_enrollment() %} -
-
-
- {{ student.first_name[0] }}{{ student.last_name[0] }} -
-
-
{{ student.first_name }} {{ student.last_name }}
-
+
+
+
+
+ {{ student.first_name[0] }}{{ student.last_name[0] }} +
+
+
{{ student.first_name }} {{ student.last_name }}
+
+ +
+ {% if student.email %} +
{{ student.email }}
+ {% else %} +
+ + + + Cliquez pour ajouter +
+ {% endif %} + +
+ + + +
{% if enrollment %} - Inscrit depuis le {{ enrollment.enrollment_date.strftime('%d/%m/%Y') }} - {% if enrollment.enrollment_reason %} - ({{ enrollment.enrollment_reason }}) - {% endif %} +
+ Inscrit le {{ enrollment.enrollment_date.strftime('%d/%m/%Y') }} +
{% endif %}
- -
+
@@ -469,6 +583,7 @@
+ {# Modal d'import CSV #}