Files
notytex/backend/schemas/class_group.py

209 lines
4.5 KiB
Python

"""
Schemas Pydantic pour ClassGroup.
"""
from datetime import date
from typing import Optional, List, Dict
from pydantic import Field
from schemas.common import BaseSchema
class ClassGroupBase(BaseSchema):
"""Schema de base pour ClassGroup."""
name: str
description: Optional[str] = None
year: str
class ClassGroupRead(ClassGroupBase):
"""Schema pour la lecture d'un ClassGroup."""
id: int
students_count: int = 0
assessments_count: int = 0
class ClassGroupDetail(ClassGroupRead):
"""Schema détaillé avec statistiques."""
assessments_count: int = 0
class ClassGroupList(BaseSchema):
"""Schema pour la liste des classes."""
classes: List[ClassGroupRead]
total: int
# Schemas pour les statistiques de classe
class TrimesterStats(BaseSchema):
"""Statistiques par trimestre."""
total: int
completed: int
in_progress: int
not_started: int
class ClassStatistics(BaseSchema):
"""Statistiques complètes d'une classe."""
class_id: int
class_name: str
students_count: int
trimester_stats: TrimesterStats
# Statistiques des résultats (optionnel)
mean: Optional[float] = None
median: Optional[float] = None
min_score: Optional[float] = None
max_score: Optional[float] = None
class DomainAnalysis(BaseSchema):
"""Analyse par domaine."""
name: str
color: str
total_points: float
elements_count: int
class CompetenceAnalysis(BaseSchema):
"""Analyse par compétence."""
name: str
color: str
total_points: float
elements_count: int
# Schemas pour les opérations d'écriture (CRUD)
class ClassGroupCreate(ClassGroupBase):
"""Schema pour créer une classe."""
pass
class ClassGroupUpdate(BaseSchema):
"""Schema pour modifier une classe."""
name: Optional[str] = None
description: Optional[str] = None
year: Optional[str] = None
class ClassGroupResponse(BaseSchema):
"""Schema de réponse après création/modification."""
id: int
name: str
description: Optional[str] = None
year: str
message: str = ""
# Schemas pour le dashboard de statistiques complet
class StudentAverage(BaseSchema):
"""Moyenne d'un élève pour un trimestre."""
student_id: int
first_name: str
last_name: str
full_name: str
average: Optional[float] = None
assessment_count: int = 0
assessment_scores: Dict[int, "AssessmentScore"] = {}
domain_stats: Dict[int, "DomainStudentStats"] = {}
competence_stats: Dict[int, "CompetenceStudentStats"] = {}
class HistogramBin(BaseSchema):
"""Bin pour l'histogramme des moyennes."""
range_start: float
range_end: float
label: str
count: int
class AssessmentScore(BaseSchema):
"""Score d'un élève pour une évaluation."""
assessment_id: int
assessment_title: str
score: Optional[float] = None
max_points: float = 0.0
score_on_20: Optional[float] = None
class DomainStudentStats(BaseSchema):
"""Statistiques d'un élève pour un domaine."""
domain_id: int
evaluation_count: int = 0
total_points_obtained: float = 0.0
total_points_possible: float = 0.0
class CompetenceStudentStats(BaseSchema):
"""Statistiques d'un élève pour une compétence."""
competence_id: int
evaluation_count: int = 0
total_points_obtained: float = 0.0
total_points_possible: float = 0.0
class DomainStats(BaseSchema):
"""Statistiques par domaine."""
id: int
name: str
color: str
evaluation_count: int = 0
total_points_obtained: float = 0.0
total_points_possible: float = 0.0
class CompetenceStats(BaseSchema):
"""Statistiques par compétence."""
id: int
name: str
color: str
evaluation_count: int = 0
total_points_obtained: float = 0.0
total_points_possible: float = 0.0
class ClassDashboardStats(BaseSchema):
"""Dashboard complet de statistiques de classe."""
class_id: int
class_name: str
trimester: int
students_count: int
# Statistiques globales
mean: Optional[float] = None
median: Optional[float] = None
std_dev: Optional[float] = None
min_score: Optional[float] = None
max_score: Optional[float] = None
# Évaluations
assessments_total: int = 0
assessments_completed: int = 0
assessments_in_progress: int = 0
# Données détaillées
student_averages: List[StudentAverage] = []
histogram: List[HistogramBin] = []
domains_stats: List[DomainStats] = []
competences_stats: List[CompetenceStats] = []