""" Django-instellingen voor de Roostersoftware. De architectuur draait om een kleine KERN plus losse MODULES. Modules zijn gewone Django-apps die zich bij opstarten aanmelden bij het plugin-register (zie de app 'plugins'). Of een module zichtbaar/actief is, bepaalt een beheerder per school via een aan/uit-vlag in de database. """ import os from pathlib import Path BASE_DIR = Path(__file__).resolve().parent.parent # --- Beveiliging ---------------------------------------------------------- # Instellingen komen uit omgevingsvariabelen, met veilige dev-defaults. # In productie/op de test-server zet je deze via het .env-bestand. def _env_bool(name, default): return os.environ.get(name, str(default)).strip().lower() in ("1", "true", "yes", "on") # Dev-default alleen voor lokaal werken; ZET DJANGO_SECRET_KEY in productie. SECRET_KEY = os.environ.get("DJANGO_SECRET_KEY", "dev-only-change-me-in-productie") # Standaard False (veilig). Lokaal zet je DJANGO_DEBUG=1. DEBUG = _env_bool("DJANGO_DEBUG", False) # Komma-gescheiden lijst hosts, bv. "rooster-test.example.nl,localhost". ALLOWED_HOSTS = [h.strip() for h in os.environ.get( "DJANGO_ALLOWED_HOSTS", "localhost,127.0.0.1" ).split(",") if h.strip()] # Nodig achter nginx voor POST-verzoeken naar /admin en de API. CSRF_TRUSTED_ORIGINS = [o.strip() for o in os.environ.get( "DJANGO_CSRF_TRUSTED_ORIGINS", "" ).split(",") if o.strip()] # --- Applicaties ---------------------------------------------------------- DJANGO_APPS = [ "django.contrib.admin", "django.contrib.auth", "django.contrib.contenttypes", "django.contrib.sessions", "django.contrib.messages", "django.contrib.staticfiles", ] THIRD_PARTY_APPS = [ "rest_framework", "corsheaders", ] # De kern van het roostersysteem + het plugin-framework. CORE_APPS = [ "plugins", # het plugin-framework zelf (moduleregister + beheer-API) "core", # kerndomein (altijd aan) ] # Losse modules. Eén regel toevoegen = module beschikbaar maken. # Aan/uit zetten gebeurt daarna per school via het beheerscherm. MODULE_APPS = [ "modules.printing", # Printen/Exporteren "modules.accounts", # Multi-user & toegang ] INSTALLED_APPS = DJANGO_APPS + THIRD_PARTY_APPS + CORE_APPS + MODULE_APPS MIDDLEWARE = [ "corsheaders.middleware.CorsMiddleware", "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 = "config.urls" TEMPLATES = [ { "BACKEND": "django.template.backends.django.DjangoTemplates", "DIRS": [], "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 = "config.wsgi.application" # --- Database ------------------------------------------------------------- # Als POSTGRES_DB gezet is (test-server/productie) gebruiken we PostgreSQL; # anders valt het terug op SQLite voor lokaal ontwikkelen. if os.environ.get("POSTGRES_DB"): DATABASES = { "default": { "ENGINE": "django.db.backends.postgresql", "NAME": os.environ["POSTGRES_DB"], "USER": os.environ.get("POSTGRES_USER", "rooster"), "PASSWORD": os.environ.get("POSTGRES_PASSWORD", ""), "HOST": os.environ.get("POSTGRES_HOST", "db"), "PORT": os.environ.get("POSTGRES_PORT", "5432"), } } else: DATABASES = { "default": { "ENGINE": "django.db.backends.sqlite3", "NAME": os.environ.get("ROOSTER_DB_PATH", str(BASE_DIR / "db.sqlite3")), } } # --- Wachtwoordvalidatie -------------------------------------------------- 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"}, ] # --- Internationalisatie -------------------------------------------------- LANGUAGE_CODE = "nl-nl" TIME_ZONE = "Europe/Amsterdam" USE_I18N = True USE_TZ = True # --- Statische bestanden -------------------------------------------------- # collectstatic verzamelt hier; nginx serveert deze map op /static/ # (o.a. de CSS van de Django-admin). STATIC_URL = "/static/" STATIC_ROOT = os.environ.get("DJANGO_STATIC_ROOT", str(BASE_DIR / "staticfiles")) DEFAULT_AUTO_FIELD = "django.db.models.BigAutoField" # --- API ------------------------------------------------------------------ REST_FRAMEWORK = { "DEFAULT_RENDERER_CLASSES": [ "rest_framework.renderers.JSONRenderer", "rest_framework.renderers.BrowsableAPIRenderer", ], } # Frontend (React dev-server) mag de API benaderen. CORS_ALLOWED_ORIGINS = [ "http://localhost:5173", "http://127.0.0.1:5173", ]