feat(class): improve class/id/student
This commit is contained in:
@@ -281,6 +281,67 @@ async def update_student(
|
||||
)
|
||||
|
||||
|
||||
@router.patch("/{student_id}/email", response_model=StudentWithClass)
|
||||
async def update_student_email(
|
||||
student_id: int,
|
||||
email: str,
|
||||
session: AsyncSessionDep,
|
||||
):
|
||||
"""
|
||||
Modifie rapidement l'email d'un étudiant.
|
||||
Endpoint optimisé pour l'édition inline.
|
||||
"""
|
||||
# Récupérer l'étudiant
|
||||
query = (
|
||||
select(Student)
|
||||
.options(
|
||||
selectinload(Student.enrollments).selectinload(StudentEnrollment.class_group)
|
||||
)
|
||||
.where(Student.id == student_id)
|
||||
)
|
||||
result = await session.execute(query)
|
||||
student = result.scalar_one_or_none()
|
||||
|
||||
if not student:
|
||||
raise HTTPException(status_code=404, detail="Étudiant non trouvé")
|
||||
|
||||
# Vérifier l'unicité du nouvel email si fourni
|
||||
if email and email != student.email:
|
||||
existing_query = select(Student).where(
|
||||
Student.email == email,
|
||||
Student.id != student_id
|
||||
)
|
||||
existing_result = await session.execute(existing_query)
|
||||
if existing_result.scalar_one_or_none():
|
||||
raise HTTPException(
|
||||
status_code=400,
|
||||
detail=f"Un autre élève avec l'email '{email}' existe déjà"
|
||||
)
|
||||
|
||||
# Mettre à jour l'email (permet de le vider avec chaîne vide)
|
||||
student.email = email if email else None
|
||||
|
||||
await session.commit()
|
||||
await session.refresh(student)
|
||||
|
||||
# Trouver la classe actuelle
|
||||
current_enrollment = None
|
||||
for enrollment in student.enrollments:
|
||||
if enrollment.departure_date is None:
|
||||
current_enrollment = enrollment
|
||||
break
|
||||
|
||||
return StudentWithClass(
|
||||
id=student.id,
|
||||
last_name=student.last_name,
|
||||
first_name=student.first_name,
|
||||
email=student.email,
|
||||
full_name=f"{student.first_name} {student.last_name}",
|
||||
current_class_id=current_enrollment.class_group_id if current_enrollment else None,
|
||||
current_class_name=current_enrollment.class_group.name if current_enrollment else None
|
||||
)
|
||||
|
||||
|
||||
@router.delete("/{student_id}", status_code=204)
|
||||
async def delete_student(
|
||||
student_id: int,
|
||||
|
||||
Reference in New Issue
Block a user