from pathlib import Path import os BASE_DIR = Path(__file__).resolve().parent.parent def env(key: str, default: str | None = None) -> str | None: return os.getenv(key, default) SECRET_KEY = env('DJANGO_SECRET_KEY', 'dev-insecure-key-change-me') DEBUG = env('DJANGO_DEBUG', 'true').lower() == 'true' ALLOWED_HOSTS = [h.strip() for h in env('DJANGO_ALLOWED_HOSTS', '*').split(',') if h.strip()] INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'channels', 'core_admin', 'fupogfakta', 'lobby', 'realtime', 'voice', ] MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', ] ROOT_URLCONF = 'partyhub.urls' TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [BASE_DIR / 'templates'], 'APP_DIRS': True, 'OPTIONS': { 'context_processors': [ 'django.template.context_processors.request', 'django.contrib.auth.context_processors.auth', 'django.contrib.messages.context_processors.messages', ], }, }, ] WSGI_APPLICATION = 'partyhub.wsgi.application' ASGI_APPLICATION = 'partyhub.asgi.application' DB_ENGINE = env('DB_ENGINE', 'django.db.backends.sqlite3') if DB_ENGINE == 'django.db.backends.sqlite3': DATABASES = { 'default': { 'ENGINE': DB_ENGINE, 'NAME': env('DB_NAME', str(BASE_DIR / 'db.sqlite3')), } } else: DATABASES = { 'default': { 'ENGINE': DB_ENGINE, 'NAME': env('DB_NAME', 'wpp_test'), 'USER': env('DB_USER', 'wpp_test'), 'PASSWORD': env('DB_PASSWORD', ''), 'HOST': env('DB_HOST', '127.0.0.1'), 'PORT': env('DB_PORT', '3306'), 'OPTIONS': {'charset': 'utf8mb4'}, } } TEST_DB_NAME = env('TEST_DB_NAME') if TEST_DB_NAME: DATABASES['default']['TEST'] = {'NAME': TEST_DB_NAME} AUTH_PASSWORD_VALIDATORS = [ {'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator'}, {'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator'}, {'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator'}, {'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator'}, ] LANGUAGE_CODE = 'da' TIME_ZONE = 'Europe/Copenhagen' USE_I18N = True USE_TZ = True STATIC_URL = '/static/' STATIC_ROOT = BASE_DIR / 'staticfiles' DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' USE_SPA_UI_RAW = env('USE_SPA_UI') if USE_SPA_UI_RAW is None: # Backward-compatible fallback while cutover is rolling out. USE_SPA_UI_RAW = env('WPP_SPA_ENABLED', 'false') USE_SPA_UI = USE_SPA_UI_RAW.lower() == 'true' WPP_SPA_ASSET_BASE = env('WPP_SPA_ASSET_BASE', '/static/frontend/angular/browser').rstrip('/') CHANNEL_REDIS_HOST = env('CHANNEL_REDIS_HOST', '127.0.0.1') CHANNEL_REDIS_PORT = int(env('CHANNEL_REDIS_PORT', '6379')) CHANNEL_LAYERS = { 'default': { 'BACKEND': 'channels_redis.core.RedisChannelLayer', 'CONFIG': {'hosts': [(CHANNEL_REDIS_HOST, CHANNEL_REDIS_PORT)]}, } }