83 lines
2.4 KiB
Python
83 lines
2.4 KiB
Python
from typing import Any
|
|
|
|
from sqlalchemy import select
|
|
from sqlalchemy.ext.asyncio import AsyncSession
|
|
|
|
from database.models import Setting
|
|
|
|
from database.settings_cache import settings_cache
|
|
from ..defaults import DEFAULT_WEB_CONFIG
|
|
from .runtime_sync import publish_runtime_config, register_runtime_config
|
|
|
|
|
|
WEB_CONFIG: dict[str, Any] = DEFAULT_WEB_CONFIG.copy()
|
|
WEB_SETTING_KEY = "WEB_CONFIG"
|
|
register_runtime_config(WEB_SETTING_KEY, WEB_CONFIG)
|
|
|
|
|
|
async def load_web_config(session: AsyncSession) -> None:
|
|
stmt = select(Setting).where(Setting.key == WEB_SETTING_KEY)
|
|
result = await session.execute(stmt)
|
|
setting = result.scalar_one_or_none()
|
|
|
|
if setting is None:
|
|
web_config = DEFAULT_WEB_CONFIG.copy()
|
|
setting = Setting(
|
|
key=WEB_SETTING_KEY,
|
|
value=web_config,
|
|
description="Конфигурация веб-сайта",
|
|
)
|
|
session.add(setting)
|
|
else:
|
|
stored = setting.value or {}
|
|
web_config = DEFAULT_WEB_CONFIG.copy()
|
|
web_config.update(stored)
|
|
setting.value = web_config
|
|
|
|
WEB_CONFIG.clear()
|
|
WEB_CONFIG.update(web_config)
|
|
await session.flush()
|
|
|
|
|
|
async def update_web_config(session: AsyncSession, new_values: dict[str, Any]) -> None:
|
|
stmt = select(Setting).where(Setting.key == WEB_SETTING_KEY)
|
|
result = await session.execute(stmt)
|
|
setting = result.scalar_one_or_none()
|
|
|
|
if setting is None:
|
|
setting = Setting(
|
|
key=WEB_SETTING_KEY,
|
|
value=new_values,
|
|
description="Конфигурация веб-сайта",
|
|
)
|
|
session.add(setting)
|
|
else:
|
|
setting.value = new_values
|
|
|
|
await session.commit()
|
|
|
|
web_config = DEFAULT_WEB_CONFIG.copy()
|
|
web_config.update(new_values)
|
|
|
|
WEB_CONFIG.clear()
|
|
WEB_CONFIG.update(web_config)
|
|
settings_cache.update(WEB_SETTING_KEY, web_config)
|
|
await publish_runtime_config(WEB_SETTING_KEY, web_config)
|
|
|
|
|
|
def get_site_url() -> str:
|
|
"""Возвращает SITE_URL из WEB_CONFIG, или из config.py как fallback."""
|
|
url = str(WEB_CONFIG.get("SITE_URL") or "").strip()
|
|
if url:
|
|
return url.rstrip("/")
|
|
from config import SITE_URL
|
|
return SITE_URL.rstrip("/") if SITE_URL else ""
|
|
|
|
|
|
def is_web_enabled() -> bool:
|
|
return bool(WEB_CONFIG.get("WEB_ENABLED", False))
|
|
|
|
|
|
def is_email_binding_enabled() -> bool:
|
|
return bool(WEB_CONFIG.get("EMAIL_BINDING_ENABLED", False))
|