""" Configuration settings for DigiServer v2 Environment-based configuration with sensible defaults """ import os from datetime import timedelta class Config: """Base configuration""" # Basic Flask config SECRET_KEY = os.getenv('SECRET_KEY', 'dev-secret-key-change-in-production') # Database SQLALCHEMY_TRACK_MODIFICATIONS = False SQLALCHEMY_ECHO = False # File Upload - use absolute paths MAX_CONTENT_LENGTH = 2048 * 1024 * 1024 # 2GB _basedir = os.path.abspath(os.path.dirname(__file__)) UPLOAD_FOLDER = os.path.join(_basedir, 'static', 'uploads') UPLOAD_FOLDERLOGO = os.path.join(_basedir, 'static', 'resurse') ALLOWED_EXTENSIONS = {'png', 'jpg', 'jpeg', 'gif', 'bmp', 'mp4', 'avi', 'mkv', 'mov', 'webm', 'pdf', 'ppt', 'pptx'} # Session PERMANENT_SESSION_LIFETIME = timedelta(minutes=30) SESSION_COOKIE_SECURE = False # Set to True in production with HTTPS SESSION_COOKIE_HTTPONLY = True SESSION_COOKIE_SAMESITE = 'Lax' # Cache SEND_FILE_MAX_AGE_DEFAULT = 300 # 5 minutes for static files # Server Info SERVER_VERSION = "2.0.0" BUILD_DATE = "2025-11-12" # Pagination ITEMS_PER_PAGE = 20 # Admin defaults DEFAULT_ADMIN_USER = os.getenv('ADMIN_USER', 'admin') DEFAULT_ADMIN_PASSWORD = os.getenv('ADMIN_PASSWORD', 'Initial01!') class DevelopmentConfig(Config): """Development configuration""" DEBUG = True TESTING = False # Database - construct absolute path _basedir = os.path.abspath(os.path.join(os.path.dirname(__file__), '..')) SQLALCHEMY_DATABASE_URI = os.getenv( 'DATABASE_URL', f'sqlite:///{os.path.join(_basedir, "instance", "dev.db")}' ) # Cache (simple in-memory for development) CACHE_TYPE = 'simple' CACHE_DEFAULT_TIMEOUT = 60 # Security (relaxed for development) WTF_CSRF_ENABLED = True WTF_CSRF_TIME_LIMIT = None class ProductionConfig(Config): """Production configuration""" DEBUG = False TESTING = False TEMPLATES_AUTO_RELOAD = True # Force template reload # Database - construct absolute path _basedir = os.path.abspath(os.path.join(os.path.dirname(__file__), '..')) SQLALCHEMY_DATABASE_URI = os.getenv( 'DATABASE_URL', f'sqlite:///{os.path.join(_basedir, "instance", "dashboard.db")}' ) # Cache - use simple cache instead of Redis CACHE_TYPE = 'simple' CACHE_DEFAULT_TIMEOUT = 300 # Security SESSION_COOKIE_SECURE = True WTF_CSRF_ENABLED = True # Rate Limiting RATELIMIT_STORAGE_URL = f"redis://{os.getenv('REDIS_HOST', 'redis')}:6379/1" class TestingConfig(Config): """Testing configuration""" DEBUG = True TESTING = True # Database (in-memory for tests) SQLALCHEMY_DATABASE_URI = 'sqlite:///:memory:' # Cache (simple for tests) CACHE_TYPE = 'simple' # Security (disabled for tests) WTF_CSRF_ENABLED = False # Configuration dictionary config = { 'development': DevelopmentConfig, 'production': ProductionConfig, 'testing': TestingConfig, 'default': DevelopmentConfig } def get_config(env=None): """Get configuration based on environment""" if env is None: env = os.getenv('FLASK_ENV', 'development') return config.get(env, config['default'])