# -*- coding: utf-8 -*- """ Datenmodelle fuer das Calendar-Plugin. Definiert CalendarEvent, CalendarInfo, NotificationRecord und EventStatus. """ from dataclasses import dataclass, field from datetime import datetime from enum import Enum class EventStatus(Enum): """Status eines Kalender-Events.""" CONFIRMED = "confirmed" TENTATIVE = "tentative" CANCELLED = "cancelled" @dataclass class CalendarEvent: """ Ein Kalender-Termin. Attributes: event_id: Eindeutige ID vom Provider calendar_id: Zugehoeriger Kalender-Key provider_name: Provider-Schluessel (outlook_firma, google_firma, etc.) title: Titel des Termins start: Startzeitpunkt end: Endzeitpunkt all_day: Ganztaegiger Termin location: Ort description: Beschreibung attendees: Teilnehmer (Namen/Emails) organizer: Organisator status: Terminstatus reminder_minutes: Erinnerung in Minuten vor Start raw_data: Original-Daten vom Provider """ event_id: str calendar_id: str provider_name: str title: str start: datetime end: datetime all_day: bool = False location: str = "" description: str = "" attendees: list[str] = field(default_factory=list) organizer: str = "" status: EventStatus = EventStatus.CONFIRMED reminder_minutes: int = 15 raw_data: dict = field(default_factory=dict) @property def duration(self) -> int: """Dauer in Minuten.""" delta = self.end - self.start return int(delta.total_seconds() / 60) @property def is_upcoming(self) -> bool: """Liegt der Termin in der Zukunft?""" return self.start > datetime.now() @property def is_ongoing(self) -> bool: """Findet der Termin gerade statt?""" now = datetime.now() return self.start <= now <= self.end @dataclass class CalendarInfo: """ Informationen ueber einen einzelnen Kalender. Attributes: calendar_id: ID beim Provider provider_name: Provider-Schluessel aus Config display_name: Anzeigename readonly: Nur lesbar is_global: Gilt fuer alle Satellites """ calendar_id: str provider_name: str display_name: str readonly: bool = True is_global: bool = False @dataclass class NotificationRecord: """ Aufzeichnung einer gesendeten Benachrichtigung. Attributes: event_id: Event-ID notification_type: "reminder" oder "start" sent_at: Zeitpunkt der Benachrichtigung satellite_ids: Betroffene Satellites """ event_id: str notification_type: str sent_at: datetime satellite_ids: list[str] = field(default_factory=list)