feat: improve student listing and email editing
This commit is contained in:
@@ -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):
|
||||
|
||||
Reference in New Issue
Block a user