""" Python representation of the "config.txt" file inside the WebDAV directory. """ from io import BytesIO from logging import getLogger 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 from .settings import SETTINGS _logger = getLogger(__name__) class TickerAPIConfig(BaseModel): """ Section "[ticker.api]" in "config.txt". Configuration for how the API generates the ticker content. """ file_name: str = "ticker" separator: str = " +++ " comment_marker: str = "#" class TickerUIConfig(BaseModel): """ Section "[ticker.ui]" in "config.txt". Configuration for how the UI displays the ticker content. """ display: bool = True color: str = "primary" speed: int = 30 class TickerConfig(BaseModel): """ Section "[ticker]" in "config.txt". Combined configuration for the ticker. """ api: TickerAPIConfig = TickerAPIConfig() ui: TickerUIConfig = TickerUIConfig() class ImageConfig(BaseModel): """ Sections "[image*]" in "config.txt". """ mode: str = "RGB" save_params: dict[str, Any] = { "format": "JPEG", "quality": 85, } class CalendarConfig(BaseModel): """ Sections "[calendar*]" in "config.txt". """ future_days: int = 365 aggregates: dict[str, list[str]] = {} class Config(BaseModel): """ Main representation of "config.txt". """ image_dir: str = "image" text_dir: str = "text" 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(SETTINGS.config_path) try: cfg = cls.parse_obj( toml_loads(await dav_file.as_string) ) except RemoteResourceNotFound: _logger.warning( f"Config file {SETTINGS.config_path!r} not found, creating ..." ) cfg = cls() cfg.calendar.aggregates["All Events"] = list(await caldav_list()) buffer = BytesIO() toml_dump(cfg.dict(), buffer) buffer.seek(0) await dav_file.write(buffer.read()) return cfg