diff --git a/Dockerfile b/Dockerfile index e6c5863b..77937c36 100644 --- a/Dockerfile +++ b/Dockerfile @@ -23,7 +23,7 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ ENV HOME=/home/alexandria ENV PYTHONUNBUFFERED=1 -ENV DJANGO_SETTINGS_MODULE alexandria.settings +ENV DJANGO_SETTINGS_MODULE alexandria.settings.django ENV APP_HOME=/app ENV UWSGI_INI /app/uwsgi.ini diff --git a/alexandria/settings/__init__.py b/alexandria/settings/__init__.py new file mode 100644 index 00000000..0a85665f --- /dev/null +++ b/alexandria/settings/__init__.py @@ -0,0 +1 @@ +from .django import * \ No newline at end of file diff --git a/alexandria/settings/alexandria.py b/alexandria/settings/alexandria.py new file mode 100644 index 00000000..e8f0ca4b --- /dev/null +++ b/alexandria/settings/alexandria.py @@ -0,0 +1,79 @@ +import os +import re + +import environ + +env = environ.Env() +django_root = environ.Path(__file__) - 2 + +ENV_FILE = env.str("ENV_FILE", default=django_root(".env")) +if os.path.exists(ENV_FILE): + environ.Env.read_env(ENV_FILE) + +# per default production is enabled for security reasons +# for development create .env file with ENV=development +ENV = env.str("ENV", "production") + + +def default(default_dev=env.NOTSET, default_prod=env.NOTSET): + """Environment aware default.""" + return default_prod if ENV == "production" else default_dev + + +ADMIN_USERNAME = env.str("ADMIN_USERNAME", default="admin") + +# Authentication +OIDC_OP_USER_ENDPOINT = env.str("OIDC_OP_USER_ENDPOINT", default=None) +OIDC_OP_TOKEN_ENDPOINT = "not supported in alexandria, but a value is needed" +OIDC_VERIFY_SSL = env.bool("OIDC_VERIFY_SSL", default=True) +OIDC_USERNAME_CLAIM = env.str("OIDC_USERNAME_CLAIM", default="sub") +OIDC_GROUPS_CLAIM = env.str("OIDC_GROUPS_CLAIM", default="alexandria_groups") +OIDC_BEARER_TOKEN_REVALIDATION_TIME = env.int( + "OIDC_BEARER_TOKEN_REVALIDATION_TIME", default=0 +) +OIDC_OP_INTROSPECT_ENDPOINT = env.str("OIDC_OP_INTROSPECT_ENDPOINT", default=None) +OIDC_RP_CLIENT_ID = env.str("OIDC_RP_CLIENT_ID", default=None) +OIDC_RP_CLIENT_SECRET = env.str("OIDC_RP_CLIENT_SECRET", default=None) + +DEV_AUTH_BACKEND = env.bool("DEV_AUTH_BACKEND", default=False) +OIDC_DRF_AUTH_BACKEND = env.str( + "OIDC_DRF_AUTH_BACKEND", + default="alexandria.oidc_auth.authentication.AlexandriaAuthenticationBackend", +) +if DEV_AUTH_BACKEND: + OIDC_DRF_AUTH_BACKEND = ( + "alexandria.oidc_auth.authentication.DevelopmentAuthenticationBackend" + ) + + +# Extensions + +VISIBILITY_CLASSES = env.list( + "VISIBILITY_CLASSES", default=default(["alexandria.core.visibilities.Any"]) +) + +PERMISSION_CLASSES = env.list( + "PERMISSION_CLASSES", default=default(["alexandria.core.permissions.AllowAny"]) +) +VALIDATION_CLASSES = env.list("VALIDATION_CLASSES", default=[]) + + +# Storage +MEDIA_STORAGE_SERVICE = env.str("MEDIA_STORAGE_SERVICE", default="minio") +MINIO_STORAGE_ENDPOINT = env.str("MINIO_STORAGE_ENDPOINT", default="minio:9000") +MINIO_STORAGE_ACCESS_KEY = env.str("MINIO_STORAGE_ACCESS_KEY", default="minio") +MINIO_STORAGE_SECRET_KEY = env.str("MINIO_STORAGE_SECRET_KEY", default="minio123") +MINIO_STORAGE_USE_HTTPS = env.str("MINIO_STORAGE_USE_HTTPS", default=False) +MINIO_STORAGE_MEDIA_BUCKET_NAME = env.str( + "MINIO_STORAGE_MEDIA_BUCKET_NAME", default="alexandria-media" +) +MINIO_STORAGE_AUTO_CREATE_MEDIA_BUCKET = env.str( + "MINIO_STORAGE_AUTO_CREATE_MEDIA_BUCKET", default=True +) +MINIO_PRESIGNED_TTL_MINUTES = env.str("MINIO_PRESIGNED_TTL_MINUTES", default=15) + + +# Thumbnails +ENABLE_THUMBNAIL_GENERATION = env.bool("ENABLE_THUMBNAIL_GENERATION", default=True) +THUMBNAIL_WIDTH = env.int("THUMBNAIL_WIDTH", default=None) +THUMBNAIL_HEIGHT = env.int("THUMBNAIL_HEIGHT", default=None) diff --git a/alexandria/settings.py b/alexandria/settings/django.py similarity index 60% rename from alexandria/settings.py rename to alexandria/settings/django.py index 108bf008..15ecab7a 100644 --- a/alexandria/settings.py +++ b/alexandria/settings/django.py @@ -1,24 +1,9 @@ -import os import re -import environ from django.conf import global_settings -env = environ.Env() -django_root = environ.Path(__file__) - 2 - -ENV_FILE = env.str("ENV_FILE", default=django_root(".env")) -if os.path.exists(ENV_FILE): - environ.Env.read_env(ENV_FILE) - -# per default production is enabled for security reasons -# for development create .env file with ENV=development -ENV = env.str("ENV", "production") - - -def default(default_dev=env.NOTSET, default_prod=env.NOTSET): - """Environment aware default.""" - return default_prod if ENV == "production" else default_dev +from .alexandria import * # noqa +from .alexandria import default, django_root, env, environ SECRET_KEY = env.str("SECRET_KEY", default=default("uuuuuuuuuu")) @@ -98,66 +83,6 @@ def parse_languages(languages): LOCALIZED_FIELDS_EXPERIMENTAL = True - -ADMIN_USERNAME = env.str("ADMIN_USERNAME", default="admin") - -# Authentication -OIDC_OP_USER_ENDPOINT = env.str("OIDC_OP_USER_ENDPOINT", default=None) -OIDC_OP_TOKEN_ENDPOINT = "not supported in alexandria, but a value is needed" -OIDC_VERIFY_SSL = env.bool("OIDC_VERIFY_SSL", default=True) -OIDC_USERNAME_CLAIM = env.str("OIDC_USERNAME_CLAIM", default="sub") -OIDC_GROUPS_CLAIM = env.str("OIDC_GROUPS_CLAIM", default="alexandria_groups") -OIDC_BEARER_TOKEN_REVALIDATION_TIME = env.int( - "OIDC_BEARER_TOKEN_REVALIDATION_TIME", default=0 -) -OIDC_OP_INTROSPECT_ENDPOINT = env.str("OIDC_OP_INTROSPECT_ENDPOINT", default=None) -OIDC_RP_CLIENT_ID = env.str("OIDC_RP_CLIENT_ID", default=None) -OIDC_RP_CLIENT_SECRET = env.str("OIDC_RP_CLIENT_SECRET", default=None) - -DEV_AUTH_BACKEND = env.bool("DEV_AUTH_BACKEND", default=False) -OIDC_DRF_AUTH_BACKEND = env.str( - "OIDC_DRF_AUTH_BACKEND", - default="alexandria.oidc_auth.authentication.AlexandriaAuthenticationBackend", -) -if DEV_AUTH_BACKEND: - OIDC_DRF_AUTH_BACKEND = ( - "alexandria.oidc_auth.authentication.DevelopmentAuthenticationBackend" - ) - - -# Extensions - -VISIBILITY_CLASSES = env.list( - "VISIBILITY_CLASSES", default=default(["alexandria.core.visibilities.Any"]) -) - -PERMISSION_CLASSES = env.list( - "PERMISSION_CLASSES", default=default(["alexandria.core.permissions.AllowAny"]) -) -VALIDATION_CLASSES = env.list("VALIDATION_CLASSES", default=[]) - - -# Storage -MEDIA_STORAGE_SERVICE = env.str("MEDIA_STORAGE_SERVICE", default="minio") -MINIO_STORAGE_ENDPOINT = env.str("MINIO_STORAGE_ENDPOINT", default="minio:9000") -MINIO_STORAGE_ACCESS_KEY = env.str("MINIO_STORAGE_ACCESS_KEY", default="minio") -MINIO_STORAGE_SECRET_KEY = env.str("MINIO_STORAGE_SECRET_KEY", default="minio123") -MINIO_STORAGE_USE_HTTPS = env.str("MINIO_STORAGE_USE_HTTPS", default=False) -MINIO_STORAGE_MEDIA_BUCKET_NAME = env.str( - "MINIO_STORAGE_MEDIA_BUCKET_NAME", default="alexandria-media" -) -MINIO_STORAGE_AUTO_CREATE_MEDIA_BUCKET = env.str( - "MINIO_STORAGE_AUTO_CREATE_MEDIA_BUCKET", default=True -) -MINIO_PRESIGNED_TTL_MINUTES = env.str("MINIO_PRESIGNED_TTL_MINUTES", default=15) - - -# Thumbnails -ENABLE_THUMBNAIL_GENERATION = env.bool("ENABLE_THUMBNAIL_GENERATION", default=True) -THUMBNAIL_WIDTH = env.int("THUMBNAIL_WIDTH", default=None) -THUMBNAIL_HEIGHT = env.int("THUMBNAIL_HEIGHT", default=None) - - REST_FRAMEWORK = { "EXCEPTION_HANDLER": "rest_framework_json_api.exceptions.exception_handler", "DEFAULT_PAGINATION_CLASS": "rest_framework_json_api.pagination.JsonApiPageNumberPagination", @@ -193,11 +118,6 @@ def parse_languages(languages): "TEST_REQUEST_DEFAULT_FORMAT": "vnd.api+json", } -JSON_API_FORMAT_FIELD_NAMES = "dasherize" -JSON_API_FORMAT_TYPES = "dasherize" -JSON_API_PLURALIZE_TYPES = True - - # Anonymous writing ALLOW_ANONYMOUS_WRITE = env.bool("ALLOW_ANONYMOUS_WRITE", default=False) diff --git a/alexandria/wsgi.py b/alexandria/wsgi.py index a580e5ff..8445c67f 100644 --- a/alexandria/wsgi.py +++ b/alexandria/wsgi.py @@ -11,6 +11,6 @@ from django.core.wsgi import get_wsgi_application -os.environ.setdefault("DJANGO_SETTINGS_MODULE", "alexandria.settings") +os.environ.setdefault("DJANGO_SETTINGS_MODULE", "alexandria.settings.django") application = get_wsgi_application() diff --git a/manage.py b/manage.py index 07d16ce2..4aa3ebea 100755 --- a/manage.py +++ b/manage.py @@ -6,7 +6,7 @@ import sys if __name__ == "__main__": - os.environ.setdefault("DJANGO_SETTINGS_MODULE", "alexandria.settings") + os.environ.setdefault("DJANGO_SETTINGS_MODULE", "alexandria.settings.django") from django.core.management import execute_from_command_line execute_from_command_line(sys.argv) diff --git a/pyproject.toml b/pyproject.toml index 4353ce00..713a5424 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -77,7 +77,7 @@ line_length = 88 [tool.pytest.ini_options] addopts = "--reuse-db --randomly-seed=1521188766" -DJANGO_SETTINGS_MODULE = "alexandria.settings" +DJANGO_SETTINGS_MODULE = "alexandria.settings.django" django_debug_mode = true filterwarnings = [ "ignore::DeprecationWarning",