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

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,
}