feat: adding new classes is done
This commit is contained in:
170
routes/classes.py
Normal file
170
routes/classes.py
Normal 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)
|
||||
Reference in New Issue
Block a user