refact: use repositories patterns for classes
This commit is contained in:
@@ -1,8 +1,8 @@
|
||||
from flask import Blueprint, render_template, redirect, url_for, flash, request, jsonify, current_app
|
||||
from models import db, ClassGroup
|
||||
from models import db
|
||||
from forms import AssessmentForm
|
||||
from services import AssessmentService
|
||||
from repositories import AssessmentRepository
|
||||
from repositories import AssessmentRepository, ClassRepository
|
||||
from utils import handle_db_errors, ValidationError
|
||||
|
||||
bp = Blueprint('assessments', __name__, url_prefix='/assessments')
|
||||
@@ -11,6 +11,7 @@ bp = Blueprint('assessments', __name__, url_prefix='/assessments')
|
||||
@handle_db_errors
|
||||
def list():
|
||||
assessment_repo = AssessmentRepository()
|
||||
class_repo = ClassRepository()
|
||||
|
||||
# Récupérer les paramètres de filtrage
|
||||
trimester_filter = request.args.get('trimester', '')
|
||||
@@ -30,7 +31,7 @@ def list():
|
||||
total_assessments = assessment_repo.find_by_filters()
|
||||
|
||||
# Récupérer toutes les classes pour le filtre
|
||||
classes = ClassGroup.query.order_by(ClassGroup.name.asc()).all()
|
||||
classes = class_repo.find_for_form_choices()
|
||||
|
||||
return render_template('assessments.html',
|
||||
assessments=assessments,
|
||||
@@ -115,8 +116,10 @@ def _handle_unified_assessment_request(form, assessment=None, is_edit=False):
|
||||
@handle_db_errors
|
||||
def edit(id):
|
||||
assessment_repo = AssessmentRepository()
|
||||
class_repo = ClassRepository()
|
||||
assessment = assessment_repo.get_with_full_details_or_404(id)
|
||||
form = AssessmentForm(obj=assessment)
|
||||
form.populate_class_choices(class_repo)
|
||||
|
||||
result = _handle_unified_assessment_request(form, assessment, is_edit=True)
|
||||
if result:
|
||||
@@ -163,7 +166,9 @@ def edit(id):
|
||||
@handle_db_errors
|
||||
def new():
|
||||
from app_config import config_manager
|
||||
class_repo = ClassRepository()
|
||||
form = AssessmentForm()
|
||||
form.populate_class_choices(class_repo)
|
||||
|
||||
result = _handle_unified_assessment_request(form, is_edit=False)
|
||||
if result:
|
||||
|
||||
@@ -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