from pydantic import BaseModel from pydantic_settings import ( BaseSettings, SettingsConfigDict, ) from pathlib import Path import logging BASE_DIR = Path(__file__).parent.parent TEMPLATES_DIR = BASE_DIR / "web" / "templates" STATIC_DIR = BASE_DIR / "web" / "static" class RunConfig(BaseModel): host: str = "0.0.0.0" port: int = 8000 reload: bool = False class LogConfig(BaseModel): level: int = 30 level_to_file: int = 30 dateformat: str = "%Y-%m-%d %H:%M:%S" format: str = ( "[%(asctime)s.%(msecs)03d] %(module)-25s:%(lineno)4d | %(funcName)-20s| %(levelname)-8s | %(message)s" ) class PrefixConfig(BaseModel): swagger: str = "/docs" api_v1: str = "/api/v1" class RedisConfig(BaseModel): host: str = "localhost" port: int = 6379 pwd: str | None = None class SwaggerConfig(BaseModel): openapi_url: str = "/openapi.json" title: str = "API" oauth2_redirect_url: str = "/docs/oauth2-redirect" swagger_js_url: str = "/static/swagger/swagger-ui-bundle.js" swagger_css_url: str = "/static/swagger/swagger-ui.css" swagger_favicon_url: str = "/static/swagger/favicon.png" login: str pwd: str class Settings(BaseSettings): model_config = SettingsConfigDict( env_file=( BASE_DIR / "config" / ".env-template", BASE_DIR / "config" / ".env", ), case_sensitive=False, env_nested_delimiter="__", env_prefix="OAA_CFG__", ) run: RunConfig = RunConfig() swagger: SwaggerConfig log: LogConfig = LogConfig() prefix: PrefixConfig = PrefixConfig() conf = Settings() logging.basicConfig( level=conf.log.level, datefmt=conf.log.dateformat, format=conf.log.format, ) file_handler = logging.FileHandler(BASE_DIR / "logfile.log") file_handler.setLevel(conf.log.level_to_file) file_handler.setFormatter( logging.Formatter( "[%(asctime)s.%(msecs)03d] %(module)s:%(lineno)4d | %(funcName)s| %(levelname)s | %(message)s" ) ) logging.getLogger().addHandler(file_handler)