Source code for pylocal_akuvox.models.schedules

# SPDX-FileCopyrightText: 2026 Andrew Grimberg <tykeal@bardicgrove.org>
# SPDX-License-Identifier: Apache-2.0

"""Access-schedule (time-window) data model."""

from __future__ import annotations

from dataclasses import dataclass
from typing import Any

from pylocal_akuvox.exceptions import AkuvoxParseError


[docs] @dataclass(frozen=True, kw_only=True) class AccessSchedule: """Time-based access schedule stored on the device.""" schedule_type: str id: str | None = None name: str | None = None date_start: str | None = None date_end: str | None = None time_start: str | None = None time_end: str | None = None week: str | None = None daily: str | None = None display_id: str | None = None source_type: str | None = None mode: str | None = None sun: str | None = None mon: str | None = None tue: str | None = None wed: str | None = None thur: str | None = None fri: str | None = None sat: str | None = None
[docs] @classmethod def from_api_response(cls, data: dict[str, Any]) -> AccessSchedule: """Create AccessSchedule from API response data.""" try: return cls( schedule_type=data["Type"], id=data.get("ID"), name=data.get("Name"), date_start=data.get("DateStart"), date_end=data.get("DateEnd"), time_start=data.get("TimeStart"), time_end=data.get("TimeEnd"), week=data.get("Week"), daily=data.get("Daily"), display_id=data.get("DisplayID"), source_type=data.get("SourceType"), mode=data.get("Mode"), sun=data.get("Sun"), mon=data.get("Mon"), tue=data.get("Tue"), wed=data.get("Wed"), thur=data.get("Thur"), fri=data.get("Fri"), sat=data.get("Sat"), ) except KeyError as exc: msg = f"Missing required field {exc} in schedule data" raise AkuvoxParseError(msg) from exc
[docs] def to_api_payload(self) -> dict[str, str]: """Convert to PascalCase dict for add/set API calls.""" payload: dict[str, str] = { "Type": self.schedule_type, } _optional: list[tuple[str | None, str]] = [ (self.id, "ID"), (self.name, "Name"), (self.date_start, "DateStart"), (self.date_end, "DateEnd"), (self.time_start, "TimeStart"), (self.time_end, "TimeEnd"), (self.week, "Week"), (self.daily, "Daily"), (self.display_id, "DisplayID"), (self.source_type, "SourceType"), (self.mode, "Mode"), (self.sun, "Sun"), (self.mon, "Mon"), (self.tue, "Tue"), (self.wed, "Wed"), (self.thur, "Thur"), (self.fri, "Fri"), (self.sat, "Sat"), ] for value, key in _optional: if value is not None: payload[key] = value return payload