from typing import List, Optional from sqlalchemy.orm import joinedload from sqlalchemy import and_ from models import Assessment, ClassGroup, Exercise from .base_repository import BaseRepository class AssessmentRepository(BaseRepository[Assessment]): """Repository pour les évaluations.""" def __init__(self): super().__init__(Assessment) def find_by_filters( self, trimester: Optional[int] = None, class_id: Optional[int] = None, sort_by: str = 'date_desc' ) -> List[Assessment]: """Trouve les évaluations selon les filtres.""" query = Assessment.query.options( joinedload(Assessment.class_group) ) # Application des filtres filters = [] if trimester: filters.append(Assessment.trimester == trimester) if class_id: filters.append(Assessment.class_group_id == class_id) if filters: query = query.filter(and_(*filters)) # Application du tri query = self._apply_sorting(query, sort_by) return query.all() def find_with_full_details(self, id: int) -> Optional[Assessment]: """Trouve une évaluation avec tous ses détails.""" return Assessment.query.options( joinedload(Assessment.class_group), joinedload(Assessment.exercises).joinedload(Exercise.grading_elements) ).filter_by(id=id).first() def find_recent(self, limit: int = 5) -> List[Assessment]: """Trouve les évaluations récentes.""" return Assessment.query.order_by( Assessment.date.desc() ).limit(limit).all() def find_by_class_group(self, class_group_id: int) -> List[Assessment]: """Trouve toutes les évaluations d'une classe.""" return Assessment.query.filter_by( class_group_id=class_group_id ).order_by(Assessment.date.desc()).all() def find_by_trimester(self, trimester: int) -> List[Assessment]: """Trouve toutes les évaluations d'un trimestre.""" return Assessment.query.filter_by( trimester=trimester ).order_by(Assessment.date.desc()).all() def count_by_class_group(self, class_group_id: int) -> int: """Compte les évaluations d'une classe.""" return Assessment.query.filter_by(class_group_id=class_group_id).count() def _apply_sorting(self, query, sort_by: str): """Applique le tri à la requête.""" if sort_by == 'date_desc': return query.order_by(Assessment.date.desc()) elif sort_by == 'date_asc': return query.order_by(Assessment.date.asc()) elif sort_by == 'title': return query.order_by(Assessment.title.asc()) elif sort_by == 'class': return query.join(ClassGroup).order_by(ClassGroup.name.asc()) return query