Files
notytex/backend/schemas/student.py
Bertrand Benjamin 08c8ee4931
All checks were successful
Build and Publish Docker Images / Build Backend Image (push) Successful in 3m1s
Build and Publish Docker Images / Build Frontend Image (push) Successful in 3m0s
Build and Publish Docker Images / Build Summary (push) Successful in 3s
feat(class): improve class/id/student
2025-12-03 06:32:16 +01:00

185 lines
4.3 KiB
Python

"""
Schemas Pydantic pour Student et StudentEnrollment.
"""
from datetime import date, datetime
from typing import Optional, List
from pydantic import Field, EmailStr
from schemas.common import BaseSchema
class StudentBase(BaseSchema):
"""Schema de base pour Student."""
last_name: str
first_name: str
email: Optional[str] = None
class StudentRead(StudentBase):
"""Schema pour la lecture d'un Student."""
id: int
full_name: str = ""
@property
def computed_full_name(self) -> str:
return f"{self.first_name} {self.last_name}"
class StudentWithClass(StudentRead):
"""Schema avec la classe actuelle."""
current_class_id: Optional[int] = None
current_class_name: Optional[str] = None
class StudentWithEnrollmentInfo(StudentRead):
"""Schema avec les informations d'inscription complètes."""
current_class_id: Optional[int] = None
current_class_name: Optional[str] = None
enrollment_id: Optional[int] = None
enrollment_date: Optional[date] = None
departure_date: Optional[date] = None
enrollment_reason: Optional[str] = None
departure_reason: Optional[str] = None
is_active: bool = True
class StudentDetail(StudentWithClass):
"""Schema détaillé avec historique d'inscriptions."""
enrollments: List["EnrollmentRead"] = []
class StudentList(BaseSchema):
"""Schema pour la liste des étudiants."""
students: List[StudentWithClass]
total: int
class StudentEnrollmentList(BaseSchema):
"""Schema pour la liste des étudiants avec informations d'inscription."""
students: List[StudentWithEnrollmentInfo]
total: int
# Schemas pour les inscriptions temporelles
class EnrollmentBase(BaseSchema):
"""Schema de base pour StudentEnrollment."""
enrollment_date: date
departure_date: Optional[date] = None
enrollment_reason: Optional[str] = None
departure_reason: Optional[str] = None
class EnrollmentRead(EnrollmentBase):
"""Schema pour la lecture d'une inscription."""
id: int
student_id: int
class_group_id: int
class_name: Optional[str] = None
is_active: bool = True
created_at: datetime
updated_at: datetime
class EnrollmentCreate(EnrollmentBase):
"""Schema pour créer une inscription."""
student_id: int
class_group_id: int
# Schemas pour les opérations d'écriture (CRUD)
class StudentCreate(StudentBase):
"""Schema pour créer un étudiant."""
class_group_id: Optional[int] = None
enrollment_date: Optional[date] = None
enrollment_reason: Optional[str] = None
class StudentUpdate(BaseSchema):
"""Schema pour modifier un étudiant."""
last_name: Optional[str] = None
first_name: Optional[str] = None
email: Optional[str] = None
class EnrollRequest(BaseSchema):
"""Schema pour inscrire un élève dans une classe."""
# Pour élève existant
student_id: Optional[int] = None
# Pour nouvel élève (si student_id est None)
first_name: Optional[str] = None
last_name: Optional[str] = None
email: Optional[str] = None
# Informations d'inscription
class_group_id: int
enrollment_date: date
enrollment_reason: Optional[str] = None
class TransferRequest(BaseSchema):
"""Schema pour transférer un élève vers une autre classe."""
student_id: int
new_class_group_id: int
transfer_date: date
transfer_reason: Optional[str] = None
class DepartureRequest(BaseSchema):
"""Schema pour enregistrer le départ d'un élève."""
student_id: int
departure_date: date
departure_reason: Optional[str] = None
class EnrollmentResponse(BaseSchema):
"""Schema de réponse pour les opérations d'inscription."""
enrollment_id: int
student_id: int
student_name: str
class_name: str
message: str = ""
is_new_student: bool = False
class TransferResponse(BaseSchema):
"""Schema de réponse pour les transferts."""
old_enrollment_id: int
new_enrollment_id: int
student_name: str
old_class_name: str
new_class_name: str
message: str = ""
class DepartureResponse(BaseSchema):
"""Schema de réponse pour les départs."""
enrollment_id: int
student_name: str
class_name: str
message: str = ""
# Pour éviter les références circulaires
StudentDetail.model_rebuild()