""" Python representation of the "config.txt" file inside the WebDAV directory. """ from io import BytesIO from logging import getLogger from tomllib import loads as toml_loads from typing import Any from pydantic import BaseModel 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 TickerUIConfig(BaseModel): """ Configuration for how the UI displays the ticker content. """ color: str = "primary" class TickerConfig(TickerUIConfig): """ Section "[ticker]" in "config.txt". Combined configuration for the ticker. """ file_name: str = "ticker" separator: str = " +++ " comment_marker: str = "#" class ImageUIConfig(BaseModel): """ Configuration for how the UI displays the image carousel. """ height: int = 300 contain: bool = False speed: int = 10000 class ImageConfig(ImageUIConfig): """ Sections "[image*]" in "config.txt". """ mode: str = "RGB" save_params: dict[str, Any] = { "format": "JPEG", "quality": 85, } class CalendarUIConfig(BaseModel): """ Configuration for how the UI displays the calendar carousel. """ speed: int = 10000 class CalendarConfig(CalendarUIConfig): """ Sections "[calendar*]" in "config.txt". """ future_days: int = 365 aggregates: dict[str, list[str]] = {} class ServerUIConfig(BaseModel): """ Section "[server]" in "config.txt". """ name: str = "OEKZident" host: str = "https://oekzident.de" class LogoUIConfig(BaseModel): """ Section "[logo]" in "config.txt". """ above: str = "Technisches Hilfswerk" below: str = "OV Musterstadt" class Config(BaseModel): """ Main representation of "config.txt". """ image_dir: str = "image" text_dir: str = "text" file_dir: str = "file" logo: LogoUIConfig = LogoUIConfig() image: ImageConfig = ImageConfig() server: ServerUIConfig = ServerUIConfig() ticker: TickerConfig = TickerConfig() 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