Files
notytex/backend/schemas/class_group.py
Bertrand Benjamin 2b08eb534a Migration v1 (Flask) -> v2 (FastAPI + Vue.js) complétée
 Changements majeurs:
- Suppression complète du code Flask legacy
- Migration backend FastAPI vers racine /backend
- Migration frontend Vue.js vers racine /frontend
- Suppression de notytex-v2/ (code monté à la racine)

 Validations:
- Backend démarre correctement (port 8000)
- API /api/v2/health répond healthy
- 99/99 tests unitaires passent
- Frontend configuré avec proxy Vite

📝 Documentation:
- README.md réécrit pour v2
- Instructions de démarrage mises à jour
- .gitignore adapté pour backend/frontend/

🎯 Architecture finale:
notytex/
├── backend/     # FastAPI + SQLAlchemy + Pydantic
├── frontend/    # Vue 3 + Vite + TailwindCSS
├── docs/        # Documentation
└── school_management.db  # Base de données (inchangée)

Jalon 6 complété: Application v2 prête pour utilisation!
2025-11-25 21:09:47 +01:00

176 lines
3.6 KiB
Python

"""
Schemas Pydantic pour ClassGroup.
"""
from datetime import date
from typing import Optional, List
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
class HistogramBin(BaseSchema):
"""Bin pour l'histogramme des moyennes."""
range_start: float
range_end: float
label: str
count: int
class DomainStats(BaseSchema):
"""Statistiques par domaine."""
id: int
name: str
color: str
mean: Optional[float] = None
elements_count: int = 0
class CompetenceStats(BaseSchema):
"""Statistiques par compétence."""
id: int
name: str
color: str
mean: Optional[float] = None
elements_count: int = 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] = []