Files
GOV_QR_Codes_Management/config.py
T

125 lines
4.9 KiB
Python

"""
config.py
=========
Centralised application configuration.
All environment variable reads happen here — once, at startup.
Blueprints and helpers that need a config value use:
from flask import current_app
value = current_app.config['KEY']
Or for values needed at module import time (before app context):
from config import Config
value = Config.COMPANY_NAME
"""
import os
from datetime import timedelta
class Config:
# ------------------------------------------------------------------ #
# Core Flask
# ------------------------------------------------------------------ #
SECRET_KEY = os.environ.get('SECRET_KEY', 'change-me-in-production')
SQLALCHEMY_DATABASE_URI = os.environ.get('DATABASE_URL', '')
SQLALCHEMY_TRACK_MODIFICATIONS = (
os.environ.get('SQLALCHEMY_TRACK_MODIFICATIONS', 'False').lower() == 'true'
)
TEMPLATES_AUTO_RELOAD = (
os.environ.get('TEMPLATES_AUTO_RELOAD', 'True').lower() == 'true'
)
DEBUG = os.environ.get('DEBUG', 'False').lower() == 'true'
# ------------------------------------------------------------------ #
# SQLAlchemy connection pool (read from .env; safe defaults)
# ------------------------------------------------------------------ #
SQLALCHEMY_ENGINE_OPTIONS = {
'pool_size': int(os.environ.get('SQLALCHEMY_ENGINE_OPTIONS_POOL_SIZE', '10')),
'pool_timeout': int(os.environ.get('SQLALCHEMY_ENGINE_OPTIONS_POOL_TIMEOUT', '20')),
'pool_recycle': int(os.environ.get('SQLALCHEMY_ENGINE_OPTIONS_POOL_RECYCLE', '3600')),
'max_overflow': int(os.environ.get('SQLALCHEMY_ENGINE_OPTIONS_MAX_OVERFLOW', '20')),
}
# ------------------------------------------------------------------ #
# Session / cookies
# ------------------------------------------------------------------ #
PERMANENT_SESSION_LIFETIME = timedelta(days=30)
SESSION_COOKIE_SECURE = (
os.environ.get('SESSION_COOKIE_SECURE', 'false').lower() == 'true'
)
SESSION_COOKIE_HTTPONLY = (
os.environ.get('SESSION_COOKIE_HTTPONLY', 'true').lower() == 'true'
)
SESSION_COOKIE_SAMESITE = os.environ.get('SESSION_COOKIE_SAMESITE', 'Lax')
# ------------------------------------------------------------------ #
# Application identity
# ------------------------------------------------------------------ #
COMPANY_NAME = os.environ.get('COMPANY_NAME', 'QR Code Management System')
CONTRACT_NAME = os.environ.get('CONTRACT_NAME', 'Default Contract')
# Public-facing base URL used when constructing QR code destination links.
# Set this to your domain with no trailing slash, e.g.:
# QR_BASE_URL=https://qr.govservicesinc.com
# This prevents doubled-hostname issues when running behind a reverse proxy.
QR_BASE_URL = os.environ.get('QR_BASE_URL', '').rstrip('/')
# ------------------------------------------------------------------ #
# File uploads
# ------------------------------------------------------------------ #
UPLOAD_FOLDER = os.environ.get('UPLOAD_FOLDER', '/tmp')
# ------------------------------------------------------------------ #
# Photo verification
# ------------------------------------------------------------------ #
PHOTO_VERIFICATION_ENABLED = (
os.environ.get('ENABLE_PHOTO_VERIFICATION', 'true').lower() == 'true'
)
DISTANCE_THRESHOLD_FOR_VERIFICATION = float(
os.environ.get('PHOTO_VERIFICATION_DISTANCE_THRESHOLD', '0.3')
)
VERIFICATION_PHOTO_MAX_SIZE = int(
os.environ.get('VERIFICATION_PHOTO_MAX_SIZE', str(5 * 1024 * 1024))
)
# ------------------------------------------------------------------ #
# Check-in interval
# ------------------------------------------------------------------ #
TIME_INTERVAL = int(os.environ.get('TIME_INTERVAL', '30'))
# ------------------------------------------------------------------ #
# Server
# ------------------------------------------------------------------ #
FLASK_HOST = os.environ.get('FLASK_HOST', '0.0.0.0')
FLASK_PORT = int(os.environ.get('FLASK_PORT', '5000'))
THREADED = os.environ.get('THREADED', 'True').lower() == 'true'
# ------------------------------------------------------------------ #
# Default admin (used only on first boot)
# ------------------------------------------------------------------ #
DEFAULT_ADMIN_PASSWORD = os.environ.get('DEFAULT_ADMIN_PASSWORD', 'admin123')
class DevelopmentConfig(Config):
DEBUG = True
SESSION_COOKIE_SECURE = False
class ProductionConfig(Config):
DEBUG = False
TEMPLATES_AUTO_RELOAD = False
# Active config selected by environment variable
_config_map = {
'development': DevelopmentConfig,
'production': ProductionConfig,
'default': Config,
}
def get_config():
"""Return the active Config class based on FLASK_ENV."""
env = os.environ.get('FLASK_ENV', 'default').lower()
return _config_map.get(env, Config)