170 lines
		
	
	
		
			6.6 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			170 lines
		
	
	
		
			6.6 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| from flask import Blueprint, render_template, redirect, url_for, flash, request, jsonify, current_app
 | |
| from models import db, ClassGroup, Student, Assessment
 | |
| from forms import ClassGroupForm
 | |
| from utils import handle_db_errors, ValidationError
 | |
| 
 | |
| bp = Blueprint('classes', __name__, url_prefix='/classes')
 | |
| 
 | |
| @bp.route('/new')
 | |
| @handle_db_errors
 | |
| def new():
 | |
|     """Formulaire de création d'une nouvelle classe."""
 | |
|     form = ClassGroupForm()
 | |
|     return render_template('class_form.html', 
 | |
|                          form=form, 
 | |
|                          title="Créer une nouvelle classe",
 | |
|                          is_edit=False)
 | |
| 
 | |
| @bp.route('/', methods=['POST'])
 | |
| @handle_db_errors
 | |
| def create():
 | |
|     """Traitement de la création d'une classe."""
 | |
|     form = ClassGroupForm()
 | |
|     
 | |
|     if form.validate_on_submit():
 | |
|         try:
 | |
|             # Vérification d'unicité du nom de classe
 | |
|             existing_class = ClassGroup.query.filter_by(name=form.name.data).first()
 | |
|             if existing_class:
 | |
|                 flash('Une classe avec ce nom existe déjà.', 'error')
 | |
|                 return render_template('class_form.html', 
 | |
|                                      form=form, 
 | |
|                                      title="Créer une nouvelle classe",
 | |
|                                      is_edit=False)
 | |
|             
 | |
|             # Création de la nouvelle classe
 | |
|             class_group = ClassGroup(
 | |
|                 name=form.name.data,
 | |
|                 description=form.description.data,
 | |
|                 year=form.year.data
 | |
|             )
 | |
|             
 | |
|             db.session.add(class_group)
 | |
|             db.session.commit()
 | |
|             
 | |
|             current_app.logger.info(f'Nouvelle classe créée: {class_group.name}')
 | |
|             flash(f'Classe "{class_group.name}" créée avec succès !', 'success')
 | |
|             return redirect(url_for('classes'))
 | |
|             
 | |
|         except Exception as e:
 | |
|             db.session.rollback()
 | |
|             current_app.logger.error(f'Erreur lors de la création de la classe: {e}')
 | |
|             flash('Erreur lors de la création de la classe.', 'error')
 | |
|     
 | |
|     return render_template('class_form.html', 
 | |
|                          form=form, 
 | |
|                          title="Créer une nouvelle classe",
 | |
|                          is_edit=False)
 | |
| 
 | |
| @bp.route('/<int:id>/edit')
 | |
| @handle_db_errors
 | |
| def edit(id):
 | |
|     """Formulaire de modification d'une classe."""
 | |
|     class_group = ClassGroup.query.get_or_404(id)
 | |
|     
 | |
|     form = ClassGroupForm(obj=class_group)
 | |
|     return render_template('class_form.html', 
 | |
|                          form=form, 
 | |
|                          class_group=class_group,
 | |
|                          title=f"Modifier la classe {class_group.name}",
 | |
|                          is_edit=True)
 | |
| 
 | |
| @bp.route('/<int:id>', methods=['POST'])
 | |
| @handle_db_errors
 | |
| def update(id):
 | |
|     """Traitement de la modification d'une classe."""
 | |
|     class_group = ClassGroup.query.get_or_404(id)
 | |
|     form = ClassGroupForm()
 | |
|     
 | |
|     if form.validate_on_submit():
 | |
|         try:
 | |
|             # Vérification d'unicité du nom (sauf si c'est le même nom)
 | |
|             existing_class = ClassGroup.query.filter(
 | |
|                 ClassGroup.name == form.name.data,
 | |
|                 ClassGroup.id != id
 | |
|             ).first()
 | |
|             
 | |
|             if existing_class:
 | |
