|
| 1 | +import json |
| 2 | +import os |
| 3 | +from enum import StrEnum |
| 4 | +from typing import Final |
| 5 | + |
| 6 | +from dotenv import load_dotenv |
| 7 | + |
| 8 | +# Ensure that `.env` has been loaded, which it might not have been if the Python process |
| 9 | +# for whatever reason doesn't use our `manage.py` (like PyCharm's |
| 10 | +# `django_test_manage.py` when importing our project's settings) |
| 11 | +load_dotenv() |
| 12 | + |
| 13 | +_NOT_PROVIDED: Final = object() |
| 14 | + |
| 15 | + |
| 16 | +class DatabaseSystem(StrEnum): |
| 17 | + POSTGRESQL = "postgres" |
| 18 | + SQLITE = "sqlite" |
| 19 | + |
| 20 | + |
| 21 | +def get_envvar(name: str, *, default: str = _NOT_PROVIDED) -> str: |
| 22 | + """Returns the environment variable with name ``name``. |
| 23 | + If it doesn't exist and ``default`` has been provided, ``default`` is returned.""" |
| 24 | + value = os.environ.get(name) |
| 25 | + if value is None or value == "": |
| 26 | + if default is _NOT_PROVIDED: |
| 27 | + raise KeyError(f"Missing environment variable `{name}`.") |
| 28 | + value = default |
| 29 | + return value |
| 30 | + |
| 31 | + |
| 32 | +def get_bool_envvar(name: str, *, default: bool = _NOT_PROVIDED) -> bool: |
| 33 | + """Returns the same as ``get_envvar()``, but with the value interpreted as a |
| 34 | + ``bool``: ``True`` if the value equals ``"true"`` (case-insensitive), ``False`` |
| 35 | + otherwise.""" |
| 36 | + value = get_envvar( |
| 37 | + name, |
| 38 | + default=str(default) if type(default) is bool else default, |
| 39 | + ) |
| 40 | + return value.lower() == "true" |
| 41 | + |
| 42 | + |
| 43 | +# DEV: If a setting *should* be specified in prod, it should *not* have a `default`! |
| 44 | + |
| 45 | +# --- Core settings --- |
| 46 | +DEBUG: Final = get_bool_envvar("DEBUG") |
| 47 | +SECRET_KEY: Final = get_envvar("SECRET_KEY") |
| 48 | +ALLOWED_HOSTS: Final = list(json.loads(get_envvar("ALLOWED_HOSTS"))) |
| 49 | +INTERNAL_IPS: Final = list( |
| 50 | + json.loads(get_envvar("INTERNAL_IPS", default='["127.0.0.1"]')) |
| 51 | +) |
| 52 | + |
| 53 | +# --- Databases --- |
| 54 | +DATABASE_SYSTEM: Final = DatabaseSystem( |
| 55 | + get_envvar("DATABASE_SYSTEM", default=DatabaseSystem.SQLITE) |
| 56 | +) |
| 57 | +SQLITE_DB_PATH: Final = get_envvar("SQLITE_DB_PATH", default="db.sqlite3") |
| 58 | +POSTGRES_HOST: Final = get_envvar("POSTGRES_HOST", default="localhost") |
| 59 | +POSTGRES_DB_NAME: Final = get_envvar("POSTGRES_DB_NAME", default="make_web") |
| 60 | +POSTGRES_DB_USER: Final = get_envvar("POSTGRES_DB_USER", default="devuser") |
| 61 | +POSTGRES_DB_PASSWORD: Final = get_envvar("POSTGRES_DB_PASSWORD", default="devpassword") |
| 62 | + |
| 63 | +# --- `django-hosts` --- |
| 64 | +PARENT_HOST: Final = get_envvar("PARENT_HOST") |
| 65 | + |
| 66 | +# --- Cookies --- |
| 67 | +COOKIE_DOMAIN: Final = get_envvar("COOKIE_DOMAIN") |
| 68 | +COOKIE_SECURE: Final = get_bool_envvar("COOKIE_SECURE") |
| 69 | + |
| 70 | +# --- Static and media files --- |
| 71 | +STATIC_AND_MEDIA_FILES__PARENT_DIR: Final = get_envvar( |
| 72 | + "STATIC_AND_MEDIA_FILES__PARENT_DIR" |
| 73 | +) |
| 74 | +# The max size in prod is 50 MiB (through Nginx) |
| 75 | +MEDIA_FILE_MAX_SIZE__MB: Final = int(get_envvar("MEDIA_FILE_MAX_SIZE__MB", default="25")) |
| 76 | + |
| 77 | +# --- `channels` --- |
| 78 | +REDIS_HOST: Final = get_envvar("REDIS_HOST", default="localhost") |
| 79 | +REDIS_PORT: Final = int(get_envvar("REDIS_PORT", default="6379")) |
| 80 | + |
| 81 | +# --- Emailing --- |
| 82 | +EMAIL_HOST: Final = get_envvar("EMAIL_HOST") |
| 83 | +EMAIL_HOST_USER: Final = get_envvar("EMAIL_HOST_USER") |
| 84 | +EMAIL_PORT: Final = int(get_envvar("EMAIL_PORT")) |
| 85 | +EMAIL_USE_TLS: Final = get_bool_envvar("EMAIL_USE_TLS") |
| 86 | +DEFAULT_FROM_EMAIL: Final = get_envvar("DEFAULT_FROM_EMAIL") |
| 87 | +SERVER_EMAIL: Final = get_envvar("SERVER_EMAIL") |
| 88 | +EMAIL_SUBJECT_PREFIX: Final = get_envvar("EMAIL_SUBJECT_PREFIX") |
| 89 | +ADMINS: Final = [ |
| 90 | + (full_name, email) for full_name, email in json.loads(get_envvar("ADMINS")) |
| 91 | +] |
| 92 | + |
| 93 | +# --- Dataporten/Feide --- |
| 94 | +USE_DATAPORTEN_AUTH: Final = get_bool_envvar("USE_DATAPORTEN_AUTH") |
| 95 | +SOCIAL_AUTH_DATAPORTEN_KEY: Final = get_envvar("SOCIAL_AUTH_DATAPORTEN_KEY") |
| 96 | +SOCIAL_AUTH_DATAPORTEN_SECRET: Final = get_envvar("SOCIAL_AUTH_DATAPORTEN_SECRET") |
| 97 | + |
| 98 | +# --- Checkin --- |
| 99 | +CHECKIN_KEY: Final = get_envvar("CHECKIN_KEY") |
0 commit comments