38 lines
1.5 KiB
Python
38 lines
1.5 KiB
Python
"""Общий каталог картинок для бота и админки (Docker volume)."""
|
||
|
||
from __future__ import annotations
|
||
|
||
import logging
|
||
import shutil
|
||
from pathlib import Path
|
||
|
||
from common.config import AdminSettings
|
||
|
||
logger = logging.getLogger(__name__)
|
||
|
||
#: Встроенная картинка приветствия (лежит в образе бота и админки).
|
||
BUILTIN_WELCOME = Path("images/welcome_image.jpg")
|
||
|
||
#: Имя файла в volume, которое ждёт сид последовательности `welcome`.
|
||
WELCOME_IMAGE_NAME = "welcome_image.jpg"
|
||
|
||
|
||
def ensure_media(settings: AdminSettings) -> Path:
|
||
"""Создать каталог и положить туда встроенное приветствие, если его нет."""
|
||
directory = Path(settings.media_dir)
|
||
directory.mkdir(parents=True, exist_ok=True)
|
||
|
||
target = directory / WELCOME_IMAGE_NAME
|
||
if not target.exists() and BUILTIN_WELCOME.is_file():
|
||
try:
|
||
shutil.copyfile(BUILTIN_WELCOME, target)
|
||
logger.info("Приветственная картинка скопирована в %s", target)
|
||
except OSError:
|
||
logger.warning("Не удалось скопировать приветственную картинку в %s", target, exc_info=True)
|
||
return directory
|
||
|
||
|
||
def media_path(settings: AdminSettings, name: str) -> Path:
|
||
"""Безопасный путь к файлу в media (без выхода из каталога)."""
|
||
return Path(settings.media_dir) / Path(name).name
|