"""Étape de normalisation et d'ordonnancement déterministe des données Pronote.""" from __future__ import annotations from datetime import datetime from pronote_sync.models.pronote import PronoteData from pronote_sync.pipeline.steps.fetch import FetchedPronoteData def normalize_step(fetched: FetchedPronoteData, *, generated_at: datetime) -> PronoteData: """Construit le contrat ``PronoteData`` dans un ordre déterministe. :param fetched: Données brutes produites par :func:`fetch_step`. :param generated_at: Horodatage de l'exécution fourni par l'orchestrateur. :return: Données Pronote normalisées. :rtype: PronoteData """ return PronoteData( lessons=sorted(fetched.lessons, key=lambda lesson: (lesson.start, lesson.id)), homeworks=sorted( fetched.homeworks, key=lambda homework: (homework.due_on, homework.subject, homework.id) ), school_events=sorted( fetched.school_events, key=lambda event: (event.from_date, event.to_date, event.kind.value, event.label), ), messages=sorted(fetched.messages, key=lambda message: (message.date, message.id)), target_date=fetched.target_date, generated_at=generated_at, )