You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
53 lines
1.5 KiB
53 lines
1.5 KiB
from __future__ import annotations
|
|
|
|
import os
|
|
from pathlib import Path
|
|
from datetime import timedelta
|
|
|
|
BASE_DIR = Path(__file__).resolve().parent.parent
|
|
DEFAULT_SQLITE_PATH = BASE_DIR / "instance" / "happywedding.db"
|
|
|
|
|
|
class BaseConfig:
|
|
SECRET_KEY = os.getenv("HW_SECRET_KEY", "dev-secret-key")
|
|
SQLALCHEMY_TRACK_MODIFICATIONS = False
|
|
SQLALCHEMY_DATABASE_URI = os.getenv(
|
|
"DATABASE_URL",
|
|
f"sqlite:///{DEFAULT_SQLITE_PATH}",
|
|
)
|
|
SESSION_COOKIE_NAME = "hw_session"
|
|
SESSION_COOKIE_HTTPONLY = True
|
|
SESSION_COOKIE_SAMESITE = "Lax"
|
|
SESSION_COOKIE_SECURE = False
|
|
PERMANENT_SESSION_LIFETIME = timedelta(hours=12)
|
|
HOUSEHOLD_CSV_MAX_UPLOAD_BYTES = 5 * 1024 * 1024
|
|
HOUSEHOLD_CSV_PREVIEW_TTL_SECONDS = 60 * 60
|
|
|
|
|
|
class ProductionConfig(BaseConfig):
|
|
SESSION_COOKIE_SECURE = True
|
|
PREFERRED_URL_SCHEME = "https"
|
|
SQLALCHEMY_ENGINE_OPTIONS = {
|
|
"pool_pre_ping": True,
|
|
"pool_recycle": 1800,
|
|
}
|
|
|
|
@classmethod
|
|
def validate(cls) -> None:
|
|
if os.getenv("HW_SECRET_KEY", "dev-secret-key") == "dev-secret-key":
|
|
raise RuntimeError("Production deployment requires HW_SECRET_KEY to be explicitly set.")
|
|
if not os.getenv("DATABASE_URL"):
|
|
raise RuntimeError("Production deployment requires DATABASE_URL to be explicitly set.")
|
|
|
|
|
|
class TestConfig(BaseConfig):
|
|
TESTING = True
|
|
SQLALCHEMY_DATABASE_URI = "sqlite:///:memory:"
|
|
SESSION_COOKIE_SECURE = False
|
|
|
|
|
|
CONFIG_MAPPING = {
|
|
"development": BaseConfig,
|
|
"testing": TestConfig,
|
|
"production": ProductionConfig,
|
|
}
|
|
|