Immuabilité : - Collections des modèles frozen : list → tuple (Lesson, TheoreticalLesson, SchoolEvent, AgendaDiff, Homework, XmppMessage, ExternalInfo) - Gel de HomeworkBlock et ExternalInfo (sous-modèles imbriqués dans contrats) - Valeurs par défaut immuables : Field(default=(), ...) Validation de domaine : - TheoreticalLesson.day_of_week : Field(ge=0, le=6) - Lesson/TheoreticalLesson : start < end (validateur de modèle) - SchoolEvent : from_date <= to_date - AgendaChange : cohérence type/payload (ADDED/MODIFIED → lesson, REMOVED → theoretical_lesson) - CalDAVSyncResult : compteurs Field(ge=0) sur added/updated/removed Tests : 66 tests (construction/sérialisation, immuabilité, invariants) couvrant le gel, la mutabilité légitime, et les cas invalides par invariant. Co-authored-by: opencode/coder <coder@agents.invalid> Co-authored-by: opencode/test-engineer <test-engineer@agents.invalid>
22 lines
761 B
Python
22 lines
761 B
Python
"""Modèle de données pour les devoirs Pronote."""
|
|
|
|
from __future__ import annotations
|
|
|
|
from datetime import date
|
|
|
|
from pydantic import BaseModel, ConfigDict, Field
|
|
|
|
|
|
class Homework(BaseModel):
|
|
"""Représente un devoir Pronote."""
|
|
|
|
model_config = ConfigDict(frozen=True)
|
|
|
|
id: str = Field(..., description="ID stable (hachage)")
|
|
subject: str = Field(..., description="Matière")
|
|
teachers: tuple[str, ...] = Field(default=(), description="Liste des professeurs")
|
|
assigned_on: date | None = Field(None, description="Date de distribution")
|
|
due_on: date = Field(..., description="Date d'échéance")
|
|
text: str = Field(..., description="Texte du devoir (brut)")
|
|
html: str = Field(default="", description="Texte du devoir (HTML)")
|