|                 flash('Une autre classe avec ce nom existe déjà.', 'error')
 | |
|                 return render_template('class_form.html', 
 | |
|                                      form=form, 
 | |
|                                      class_group=class_group,
 | |
|                                      title=f"Modifier la classe {class_group.name}",
 | |
|                                      is_edit=True)
 | |
|             
 | |
|             # Mise à jour des données
 | |
|             class_group.name = form.name.data
 | |
|             class_group.description = form.description.data
 | |
|             class_group.year = form.year.data
 | |
|             
 | |
|             db.session.commit()
 | |
|             
 | |
|             current_app.logger.info(f'Classe modifiée: {class_group.name}')
 | |
|             flash(f'Classe "{class_group.name}" modifiée avec succès !', 'success')
 | |
|             return redirect(url_for('classes'))
 | |
|             
 | |
|         except Exception as e:
 | |
|             db.session.rollback()
 | |
|             current_app.logger.error(f'Erreur lors de la modification de la classe: {e}')
 | |
|             flash('Erreur lors de la modification de la classe.', 'error')
 | |
|     
 | |
|     return render_template('class_form.html', 
 | |
|                          form=form, 
 | |
|                          class_group=class_group,
 | |
|                          title=f"Modifier la classe {class_group.name}",
 | |
|                          is_edit=True)
 | |
| 
 | |
| @bp.route('/<int:id>/delete', methods=['POST'])
 | |
| @handle_db_errors
 | |
| def delete(id):
 | |
|     """Suppression d'une classe avec vérifications."""
 | |
|     class_group = ClassGroup.query.get_or_404(id)
 | |
|     
 | |
|     try:
 | |
|         # Vérifier s'il y a des étudiants ou des évaluations liés
 | |
|         students_count = Student.query.filter_by(class_group_id=id).count()
 | |
|         assessments_count = Assessment.query.filter_by(class_group_id=id).count()
 | |
|         
 | |
|         if students_count > 0 or assessments_count > 0:
 | |
|             flash(
 | |
|                 f'Impossible de supprimer la classe "{class_group.name}". '
 | |
|                 f'Elle contient {students_count} élève(s) et {assessments_count} évaluation(s). '
 | |
|                 f'Supprimez d\'abord ces éléments.',
 | |
|                 'error'
 | |
|             )
 | |
|             return redirect(url_for('classes'))
 | |
|         
 | |
|         # Suppression de la classe
 | |
|         db.session.delete(class_group)
 | |
|         db.session.commit()
 | |
|         
 | |
|         current_app.logger.info(f'Classe supprimée: {class_group.name}')
 | |
|         flash(f'Classe "{class_group.name}" supprimée avec succès.', 'success')
 | |
|         
 | |
|     except Exception as e:
 | |
|         db.session.rollback()
 | |
|         current_app.logger.error(f'Erreur lors de la suppression de la classe: {e}')
 | |
|         flash('Erreur lors de la suppression de la classe.', 'error')
 | |
|     
 | |
|     return redirect(url_for('classes'))
 | |
| 
 | |
| @bp.route('/<int:id>/details')
 | |
| @handle_db_errors
 | |
| def details(id):
 | |
|     """Page de détail d'une classe avec ses étudiants et évaluations."""
 | |
|     class_group = ClassGroup.query.get_or_404(id)
 | |
|     
 | |
|     # Récupérer les étudiants triés par nom
 | |
|     students = Student.query.filter_by(class_group_id=id).order_by(
 | |
|         Student.last_name, Student.first_name
 | |
|     ).all()
 | |
|     
 | |
|     # Récupérer les évaluations récentes
 | |
|     recent_assessments = Assessment.query.filter_by(class_group_id=id).order_by(
 | |
|         Assessment.date.desc()
 | |
|     ).limit(5).all()
 | |
|     
 | |
|     return render_template('class_details.html', 
 | |
|                          class_group=class_group,
 | |
|                          students=students,
 | |
|                          recent_assessments=recent_assessments) |