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>
43 lines
1.7 KiB
Python
43 lines
1.7 KiB
Python
"""Modèles de données pour la synchronisation CalDAV."""
|
|
|
|
from __future__ import annotations
|
|
|
|
from enum import StrEnum
|
|
|
|
from pydantic import BaseModel, Field
|
|
|
|
from pronote_sync.models.agenda import Lesson, SchoolEvent
|
|
from pronote_sync.models.homework import Homework
|
|
|
|
|
|
class CalDAVSyncStatus(StrEnum):
|
|
"""Statut de synchronisation CalDAV."""
|
|
|
|
SUCCESS = "success"
|
|
FAILED = "failed"
|
|
SKIPPED = "skipped"
|
|
|
|
|
|
class CalDAVSyncPlan(BaseModel):
|
|
"""Plan de synchronisation CalDAV."""
|
|
|
|
lessons_to_add: list[Lesson] = Field(default_factory=list)
|
|
lessons_to_update: list[Lesson] = Field(default_factory=list)
|
|
lessons_to_remove: list[str] = Field(default_factory=list, description="Liste d'UID")
|
|
homeworks_to_add: list[Homework] = Field(default_factory=list)
|
|
homeworks_to_update: list[Homework] = Field(default_factory=list)
|
|
homeworks_to_remove: list[str] = Field(default_factory=list, description="Liste d'UID")
|
|
school_events_to_add: list[SchoolEvent] = Field(default_factory=list)
|
|
school_events_to_update: list[SchoolEvent] = Field(default_factory=list)
|
|
school_events_to_remove: list[str] = Field(default_factory=list, description="Liste d'UID")
|
|
|
|
|
|
class CalDAVSyncResult(BaseModel):
|
|
"""Résultat d'une synchronisation CalDAV (mutable)."""
|
|
|
|
status: CalDAVSyncStatus = Field(..., description="Statut global")
|
|
added: int = Field(0, ge=0, description="Nombre d'événements ajoutés")
|
|
updated: int = Field(0, ge=0, description="Nombre d'événements mis à jour")
|
|
removed: int = Field(0, ge=0, description="Nombre d'événements supprimés")
|
|
errors: list[str] = Field(default_factory=list, description="Liste des erreurs")
|