settings: use toml configuration files

We replace the current environment variable based configuration approach by
reading all local configuration from a `settings.toml` configuration file.
The docker test, development and production setups have been updated to use
the new setup.

The configuration folder also allows overriding every template in a
`config/templates` directory. We use this in a follow-up to move
all local specific templates, e.g. the registration form, into this
config directory.
toml-configuration-with-templates
Christian Merten 11 months ago
parent 8a9cdc22d1
commit 6ffa2376b8
Signed by: christian.merten
GPG Key ID: D953D69721B948B3

8
.gitignore vendored

@ -106,9 +106,6 @@ jdav_web/my.cnf
# sass cache # sass cache
jdav_web/static/jet/css/themes/*/.sass-cache/* jdav_web/static/jet/css/themes/*/.sass-cache/*
# test config
config
# celerybeat schedule database # celerybeat schedule database
jdav_web/celerybeat-schedule.db jdav_web/celerybeat-schedule.db
@ -125,6 +122,11 @@ docker/development/media
docker/production/media docker/production/media
docker/test/media docker/test/media
# configuration folders
docker/development/config/*
!docker/development/config/settings.toml.example
docker/production/config
*.csv *.csv
jdav_web/static/docs jdav_web/static/docs

@ -0,0 +1,67 @@
[section]
name = "Town"
street = "Street 12"
town = "12345 Town"
telephone = "123456789"
telefax = "987654321"
contact_mail = "contact@jdav-town.de"
board_mail = "board@jdav-town.de"
crisis_intervention_mail = "crisis@jdav-town.de"
iban = "DE42 4242 4242 4242 4242 42"
account_holder = "DAV Town"
responsible_mail = "responsible@jdav-town.de"
digital_mail = "digital@jdav-town.de"
admins = [['Admin', 'admin@jdav-town.de']]
[LJP]
v32_head_organisation = """
LJP application recipient header
"""
[misc]
allowed_email_domains_for_invite_as_user = ['alpenverein-town.de']
send_from_association_email = true
domain = 'jdav-town.de'
[finance]
allowance_per_day = 22
max_night_cost = 11
[links]
cloud = "https://nextcloud.com"
dav_360 = "https://dav360.de"
wiki = "https://wikipedia.org"
docs = "https://jdav-hd.de/static/docs"
registration_form = "download-me"
[startpage]
redirect_url = ''
root_section = 'root section'
recent_section = 'aktuelles'
reports_section = 'berichte'
[django]
deployed = true
debug = true
secret_key = '6_ew6l1r9_4(8=p8quv(e8b+z+k+*wm7&zxx%mcnnec99a!lpw'
allowed_hosts = ['*']
protocol = 'http'
base_url = 'localhost:8000'
host = ''
static_root = '/var/www/jdav_web/assets'
broker_url = 'redis://redis:6379/0'
memcached_url = 'cache:11211'
[mail]
host = 'jdav-town.de'
user = 'user@jdav-town.de'
password = 'password'
default_sending_address = 'info@jdav-town.de'
default_sending_name = 'JDAV Town'
[database]
host = 'db'
port = 3306
database = 'kompass'
user = 'kompass'
password = 'foobar'

@ -8,6 +8,9 @@ x-kompass:
UID: ${UID} UID: ${UID}
GID: ${UID} GID: ${UID}
USER: ${USER} USER: ${USER}
environment:
- KOMPASS_CONFIG_DIR_PATH=/app/config/
- DJANGO_SETTINGS_MODULE=jdav_web.settings
env_file: docker.env env_file: docker.env
restart: always restart: always
depends_on: depends_on:
@ -25,6 +28,7 @@ services:
- ./../../jdav_web:/app/jdav_web - ./../../jdav_web:/app/jdav_web
- ./../../docs:/app/docs - ./../../docs:/app/docs
- ./media:/app/media - ./media:/app/media
- ./config:/app/config:ro
ports: ports:
- "8000:8000" - "8000:8000"

@ -1,33 +1,4 @@
DJANGO_ALLOWED_HOST='*'
DJANGO_BASE_URL='localhost:8000'
DJANGO_PROTOCOL='http'
EMAIL_HOST='example.com'
EMAIL_HOST_USER='foo@example.com'
EMAIL_HOST_PASSWORD='password'
EMAIL_SENDING_ADDRESS='foo@example.com'
EMAIL_SENDING_NAME='My association'
DOMAIN='example.com'
DJANGO_DEPLOY=1
DJANGO_DEBUG=1
DJANGO_DATABASE_NAME='kompass'
DJANGO_DATABASE_USER='kompass'
DJANGO_DATABASE_PASSWORD='foobar'
DJANGO_DATABASE_HOST='db'
DJANGO_DATABASE_PORT=3306
MYSQL_ROOT_PASSWORD='secret' MYSQL_ROOT_PASSWORD='secret'
MYSQL_PASSWORD='foobar' MYSQL_PASSWORD='foobar'
MYSQL_USER='kompass' MYSQL_USER='kompass'
MYSQL_DATABASE='kompass' MYSQL_DATABASE='kompass'
DJANGO_SETTINGS_MODULE='jdav_web.settings'
DJANGO_STATIC_ROOT='/var/www/jdav_web/assets'
MEMCACHED_URL='cache:11211'
BROKER_URL='redis://redis:6379/0'
SEND_FROM_ASSOCIATION_EMAIL=0

@ -2,6 +2,9 @@ x-kompass:
&kompass &kompass
image: kompass:production image: kompass:production
env_file: docker.env env_file: docker.env
environment:
- DJANGO_SETTINGS_MODULE=jdav_web.settings
- KOMPASS_CONFIG_DIR_PATH=/app/config/
restart: always restart: always
depends_on: depends_on:
- redis - redis
@ -19,6 +22,7 @@ services:
- web_static:/app/static/ - web_static:/app/static/
- web_static:/var/www/jdav_web/static/ - web_static:/var/www/jdav_web/static/
- ./media:/var/www/jdav_web/media/ - ./media:/var/www/jdav_web/media/
- ./config:/app/config:ro
nginx: nginx:
build: ./nginx/ build: ./nginx/
@ -43,10 +47,14 @@ services:
celery_worker: celery_worker:
<<: *kompass <<: *kompass
entrypoint: /app/docker/production/entrypoint-celery-worker.sh entrypoint: /app/docker/production/entrypoint-celery-worker.sh
volumes:
- ./config:/app/config:ro
celery_beat: celery_beat:
<<: *kompass <<: *kompass
entrypoint: /app/docker/production/entrypoint-celery-beat.sh entrypoint: /app/docker/production/entrypoint-celery-beat.sh
volumes:
- ./config:/app/config:ro
volumes: volumes:
uwsgi_data: uwsgi_data:

@ -0,0 +1,31 @@
[testing]
mail = "test@localhost"
[django]
deployed = true
debug = true
secret_key = '6_ew6l1r9_4(8=p8quv(e8b+z+k+*wm7&zxx%mcnnec99a!lpw'
allowed_hosts = ['*']
protocol = 'http'
base_url = 'localhost:8000'
host = 'localhost'
static_root = '/var/www/jdav_web/assets'
broker_url = 'redis://redis:6379/0'
memcached_url = 'cache:11211'
[mail]
host = 'localhost'
user = 'test'
password = 'password'
default_sending_address = 'test@localhost'
[database]
host = 'db'
port = 3306
database = 'kompass'
user = 'kompass'
password = 'password'
[startpage]
recent_section = 'aktuelles'
reports_section = 'berichte'

@ -8,6 +8,8 @@ services:
dockerfile: docker/test/Dockerfile dockerfile: docker/test/Dockerfile
env_file: docker.env env_file: docker.env
environment: environment:
- KOMPASS_CONFIG_DIR_PATH=/app/config/
- DJANGO_SETTINGS_MODULE=jdav_web.settings
- DJANGO_TEST_KEEPDB=$DJANGO_TEST_KEEPDB - DJANGO_TEST_KEEPDB=$DJANGO_TEST_KEEPDB
depends_on: depends_on:
- redis - redis
@ -15,6 +17,7 @@ services:
- db - db
entrypoint: /app/docker/test/entrypoint-master.sh entrypoint: /app/docker/test/entrypoint-master.sh
volumes: volumes:
- ./config:/app/config:ro
- type: bind - type: bind
source: ./htmlcov/ source: ./htmlcov/
target: /app/jdav_web/htmlcov/ target: /app/jdav_web/htmlcov/

@ -1,28 +1,4 @@
DJANGO_ALLOWED_HOST='*'
DJANGO_BASE_URL='localhost:8000'
DJANGO_PROTOCOL='http'
EMAIL_HOST='localhost'
EMAIL_HOST_USER='test'
EMAIL_HOST_PASSWORD='password'
EMAIL_SENDING_ADDRESS='test@localhost'
DJANGO_DEPLOY=1
DJANGO_DEBUG=1
DJANGO_DATABASE_NAME='kompass'
DJANGO_DATABASE_USER='kompass'
DJANGO_DATABASE_PASSWORD='password'
DJANGO_DATABASE_HOST='db'
DJANGO_DATABASE_PORT=3306
MYSQL_ROOT_PASSWORD='secretpassword' MYSQL_ROOT_PASSWORD='secretpassword'
MYSQL_PASSWORD='password' MYSQL_PASSWORD='password'
MYSQL_USER='kompass' MYSQL_USER='kompass'
MYSQL_DATABASE='kompass' MYSQL_DATABASE='kompass'
DJANGO_SETTINGS_MODULE='jdav_web.settings'
DJANGO_STATIC_ROOT='/var/www/jdav_web/assets'
MEMCACHED_URL='cache:11211'
BROKER_URL='redis://redis:6379/0'

@ -12,6 +12,42 @@ https://docs.djangoproject.com/en/1.10/ref/settings/
from split_settings.tools import optional, include from split_settings.tools import optional, include
import os import os
import tomli
CONFIG_DIR_PATH = os.environ.get('KOMPASS_CONFIG_DIR_PATH', '')
SETTINGS_FILE = os.environ.get('KOMPASS_SETTINGS_FILE', 'settings.toml')
TEXTS_FILE = os.environ.get('KOMPASS_TEXTS_FILE', 'texts.toml')
with open(os.path.join(CONFIG_DIR_PATH, SETTINGS_FILE), 'rb') as f:
config = tomli.load(f)
if os.path.exists(os.path.join(CONFIG_DIR_PATH, TEXTS_FILE)):
with open(os.path.join(CONFIG_DIR_PATH, TEXTS_FILE), 'rb') as f:
texts = tomli.load(f)
else:
texts = {}
def get_var(*keys, default='', dictionary=config):
"""
Get a variable from given config dictionary. The passed keys are used
for nested retrieval from the dictionary.
"""
cfg = dictionary
for key in keys:
if key not in cfg:
return default
else:
cfg = cfg[key]
return cfg
def get_text(*keys, default=''):
"""
Get a text from the `texts.toml`.
"""
return get_var(*keys, default=default, dictionary=texts)
base_settings = [ base_settings = [
'local.py', 'local.py',

@ -1,26 +1,25 @@
deployed = '1' == os.environ.get('DJANGO_DEPLOY', '0') deployed = get_var('django', 'deployed', default=False)
# Build paths inside the project like this: os.path.join(BASE_DIR, ...) # Build paths inside the project like this: os.path.join(BASE_DIR, ...)
BASE_DIR = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) BASE_DIR = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
# SECURITY WARNING: keep the secret key used in production secret! # SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = os.environ.get('DJANGO_SECRET_KEY', SECRET_KEY = get_var('django', 'secret_key', default='secret')
'6_ew6l1r9_4(8=p8quv(e8b+z+k+*wm7&zxx%mcnnec99a!lpw')
# SECURITY WARNING: don't run with debug turned on in production! # SECURITY WARNING: don't run with debug turned on in production!
DEBUG = os.environ.get('DJANGO_DEBUG', '1') == '1' DEBUG = get_var('django', 'debug', default=True)
ALLOWED_HOSTS = os.environ.get('DJANGO_ALLOWED_HOST', '').split(",") ALLOWED_HOSTS = get_var('django', 'allowed_hosts', default=["*"])
# hostname and base url # hostname and base url
HOST = os.environ.get('DJANGO_ALLOWED_HOST', 'localhost:8000').split(",")[0] HOST = get_var('django', 'host', default='localhost:8000')
PROTOCOL = os.environ.get('DJANGO_PROTOCOL', 'https') PROTOCOL = get_var('django', 'protocol', default='https')
BASE_URL = os.environ.get('DJANGO_BASE_URL', HOST) BASE_URL = get_var('django', 'base_url', default=HOST)
# Define media paths e.g. for image storage # Define media paths e.g. for image storage
MEDIA_URL = '/media/' MEDIA_URL = '/media/'
MEDIA_ROOT = os.environ.get('DJANGO_MEDIA_ROOT', MEDIA_ROOT = get_var('django', 'media_root',
os.path.join((os.path.join(BASE_DIR, os.pardir)), "media")) default=os.path.join((os.path.join(BASE_DIR, os.pardir)), "media"))
MEDIA_MEMBERLISTS = os.path.join((os.path.join(BASE_DIR, os.pardir)), "media") MEDIA_MEMBERLISTS = os.path.join((os.path.join(BASE_DIR, os.pardir)), "media")
# default primary key auto field type # default primary key auto field type
@ -83,7 +82,8 @@ ROOT_URLCONF = 'jdav_web.urls'
TEMPLATES = [ TEMPLATES = [
{ {
'BACKEND': 'django.template.backends.django.DjangoTemplates', 'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, 'templates')], 'DIRS': [os.path.join(CONFIG_DIR_PATH, 'templates'),
os.path.join(BASE_DIR, 'templates')],
'APP_DIRS': True, 'APP_DIRS': True,
'OPTIONS': { 'OPTIONS': {
'context_processors': [ 'context_processors': [
@ -131,8 +131,7 @@ STATICFILES_DIRS = [
# static root where all the static files are collected to # static root where all the static files are collected to
# use python3 manage.py collectstatic to collect static files in the STATIC_ROOT # use python3 manage.py collectstatic to collect static files in the STATIC_ROOT
# this is needed for deployment # this is needed for deployment
STATIC_ROOT = os.environ.get('DJANGO_STATIC_ROOT', STATIC_ROOT = get_var('django', 'static_root', default='/var/www/jdav_web/static')
'/var/www/jdav_web/static')
# Locale files (translations) # Locale files (translations)
@ -140,7 +139,7 @@ STATIC_ROOT = os.environ.get('DJANGO_STATIC_ROOT',
LOCALE_PATHS = (os.path.join(BASE_DIR, 'locale'),) LOCALE_PATHS = (os.path.join(BASE_DIR, 'locale'),)
# Celery and Redis setup # Celery and Redis setup
BROKER_URL = os.environ.get('BROKER_URL', 'redis://localhost:6379/0') BROKER_URL = get_var('django', 'broker_url', default='redis://localhost:6379/0')
# password hash algorithms used # password hash algorithms used
@ -194,3 +193,6 @@ MARKDOWNIFY = {
# allowed characters in names appearing in urls on the website # allowed characters in names appearing in urls on the website
STARTPAGE_URL_NAME_PATTERN = "[\w\-: *]" STARTPAGE_URL_NAME_PATTERN = "[\w\-: *]"
# admins to contact on error messages
ADMINS = get_var('section', 'admins', default=[])

@ -1,7 +1,7 @@
CACHES = { CACHES = {
'default': { 'default': {
'BACKEND': 'django.core.cache.backends.memcached.PyMemcacheCache', 'BACKEND': 'django.core.cache.backends.memcached.PyMemcacheCache',
'LOCATION': os.environ.get('MEMCACHED_URL', '127.0.0.1:11211'), 'LOCATION': get_var('django', 'memcached_url', default='127.0.0.1:11211'),
'OPTIONS': { 'OPTIONS': {
'no_delay': True, 'no_delay': True,
'ignore_exc': True, 'ignore_exc': True,

@ -4,11 +4,11 @@
DATABASES = { DATABASES = {
'default': { 'default': {
'ENGINE': 'django.db.backends.mysql', 'ENGINE': 'django.db.backends.mysql',
'NAME': os.environ.get('DJANGO_DATABASE_NAME', 'jdav_db'), 'NAME': get_var('database', 'database', default='jdav_db'),
'USER': os.environ.get('DJANGO_DATABASE_USER', 'jdav_user'), 'USER': get_var('database', 'user', default='user'),
'PASSWORD': os.environ.get('DJANGO_DATABASE_PASSWORD', 'jdav00jdav'), 'PASSWORD': get_var('database', 'password', default='secret'),
'HOST': os.environ.get('DJANGO_DATABASE_HOST', '127.0.0.1'), 'HOST': get_var('database', 'host', default='127.0.0.1'),
'PORT': os.environ.get('DJANGO_DATABASE_PORT', '5432') 'PORT': get_var('database', 'port', default=5432)
} }
} }

@ -1,10 +1,10 @@
# Email setup # Email setup
EMAIL_HOST = os.environ.get('EMAIL_HOST', 'localhost') EMAIL_HOST = get_var('mail', 'host', default='localhost')
EMAIL_PORT = 587 if deployed else 25 EMAIL_PORT = get_var('mail', 'port', default=587 if deployed else 25)
EMAIL_HOST_USER = os.environ.get('EMAIL_HOST_USER', '') EMAIL_HOST_USER = get_var('mail', 'user', default='user')
EMAIL_HOST_PASSWORD = os.environ.get('EMAIL_HOST_PASSWORD', '') EMAIL_HOST_PASSWORD = get_var('mail', 'password', default='secret')
EMAIL_USE_TLS = True if deployed else False EMAIL_USE_TLS = get_var('mail', 'tls', default=True if deployed else False)
EMAIL_BACKEND = 'djcelery_email.backends.CeleryEmailBackend' EMAIL_BACKEND = 'djcelery_email.backends.CeleryEmailBackend'
# Celery Email Setup # Celery Email Setup
@ -13,5 +13,5 @@ CELERY_EMAIL_TASK_CONFIG = {
'rate_limit' : '10/m' # * CELERY_EMAIL_CHUNK_SIZE (default: 10) 'rate_limit' : '10/m' # * CELERY_EMAIL_CHUNK_SIZE (default: 10)
} }
DEFAULT_SENDING_MAIL = os.environ.get('EMAIL_SENDING_ADDRESS', 'django@localhost') DEFAULT_SENDING_MAIL = get_var('mail', 'default_sending_address', default='kompass@localhost')
DEFAULT_SENDING_NAME = os.environ.get('EMAIL_SENDING_NAME', 'Kompass') DEFAULT_SENDING_NAME = get_var('mail', 'default_sending_name', default='Kompass')

@ -1,6 +1,6 @@
# mail texts # mail texts
CONFIRM_MAIL_TEXT = """Hallo {name}, CONFIRM_MAIL_TEXT = get_text('confirm_mail', default="""Hallo {name},
du hast bei der JDAV %(SEKTION)s eine E-Mail Adresse hinterlegt. Da bei uns alle Kommunikation du hast bei der JDAV %(SEKTION)s eine E-Mail Adresse hinterlegt. Da bei uns alle Kommunikation
per Email funktioniert, brauchen wir eine Bestätigung {whattoconfirm}. Dazu klicke bitte einfach auf per Email funktioniert, brauchen wir eine Bestätigung {whattoconfirm}. Dazu klicke bitte einfach auf
@ -9,9 +9,9 @@ folgenden Link:
{link} {link}
Viele Grüße Viele Grüße
Deine JDAV %(SEKTION)s""" % { 'SEKTION': SEKTION } Deine JDAV %(SEKTION)s""" % { 'SEKTION': SEKTION })
NEW_UNCONFIRMED_REGISTRATION = """Hallo {name}, NEW_UNCONFIRMED_REGISTRATION = get_text('new_unconfirmed_registration', default="""Hallo {name},
für deine Gruppe {group} liegt eine neue unbestätigte Reservierung vor. Die Person hat bereits ihre für deine Gruppe {group} liegt eine neue unbestätigte Reservierung vor. Die Person hat bereits ihre
E-Mailadressen bestätigt und ihr Anmeldeformular hochgeladen. Bitte prüfe die Registrierung eingehend und E-Mailadressen bestätigt und ihr Anmeldeformular hochgeladen. Bitte prüfe die Registrierung eingehend und
@ -20,13 +20,15 @@ bestätige falls möglich. Zu der Registrierung kommst du hier:
{link} {link}
Viele Grüße Viele Grüße
Dein KOMPASS""" Dein KOMPASS""")
GROUP_TIME_AVAILABLE_TEXT = """Die Gruppenstunde findet jeden {weekday} von {start_time} bis {end_time} Uhr statt.""" GROUP_TIME_AVAILABLE_TEXT = get_text('group_time_available',
default="""Die Gruppenstunde findet jeden {weekday} von {start_time} bis {end_time} Uhr statt.""")
GROUP_TIME_UNAVAILABLE_TEXT = """Bitte erfrage die Gruppenzeiten bei der Gruppenleitung ({contact_email}).""" GROUP_TIME_UNAVAILABLE_TEXT = get_text('group_time_unavailable',
default="""Bitte erfrage die Gruppenzeiten bei der Gruppenleitung ({contact_email}).""")
INVITE_TEXT = """Hallo {{name}}, INVITE_TEXT = get_text('invite', default="""Hallo {{name}},
wir haben gute Neuigkeiten für dich. Es ist ein Platz in der Jugendgruppe {group_name} {group_link}freigeworden. wir haben gute Neuigkeiten für dich. Es ist ein Platz in der Jugendgruppe {group_name} {group_link}freigeworden.
{group_time} {group_time}
@ -50,10 +52,10 @@ Bei Fragen, wende dich gerne an %(RESPONSIBLE_MAIL)s.
Viele Grüße Viele Grüße
Deine JDAV %(SEKTION)s""" % { 'SEKTION': SEKTION, 'RESPONSIBLE_MAIL': RESPONSIBLE_MAIL, Deine JDAV %(SEKTION)s""" % { 'SEKTION': SEKTION, 'RESPONSIBLE_MAIL': RESPONSIBLE_MAIL,
'REGISTRATION_FORM_DOWNLOAD_LINK': REGISTRATION_FORM_DOWNLOAD_LINK } 'REGISTRATION_FORM_DOWNLOAD_LINK': REGISTRATION_FORM_DOWNLOAD_LINK })
LEAVE_WAITINGLIST_TEXT = """Hallo {name}, LEAVE_WAITINGLIST_TEXT = get_text('leave_waitinglist', default="""Hallo {name},
du hast dich erfolgreich von der Warteliste abgemeldet. Falls du zu einem späteren du hast dich erfolgreich von der Warteliste abgemeldet. Falls du zu einem späteren
Zeitpunkt wieder der Warteliste beitreten möchtest, kannst du das über unsere Webseite machen. Zeitpunkt wieder der Warteliste beitreten möchtest, kannst du das über unsere Webseite machen.
@ -61,10 +63,10 @@ Zeitpunkt wieder der Warteliste beitreten möchtest, kannst du das über unsere
Falls du dich nicht selbst abgemeldet hast, wende dich bitte umgehend an %(RESPONSIBLE_MAIL)s. Falls du dich nicht selbst abgemeldet hast, wende dich bitte umgehend an %(RESPONSIBLE_MAIL)s.
Viele Grüße Viele Grüße
Deine JDAV %(SEKTION)s""" % { 'SEKTION': SEKTION, 'RESPONSIBLE_MAIL': RESPONSIBLE_MAIL } Deine JDAV %(SEKTION)s""" % { 'SEKTION': SEKTION, 'RESPONSIBLE_MAIL': RESPONSIBLE_MAIL })
WAIT_CONFIRMATION_TEXT = """Hallo {name}, WAIT_CONFIRMATION_TEXT = get_text('wait_confirmation', default="""Hallo {name},
leider können wir dir zur Zeit noch keinen Platz in einer Jugendgruppe anbieten. Da wir leider können wir dir zur Zeit noch keinen Platz in einer Jugendgruppe anbieten. Da wir
sehr viele Interessenten haben und wir möglichst vielen die Möglichkeit bieten möchten, an sehr viele Interessenten haben und wir möglichst vielen die Möglichkeit bieten möchten, an
@ -79,15 +81,15 @@ Das ist Erinnerung Nummer {reminder} von {max_reminder_count}. Nach Erinnerung N
du automatisch entfernt. du automatisch entfernt.
Viele Grüße Viele Grüße
Deine JDAV %(SEKTION)s""" % { 'SEKTION': SEKTION } Deine JDAV %(SEKTION)s""" % { 'SEKTION': SEKTION })
UNSUBSCRIBE_CONFIRMATION_TEXT = """Klicke auf den Link, um dich vom Newsletter der JDAV %(SEKTION)s abzumelden UNSUBSCRIBE_CONFIRMATION_TEXT = get_text('unsubscribe_confirmation', default="""Klicke auf den Link, um dich vom Newsletter der JDAV %(SEKTION)s abzumelden
{link}""" % { 'SEKTION': SEKTION } {link}""" % { 'SEKTION': SEKTION })
NOTIFY_MOST_ACTIVE_TEXT = """Hallo {name}! NOTIFY_MOST_ACTIVE_TEXT = get_text('notify_most_active', default="""Hallo {name}!
Herzlichen Glückwunsch, du hast im letzten Jahr zu den {congratulate_max} aktivsten Herzlichen Glückwunsch, du hast im letzten Jahr zu den {congratulate_max} aktivsten
Mitgliedern der JDAV %(SEKTION)s gehört! Um genau zu sein beträgt dein Aktivitäts Wert Mitgliedern der JDAV %(SEKTION)s gehört! Um genau zu sein beträgt dein Aktivitäts Wert
@ -97,10 +99,10 @@ im letzten Jahr das {position}aktivste Mitglied der JDAV %(SEKTION)s.
Auf ein weiteres aktives Jahr in der JDAV %(SEKTION)s. Auf ein weiteres aktives Jahr in der JDAV %(SEKTION)s.
Dein:e Jugendreferent:in""" % { 'SEKTION': SEKTION } Dein:e Jugendreferent:in""" % { 'SEKTION': SEKTION })
ECHO_TEXT = """Hallo {name}, ECHO_TEXT = get_text('echo', default="""Hallo {name},
um unsere Daten auf dem aktuellen Stand zu halten und sicherzugehen, dass du um unsere Daten auf dem aktuellen Stand zu halten und sicherzugehen, dass du
weiterhin ein Teil unserer Jugendarbeit bleiben möchtest, brauchen wir eine weiterhin ein Teil unserer Jugendarbeit bleiben möchtest, brauchen wir eine
@ -119,10 +121,10 @@ gelöscht und du erhälst in Zukunft keine Mails mehr von uns.
Bei Fragen, wende dich gerne an %(RESPONSIBLE_MAIL)s. Bei Fragen, wende dich gerne an %(RESPONSIBLE_MAIL)s.
Viele Grüße Viele Grüße
Deine JDAV %(SEKTION)s""" % { 'SEKTION': SEKTION, 'RESPONSIBLE_MAIL': RESPONSIBLE_MAIL } Deine JDAV %(SEKTION)s""" % { 'SEKTION': SEKTION, 'RESPONSIBLE_MAIL': RESPONSIBLE_MAIL })
PREPEND_INCOMPLETE_REGISTRATION_TEXT = """WICHTIGE MITTEILUNG PREPEND_INCOMPLETE_REGISTRATION_TEXT = get_text('prepend_incomplete_registration', default="""WICHTIGE MITTEILUNG
Deine Anmeldung ist aktuell nicht vollständig. Bitte fülle umgehend das Deine Anmeldung ist aktuell nicht vollständig. Bitte fülle umgehend das
Anmeldeformular aus und lasse es Deine*r Jugendleiter*in zukommen! Dieses Anmeldeformular aus und lasse es Deine*r Jugendleiter*in zukommen! Dieses
@ -132,10 +134,10 @@ kannst Du unter folgendem Link herunterladen:
**************** ****************
""" % { 'REGISTRATION_FORM_DOWNLOAD_LINK': REGISTRATION_FORM_DOWNLOAD_LINK } """ % { 'REGISTRATION_FORM_DOWNLOAD_LINK': REGISTRATION_FORM_DOWNLOAD_LINK })
MAIL_FOOTER = """ MAIL_FOOTER = get_text('mail_footer', default="""
**************** ****************
@ -144,10 +146,10 @@ Diese Email wurde über die Webseite der JDAV %(SEKTION)s
verschickt. Wenn Du in Zukunft keine Emails mehr erhalten möchtest, verschickt. Wenn Du in Zukunft keine Emails mehr erhalten möchtest,
kannst Du hier den Newsletter deabonnieren: kannst Du hier den Newsletter deabonnieren:
{link}""" % { 'SEKTION': SEKTION } {link}""" % { 'SEKTION': SEKTION })
INVITE_AS_USER_TEXT = """Hallo {name}, INVITE_AS_USER_TEXT = get_text('invite_as_user', default="""Hallo {name},
du bist Jugendleiter*in in der Sektion %(SEKTION)s. Die Verwaltung unserer Jugendgruppen, du bist Jugendleiter*in in der Sektion %(SEKTION)s. Die Verwaltung unserer Jugendgruppen,
Ausfahrten und Finanzen erfolgt in unserer Online Plattform Kompass. Deine Stammdaten sind Ausfahrten und Finanzen erfolgt in unserer Online Plattform Kompass. Deine Stammdaten sind
@ -159,10 +161,10 @@ und wähle ein Passwort.
Bei Fragen, wende dich gerne an %(RESPONSIBLE_MAIL)s. Bei Fragen, wende dich gerne an %(RESPONSIBLE_MAIL)s.
Viele Grüße Viele Grüße
Deine JDAV %(SEKTION)s""" % { 'SEKTION': SEKTION, 'RESPONSIBLE_MAIL': RESPONSIBLE_MAIL } Deine JDAV %(SEKTION)s""" % { 'SEKTION': SEKTION, 'RESPONSIBLE_MAIL': RESPONSIBLE_MAIL })
UPLOAD_REGISTRATION_FORM_TEXT = """Hallo {name}, UPLOAD_REGISTRATION_FORM_TEXT = get_text('upload_registration_form', default="""Hallo {name},
vielen Dank für deine Anmeldung in der JDAV %(SEKTION)s. Bevor es richtig losgehen kann, brauchen vielen Dank für deine Anmeldung in der JDAV %(SEKTION)s. Bevor es richtig losgehen kann, brauchen
wir noch die Bestätigung deiner Daten und die Zustimmung zu unseren Teilnahmebedingungen. wir noch die Bestätigung deiner Daten und die Zustimmung zu unseren Teilnahmebedingungen.
@ -177,9 +179,9 @@ Bist du noch nicht volljährig? Dann muss eine erziehungsberechtigte Person das
Bei Fragen, wende dich gerne an %(RESPONSIBLE_MAIL)s. Bei Fragen, wende dich gerne an %(RESPONSIBLE_MAIL)s.
Viele Grüße Viele Grüße
Deine JDAV %(SEKTION)s""" % { 'SEKTION': SEKTION, 'RESPONSIBLE_MAIL': RESPONSIBLE_MAIL } Deine JDAV %(SEKTION)s""" % { 'SEKTION': SEKTION, 'RESPONSIBLE_MAIL': RESPONSIBLE_MAIL })
ADDRESS = """JDAV %(SEKTION)s ADDRESS = get_text('address', default="""JDAV %(SEKTION)s
%(STREET)s %(STREET)s
%(PLACE)s""" % { 'SEKTION': SEKTION, 'STREET': SEKTION_STREET, 'PLACE': SEKTION_TOWN } %(PLACE)s""" % { 'SEKTION': SEKTION, 'STREET': SEKTION_STREET, 'PLACE': SEKTION_TOWN })

@ -1,75 +1,74 @@
# contact data # contact data
SEKTION = "Heidelberg" SEKTION = get_var('section', 'name', default='Heyo')
SEKTION_STREET = "Harbigweg 20" SEKTION_STREET = get_var('section', 'street', default='Street')
SEKTION_TOWN = "69124 Heidelberg" SEKTION_TOWN = get_var('section', 'town', default='12345 Town')
SEKTION_TELEPHONE = "06221 284076" SEKTION_TELEPHONE = get_var('section', 'telephone', default='0123456789')
SEKTION_TELEFAX = "06221 437338" SEKTION_TELEFAX = get_var('section', 'telefax', default=SEKTION_TELEPHONE)
SEKTION_CONTACT_MAIL = "geschaeftsstelle@alpenverein-heidelberg.de" SEKTION_CONTACT_MAIL = get_var('section', 'contact_mail', default='info@example.org')
SEKTION_BOARD_MAIL = "vorstand@alpenverein-heidelberg.de" SEKTION_BOARD_MAIL = get_var('section', 'board_mail', default=SEKTION_CONTACT_MAIL)
SEKTION_CRISIS_INTERVENTION_MAIL = "krisenmanagement@alpenverein-heidelberg.de" SEKTION_CRISIS_INTERVENTION_MAIL = get_var('section', 'crisis_intervention_mail',
SEKTION_IBAN = "DE22 6729 0000 0000 1019 40" default=SEKTION_BOARD_MAIL)
SEKTION_ACCOUNT_HOLDER = "Deutscher Alpenverein Sektion Heidelberg 1869" SEKTION_IBAN = get_var('section', 'iban', default='Foo 123')
SEKTION_ACCOUNT_HOLDER = get_var('section', 'account_holder',
RESPONSIBLE_MAIL = "jugendreferat@jdav-hd.de" default='Foo')
DIGITAL_MAIL = "digitales@jdav-hd.de"
RESPONSIBLE_MAIL = get_var('section', 'responsible_mail', default='foo@example.org')
DIGITAL_MAIL = get_var('section', 'digital_mail', default='bar@example.org')
# LJP # LJP
V32_HEAD_ORGANISATION = """JDAV Baden-Württemberg V32_HEAD_ORGANISATION = get_var('LJP', 'v32_head_organisation', default='not configured')
Rotebühlstraße 59A LJP_CONTRIBUTION_PER_DAY = get_var('LJP', 'contribution_per_day', default=25)
70178 Stuttgart
info@jdav-bw.de
0711 - 49 09 46 00"""
LJP_CONTRIBUTION_PER_DAY = 25
# echo # echo
ECHO_PASSWORD_BIRTHDATE_FORMAT = '%d.%m.%Y' # used to generate the personalized echo password
ECHO_GRACE_PERIOD = 30 ECHO_PASSWORD_BIRTHDATE_FORMAT = get_var('echo', 'password_birthdate_format', default='%d.%m.%Y')
# grace period in days after which echo keys expire
ECHO_GRACE_PERIOD = get_var('echo', 'grace_period', default=30)
# misc # Waiting list configuration parameters, all numbers are in days
CONGRATULATE_MEMBERS_MAX = 10 GRACE_PERIOD_WAITING_CONFIRMATION = get_var('waitinglist', 'grace_period_confirmation', default=30)
MAX_AGE_GOOD_CONDUCT_CERTIFICATE_MONTHS = 24 WAITING_CONFIRMATION_FREQUENCY = get_var('waitinglist', 'confirmation_frequency', default=90)
ALLOWED_EMAIL_DOMAINS_FOR_INVITE_AS_USER = ('alpenverein-heidelberg.de', ) CONFIRMATION_REMINDER_FREQUENCY = get_var('waitinglist', 'confirmation_reminder_frequency', default=30)
MAX_REMINDER_COUNT = get_var('waitinglist', 'max_reminder_count', default=3)
# mail mode # misc
SEND_FROM_ASSOCIATION_EMAIL = os.environ.get('SEND_FROM_ASSOCIATION_EMAIL', '0') == '1' # the maximal number of members that get sent congratulations for highest activity on aprils fools day
CONGRATULATE_MEMBERS_MAX = get_var('misc', 'congratulate_members_max', default=10)
# expiry duration of a good conduct certificate in months
MAX_AGE_GOOD_CONDUCT_CERTIFICATE_MONTHS = get_var('misc', 'max_age_good_conduct_certificate_months', default=24)
# accepted email domains for inviting users
ALLOWED_EMAIL_DOMAINS_FOR_INVITE_AS_USER = get_var('misc', 'allowed_email_domains_for_invite_as_user',
default=['example.org'])
# send all mails from the assocation's contact mail or from personal association mails
SEND_FROM_ASSOCIATION_EMAIL = get_var('misc', 'send_from_association_email', default=False)
# domain for association email and generated urls
DOMAIN = get_var('misc', 'domain', default='example.org')
# finance # finance
ALLOWANCE_PER_DAY = 22 ALLOWANCE_PER_DAY = get_var('finance', 'allowance_per_day', default=22)
MAX_NIGHT_COST = 11 MAX_NIGHT_COST = get_var('finance', 'max_night_cost', default=11)
CLOUD_LINK = os.environ.get('CLOUD_LINK', 'https://startpage.com') # links
DAV_360_LINK = os.environ.get('DAV_360_LINK', 'https://dav360.de')
WIKI_LINK = os.environ.get('WIKI_LINK', 'https://wikipedia.org')
DOCS_LINK = os.environ.get('DOCS_LINK', 'https://jdav-hd.de/static/docs/')
# Admin setup CLOUD_LINK = get_var('links', 'cloud', default='https://startpage.com')
DAV_360_LINK = get_var('links', 'dav_360', default='https://dav360.de')
WIKI_LINK = get_var('links', 'wiki', default='https://wikipedia.org')
DOCS_LINK = get_var('links', 'docs', default='https://github.com/chrisflav/kompass')
REGISTRATION_FORM_DOWNLOAD_LINK = get_var('links', 'registration_form', default='https://startpage.com')
ADMINS = (('admin', 'christian@merten-moser.de'),) # startpage
# Waiting list configuration parameters, all numbers are in days STARTPAGE_REDIRECT_URL = get_var('startpage', 'redirect_url', default='')
ROOT_SECTION = get_var('startpage', 'root_section', default='about')
GRACE_PERIOD_WAITING_CONFIRMATION = 30 RECENT_SECTION = get_var('startpage', 'recent_section', default='recent')
WAITING_CONFIRMATION_FREQUENCY = 90 REPORTS_SECTION = get_var('startpage', 'reports_section', default='reports')
CONFIRMATION_REMINDER_FREQUENCY = 30
MAX_REMINDER_COUNT = 3
# testing # testing
TEST_MAIL = "post@flavigny.de" TEST_MAIL = get_var('testing', 'mail', default='test@localhost')
REGISTRATION_FORM_DOWNLOAD_LINK = os.environ.get('REGISTRATION_FORM_DOWNLOAD_LINK', 'https://startpage.com')
DOMAIN = os.environ.get('DOMAIN', 'example.com')
STARTPAGE_REDIRECT_URL = 'https://jdav-hd.de'
ROOT_SECTION = os.environ.get('ROOT_SECTION', 'wir')
RECENT_SECTION = 'aktuelles'
REPORTS_SECTION = 'berichte'

Loading…
Cancel
Save