refact: use repositories patterns for classes
This commit is contained in:
@@ -2,6 +2,7 @@ from flask import Blueprint, render_template, redirect, url_for, flash, request,
|
||||
from models import db, ClassGroup, Student, Assessment
|
||||
from forms import ClassGroupForm
|
||||
from utils import handle_db_errors, ValidationError
|
||||
from repositories.class_repository import ClassRepository
|
||||
|
||||
bp = Blueprint('classes', __name__, url_prefix='/classes')
|
||||
|
||||
@@ -20,12 +21,12 @@ def new():
|
||||
def create():
|
||||
"""Traitement de la création d'une classe."""
|
||||
form = ClassGroupForm()
|
||||
class_repo = ClassRepository()
|
||||
|
||||
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:
|
||||
if class_repo.exists_by_name(form.name.data):
|
||||
flash('Une classe avec ce nom existe déjà.', 'error')
|
||||
return render_template('class_form.html',
|
||||
form=form,
|
||||
@@ -60,7 +61,8 @@ def create():
|
||||
@handle_db_errors
|
||||
def edit(id):
|
||||
"""Formulaire de modification d'une classe."""
|
||||
class_group = ClassGroup.query.get_or_404(id)
|
||||
class_repo = ClassRepository()
|
||||
class_group = class_repo.get_or_404(id)
|
||||
|
||||
form = ClassGroupForm(obj=class_group)
|
||||
return render_template('class_form.html',
|
||||
@@ -73,18 +75,14 @@ def edit(id):
|
||||
@handle_db_errors
|
||||
def update(id):
|
||||
"""Traitement de la modification d'une classe."""
|
||||
class_group = ClassGroup.query.get_or_404(id)
|
||||
class_repo = ClassRepository()
|
||||
class_group = class_repo.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:
|
||||
if class_repo.exists_by_name(form.name.data, exclude_id=id):
|
||||
flash('Une autre classe avec ce nom existe déjà.', 'error')
|
||||
return render_template('class_form.html',
|
||||
form=form,
|
||||
@@ -118,14 +116,16 @@ def update(id):
|
||||
@handle_db_errors
|
||||
def delete(id):
|
||||
"""Suppression d'une classe avec vérifications."""
|
||||
class_group = ClassGroup.query.get_or_404(id)
|
||||
class_repo = ClassRepository()
|
||||
class_group = class_repo.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()
|
||||
can_delete, dependencies = class_repo.can_be_deleted(id)
|
||||
|
||||
if students_count > 0 or assessments_count > 0:
|
||||
if not can_delete:
|
||||
students_count = dependencies['students']
|
||||
assessments_count = dependencies['assessments']
|
||||
flash(
|
||||
f'Impossible de supprimer la classe "{class_group.name}". '
|
||||
f'Elle contient {students_count} élève(s) et {assessments_count} évaluation(s). '
|
||||
@@ -152,17 +152,19 @@ def delete(id):
|
||||
@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)
|
||||
class_repo = ClassRepository()
|
||||
class_group = class_repo.find_with_full_details(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()
|
||||
if not class_group:
|
||||
# Gestion manuelle du 404 car find_with_full_details retourne None
|
||||
from flask import abort
|
||||
abort(404)
|
||||
|
||||
# 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()
|
||||
# Trier les étudiants par nom (optimisé en Python car déjà chargés)
|
||||
students = sorted(class_group.students, key=lambda s: (s.last_name, s.first_name))
|
||||
|
||||
# Prendre les 5 évaluations les plus récentes (optimisé en Python car déjà chargées)
|
||||
recent_assessments = sorted(class_group.assessments, key=lambda a: a.date, reverse=True)[:5]
|
||||
|
||||
return render_template('class_details.html',
|
||||
class_group=class_group,
|
||||
|
||||
Reference in New Issue
Block a user