176 lines
5.3 KiB
Python
176 lines
5.3 KiB
Python
"""
|
|
Settings file for OpenSlides.
|
|
|
|
For more information on this file, see
|
|
https://github.com/OpenSlides/OpenSlides/blob/master/SETTINGS.rst
|
|
"""
|
|
|
|
import os
|
|
import json
|
|
from openslides.global_settings import *
|
|
|
|
|
|
class MissingEnvironmentVariable(Exception):
|
|
pass
|
|
|
|
|
|
undefined = object()
|
|
|
|
|
|
def get_env(name, default=undefined, cast=str):
|
|
env = os.environ.get(name)
|
|
default_extension = ""
|
|
if not env:
|
|
env = default
|
|
default_extension = " (default)"
|
|
|
|
if env is undefined:
|
|
raise MissingEnvironmentVariable(name)
|
|
|
|
if env is not None:
|
|
if cast is bool:
|
|
env = env in ("1", "true", "True")
|
|
else:
|
|
env = cast(env)
|
|
|
|
if env is None:
|
|
print(f"{name}={default_extension}", flush=True)
|
|
else:
|
|
print(f'{name}="{env}"{default_extension}', flush=True)
|
|
return env
|
|
|
|
|
|
# The directory for user specific data files
|
|
|
|
OPENSLIDES_USER_DATA_DIR = "/app/personal_data/var"
|
|
|
|
SECRET_KEY = get_env("SECRET_KEY")
|
|
DEBUG = False
|
|
|
|
# Controls the verbosity on errors during a reset password. If enabled, an error
|
|
# will be shown, if there does not exist a user with a given email address. So one
|
|
# can check, if a email is registered. If this is not wanted, disable verbose
|
|
# messages. An success message will always be shown.
|
|
RESET_PASSWORD_VERBOSE_ERRORS = get_env("RESET_PASSWORD_VERBOSE_ERRORS", True, bool)
|
|
|
|
# OpenSlides specific settings
|
|
AUTOUPDATE_DELAY = get_env("AUTOUPDATE_DELAY", 1, int)
|
|
DEMO_USERS = get_env("DEMO_USERS", default=None)
|
|
DEMO_USERS = json.loads(DEMO_USERS) if DEMO_USERS else None
|
|
|
|
# Email settings
|
|
# For SSL/TLS specific settings see https://docs.djangoproject.com/en/1.11/topics/email/#smtp-backend
|
|
EMAIL_HOST = get_env("EMAIL_HOST", "postfix")
|
|
EMAIL_PORT = get_env("EMAIL_PORT", 25, int)
|
|
EMAIL_HOST_USER = get_env("EMAIL_HOST_USER", "")
|
|
EMAIL_HOST_PASSWORD = get_env("EMAIL_HOST_PASSWORD", "")
|
|
DEFAULT_FROM_EMAIL = get_env("DEFAULT_FROM_EMAIL", "noreply@example.com")
|
|
|
|
# Increasing Upload size to 100mb (default is 2.5mb)
|
|
DATA_UPLOAD_MAX_MEMORY_SIZE = 104857600
|
|
|
|
# Database
|
|
# https://docs.djangoproject.com/en/1.10/ref/settings/#databases
|
|
|
|
DATABASES = {
|
|
"default": {
|
|
"ENGINE": "django.db.backends.postgresql",
|
|
"NAME": "openslides",
|
|
"USER": get_env("DATABASE_USER", "openslides"),
|
|
"PASSWORD": get_env("DATABASE_PASSWORD", "openslides"),
|
|
"HOST": get_env("DATABASE_HOST", "db"),
|
|
"PORT": get_env("DATABASE_PORT", "5432"),
|
|
},
|
|
"mediafiles": {
|
|
"ENGINE": "django.db.backends.postgresql",
|
|
"NAME": "mediafiledata",
|
|
"USER": get_env("DATABASE_USER", "openslides"),
|
|
"PASSWORD": get_env("DATABASE_PASSWORD", "openslides"),
|
|
"HOST": get_env("DATABASE_HOST", "db"),
|
|
"PORT": get_env("DATABASE_PORT", "5432"),
|
|
},
|
|
}
|
|
|
|
# Redis
|
|
REDIS_HOST = get_env("REDIS_HOST", "redis")
|
|
REDIS_PORT = get_env("REDIS_PORT", 6379, int)
|
|
REDIS_SLAVE_HOST = get_env("REDIS_SLAVE_HOST", "redis-slave")
|
|
REDIS_SLAVE_PORT = get_env("REDIS_SLAVE_PORT", 6379, int)
|
|
REDIS_CHANNLES_HOST = get_env("REDIS_CHANNLES_HOST", "redis-channels")
|
|
REDIS_CHANNLES_PORT = get_env("REDIS_CHANNLES_PORT", 6379, int)
|
|
REDIS_SLAVE_WAIT_TIMEOUT = get_env("REDIS_SLAVE_WAIT_TIMEOUT", 10000, int)
|
|
|
|
# Django Channels
|
|
CHANNEL_LAYERS = {
|
|
"default": {
|
|
"BACKEND": "channels_redis.core.RedisChannelLayer",
|
|
"CONFIG": {
|
|
"hosts": [(REDIS_CHANNLES_HOST, REDIS_CHANNLES_PORT)],
|
|
"capacity": 10000,
|
|
},
|
|
},
|
|
}
|
|
|
|
# Collection Cache
|
|
REDIS_ADDRESS = f"redis://{REDIS_HOST}:{REDIS_PORT}/0"
|
|
REDIS_READ_ONLY_ADDRESS = f"redis://{REDIS_SLAVE_HOST}:{REDIS_SLAVE_PORT}/0"
|
|
AMOUNT_REPLICAS = get_env("AMOUNT_REPLICAS", 1, int)
|
|
CONNECTION_POOL_LIMIT = get_env("CONNECTION_POOL_LIMIT", 100, int)
|
|
|
|
# Session backend
|
|
SESSION_ENGINE = "redis_sessions.session"
|
|
SESSION_REDIS = {
|
|
"host": REDIS_HOST,
|
|
"port": REDIS_PORT,
|
|
"db": 0,
|
|
"prefix": "session",
|
|
"socket_timeout": 2,
|
|
}
|
|
|
|
# SAML integration
|
|
ENABLE_SAML = get_env("ENABLE_SAML", False, bool)
|
|
if ENABLE_SAML:
|
|
INSTALLED_APPS += ["openslides.saml"]
|
|
|
|
# TODO: More saml stuff...
|
|
|
|
# Controls if electronic voting (means non-analog polls) are enabled.
|
|
ENABLE_ELECTRONIC_VOTING = get_env("ENABLE_ELECTRONIC_VOTING", False, bool)
|
|
|
|
# Jitsi integration
|
|
JITSI_DOMAIN = get_env("JITSI_DOMAIN", None)
|
|
JITSI_ROOM_NAME = get_env("JITSI_ROOM_NAME", None)
|
|
JITSI_ROOM_PASSWORD = get_env("JITSI_ROOM_PASSWORD", None)
|
|
|
|
TIME_ZONE = "Europe/Berlin"
|
|
STATICFILES_DIRS = [os.path.join(OPENSLIDES_USER_DATA_DIR, "static")] + STATICFILES_DIRS
|
|
STATIC_ROOT = os.path.join(OPENSLIDES_USER_DATA_DIR, "collected-static")
|
|
MEDIA_ROOT = os.path.join(OPENSLIDES_USER_DATA_DIR, "media", "")
|
|
|
|
LOGGING = {
|
|
"version": 1,
|
|
"disable_existing_loggers": False,
|
|
"formatters": {
|
|
"gunicorn": {
|
|
"format": "{asctime} [{process:d}] [{levelname}] {name} {message}",
|
|
"style": "{",
|
|
"datefmt": "[%Y-%m-%d %H:%M:%S %z]",
|
|
},
|
|
},
|
|
"handlers": {
|
|
"console": {"class": "logging.StreamHandler", "formatter": "gunicorn",},
|
|
},
|
|
"loggers": {
|
|
"django": {
|
|
"handlers": ["console"],
|
|
"level": get_env("DJANGO_LOG_LEVEL", "INFO"),
|
|
},
|
|
"openslides": {
|
|
"handlers": ["console"],
|
|
"level": get_env("OPENSLIDES_LOG_LEVEL", "INFO"),
|
|
},
|
|
},
|
|
}
|
|
|
|
SETTINGS_FILEPATH = __file__
|