""" 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_file import DavFile class LogConfig(BaseModel): """ Logging configuration to be set for the server. https://stackoverflow.com/a/67937084 """ LOG_FORMAT: str = "%(levelprefix)s [%(asctime)s] %(name)s: %(message)s" LOG_LEVEL: str = "DEBUG" # Logging config version = 1 disable_existing_loggers = False formatters = { "default": { "()": "uvicorn.logging.DefaultFormatter", "fmt": LOG_FORMAT, "datefmt": "%Y-%m-%d %H:%M:%S", }, } handlers = { "default": { "formatter": "default", "class": "logging.StreamHandler", "stream": "ext://sys.stderr", }, } loggers = { "ovdashboard_api": {"handlers": ["default"], "level": LOG_LEVEL}, } class ImageConfig(BaseModel): """ Sections "[image.*]" in "config.txt". """ mode: str = "RGB" save_params: dict[str, Any] = { "format": "JPEG", "quality": 85, } class Config(BaseModel): """ Main representation of "config.txt". """ ticker_separator: str = " +++ " image: ImageConfig = ImageConfig() @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: buffer = BytesIO() toml_dump(cls().dict(), buffer) buffer.seek(0) await dav_file.dump(buffer.read()) return cls()