feat: adding new classes is done

This commit is contained in:
2025-08-07 20:12:12 +02:00
parent 3126d6c24c
commit 35bf575125
10 changed files with 1919 additions and 13 deletions

170
routes/classes.py Normal file
View File

@@ -0,0 +1,170 @@
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)