netadm/config.py

82 lines
2.0 KiB
Python

from typing import ClassVar
from pydantic import BaseModel
from pydantic_settings import (
BaseSettings,
SettingsConfigDict,
)
from pydantic import PostgresDsn
from pathlib import Path
import logging
BASE_DIR = Path(__file__).parent
TEMPLATES_DIR = BASE_DIR / "web" / "templates"
STATIC_DIR = BASE_DIR / "web" / "static"
class RunConfig(BaseModel):
host: str
port: int
reload: bool
class SwaggerConfig(BaseModel):
openapi_url: str = "/openapi.json"
title: str = "Netadm 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"
class DatabaseConfig(BaseModel):
url: PostgresDsn
echo: bool = False
echo_pool: bool = False
pool_size: int = 50
max_overflow: int = 10
naming_convention: dict[str, str] = {
"ix": "ix_%(column_0_label)s",
"uq": "uq_%(table_name)s_%(column_0_N_name)s",
"ck": "ck_%(table_name)s_%(constraint_name)s",
"fk": "fk_%(table_name)s_%(column_0_name)s_%(referred_table_name)s",
"pk": "pk_%(table_name)s",
}
class TypesConfig(BaseModel):
UserIdType: ClassVar = int
class Settings(BaseSettings):
model_config = SettingsConfigDict(
env_file=(
BASE_DIR / ".env-template",
BASE_DIR / ".env",
),
case_sensitive=False,
env_nested_delimiter="__",
env_prefix="NETADM_CONFIG__",
)
run: RunConfig
swagger: SwaggerConfig = SwaggerConfig()
db: DatabaseConfig
type: TypesConfig = TypesConfig()
settings = Settings()
def config_logging(level=logging.INFO):
logging.basicConfig(
level=level,
datefmt="%Y-%m-%d %H:%M:%S",
format="[%(asctime)s.%(msecs)03d] %(module)-25s:%(lineno)4d | %(funcName)-20s| %(levelname)-8s | %(message)s",
)
config_logging(level=logging.INFO)