"""Modèles de données pour l'agenda Pronote (cours, événements, agenda théorique).""" from __future__ import annotations from datetime import date as _date from datetime import datetime from datetime import time as _time from enum import StrEnum from typing import Literal from pydantic import BaseModel, ConfigDict, Field class Status(StrEnum): """Statut générique pour les événements.""" NORMAL = "normal" CANCELLED = "cancelled" MOVED = "moved" class LessonStatus(StrEnum): """Statut d'un cours.""" NORMAL = "normal" CANCELLED = "cancelled" MOVED = "moved" class HomeworkBlock(BaseModel): """Représente un bloc de devoir extrait de la description d'un cours.""" kind: Literal["due", "assigned"] = Field( ..., description="Type de bloc (échéance ou attribution)" ) date: _date = Field(..., description="Date associée au bloc") text: str = Field(..., description="Texte du devoir (brut)") html: str = Field(default="", description="Texte du devoir (HTML)") class Lesson(BaseModel): """Représente un cours dans l'agenda Pronote.""" model_config = ConfigDict(frozen=True) id: str = Field(..., description="UID stable du cours (normalisé)") start: datetime = Field(..., description="Date/heure de début") end: datetime = Field(..., description="Date/heure de fin") subject: str = Field(..., description="Matière") teachers: list[str] = Field(default_factory=list, description="Liste des professeurs") rooms: list[str] = Field(default_factory=list, description="Liste des salles") group: str | None = Field(None, description="Groupe (ex: Classe entière)") status: LessonStatus = Field(default=LessonStatus.NORMAL, description="Statut du cours") content: str | None = Field(None, description="Contenu pédagogique") homework_blocks: list[HomeworkBlock] = Field( default_factory=list, description="Blocs de devoirs extraits de la description", ) class SchoolEventKind(StrEnum): """Type d'événement scolaire.""" HOLIDAY = "holiday" PUBLIC_HOLIDAY = "public_holiday" class SchoolEvent(BaseModel): """Représente un événement scolaire (vacances, jours fériés).""" model_config = ConfigDict(frozen=True) kind: SchoolEventKind = Field(..., description="Type d'événement") label: str = Field(..., description="Libellé (ex: Vacances de Noël)") from_date: _date = Field(..., description="Date de début (inclusive)") to_date: _date = Field(..., description="Date de fin (exclusive)") class TheoreticalLesson(BaseModel): """Représente un cours dans l'agenda théorique.""" model_config = ConfigDict(frozen=True) id: str = Field(..., description="Identifiant unique") day_of_week: int = Field(..., description="Jour de la semaine (0=lundi, 6=dimanche)") start_time: _time = Field(..., description="Heure de début") end_time: _time = Field(..., description="Heure de fin") subject: str = Field(..., description="Matière") teachers: list[str] = Field(default_factory=list, description="Liste des professeurs") rooms: list[str] = Field(default_factory=list, description="Liste des salles")