31 lines
1.7 KiB
Python
31 lines
1.7 KiB
Python
import os
|
|
from pathlib import Path
|
|
from datetime import datetime
|
|
from zoneinfo import ZoneInfo
|
|
|
|
DATA_DIR = os.getenv("DATA_DIR", "data") # демо-базы и флаг демо-режима
|
|
DATABASE_URL = os.getenv("DATABASE_URL", "sqlite:///./data/app.db")
|
|
PRODUCTION = os.getenv("APP_ENV", "").lower() == "production" # включает отказ запуска со слабыми секретами
|
|
SECRET_KEY = os.getenv("SECRET_KEY", "dev-secret-change-me")
|
|
ACCESS_TTL_MIN = int(os.getenv("ACCESS_TTL_MIN", "60"))
|
|
REFRESH_TTL_DAYS = int(os.getenv("REFRESH_TTL_DAYS", "90"))
|
|
LOGIN_MAX_FAILS = int(os.getenv("LOGIN_MAX_FAILS", "5")) # неудачных попыток
|
|
LOGIN_WINDOW_SEC = int(os.getenv("LOGIN_WINDOW_SEC", "300")) # за это окно -> блокировка на окно
|
|
TZ = ZoneInfo(os.getenv("APP_TZ", "Europe/Moscow"))
|
|
ADMIN_USERNAME = os.getenv("ADMIN_USERNAME", "admin")
|
|
ADMIN_PASSWORD = os.getenv("ADMIN_PASSWORD", "admin")
|
|
# APK, поставляемый вместе с образом: ссылка на скачивание работает сразу после деплоя
|
|
RELEASE_DIR = Path(os.getenv("RELEASE_DIR", str(Path(__file__).resolve().parent.parent / "release")))
|
|
PHOTO_DIR = os.getenv("PHOTO_DIR", "data/photos")
|
|
SCHEDULER_INTERVAL = int(os.getenv("SCHEDULER_INTERVAL", "30"))
|
|
|
|
|
|
def iso(dt: datetime | None) -> str | None:
|
|
"""Naive-локальное время -> ISO со смещением (для клиентов)."""
|
|
return dt.replace(tzinfo=TZ).isoformat() if dt else None
|
|
|
|
|
|
def now() -> datetime:
|
|
"""Текущее локальное время (naive). Все даты в БД хранятся как локальное время сервера."""
|
|
return datetime.now(TZ).replace(tzinfo=None)
|