feat: improve student listing and email editing

This commit is contained in:
2025-09-09 21:29:47 +02:00
parent f1ae9faef8
commit 2c549c7234
2 changed files with 500 additions and 63 deletions

View File

@@ -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('/<int:class_id>/students/<int:student_id>/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('/<int:class_id>/students/<int:student_id>/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('/<int:id>/import-students-csv', methods=['POST'])
@handle_db_errors
def import_students_csv(id):