""" Python representation of the "config.txt" file inside the WebDAV directory. """ from io import BytesIO from typing import Any from pydantic import BaseModel from tomli import loads as toml_loads from tomli_w import dump as toml_dump from webdav3.exceptions import RemoteResourceNotFound from .dav_common import caldav_list from .dav_file import DavFile class TickerConfig(BaseModel): """ Section "[ticker]" in "config.txt". """ separator: str = " +++ " comment_marker: str = "#" color: str = "primary" speed: int = 30 class ImageConfig(BaseModel): """ Sections "[image*]" in "config.txt". """ mode: str = "RGB" save_params: dict[str, Any] = { "format": "JPEG", "quality": 85, } class CalAggregateConfig(BaseModel): """ Sections "[[calendar.aggregate]]" in "config.txt". """ name: str = "All Events" calendars: list[str] class CalendarConfig(BaseModel): """ Section "[calendar]" in "config.txt". """ future_days: int = 365 aggregate: list[CalAggregateConfig] = [] class Config(BaseModel): """ Main representation of "config.txt". """ ticker: TickerConfig = TickerConfig() image: ImageConfig = ImageConfig() calendar: CalendarConfig = CalendarConfig() @classmethod async def get(cls) -> "Config": """ Load the configuration instance from the server using `TOML`. """ dav_file = DavFile("config.txt") try: return cls.parse_obj( toml_loads(await dav_file.string) ) except RemoteResourceNotFound: cfg = cls() cfg.calendar.aggregate.append( CalAggregateConfig(calendars=await caldav_list()), ) buffer = BytesIO() toml_dump(cfg.dict(), buffer) buffer.seek(0) await dav_file.dump(buffer.read()) return cfg