Seperated some config settings from code.

This commit is contained in:
2018-01-26 14:28:09 +01:00
parent c250854cbe
commit 5cf05666ab
9 changed files with 231 additions and 137 deletions

View File

@@ -1,31 +1,14 @@
# -*- coding: utf-8 -*-
from django.utils.translation import ugettext_lazy as _
import importlib
import re
from django.apps import AppConfig as _AppConfig
from django.core.exceptions import ImproperlyConfigured
# E-Mails
ENABLE_EMAIL_NOTIFICATIONS = True
EMAIL_SENDER = 'Jens Kleineheismann <kleineheismann@kit.edu>'
EMAIL_BASE_URL = 'http://localhost:8000'
# Auth Config
MANAGE_ALL_GROUP = 'Tourenreferenten'
MANAGE_W_GROUP = 'Wanderreferenten'
MANAGE_S_GROUP = 'Skireferenten'
MANAGE_M_GROUP = 'MTBReferenten'
MANAGE_K_GROUP = 'Kletterreferenten'
MANAGE_B_GROUP = 'Bergsteigerreferenten'
PUBLISHER_GROUP = 'Redaktion'
INCREMENTAL_PUBLISHER_GROUP = 'OnlineRedaktion'
# Form Config
# Form and Model Field Config
COMMON_CHAR_FIELD_LENGTH = 250
NUMBER_MAX_LENGTH = 12
TITLE_MAX_LENGTH = COMMON_CHAR_FIELD_LENGTH
TRAINER_NAME_MAX_LENGTH = COMMON_CHAR_FIELD_LENGTH
PHONE_NUMBER_MAX_LENGTH = COMMON_CHAR_FIELD_LENGTH
LOCATION_MAX_LENGTH = COMMON_CHAR_FIELD_LENGTH
TRANSPORT_OTHER_MAX_LENGTH = COMMON_CHAR_FIELD_LENGTH
MEETING_POINT_OTHER_MAX_LENGTH = COMMON_CHAR_FIELD_LENGTH
@@ -34,89 +17,66 @@ ACCOMMODATION_OTHER_MAX_LENGTH = COMMON_CHAR_FIELD_LENGTH
MEALS_OTHER_MAX_LENGTH = COMMON_CHAR_FIELD_LENGTH
ADDITIONAL_COSTS_MAX_LENGTH = COMMON_CHAR_FIELD_LENGTH
FEE_MATRIX = {
'0': {'description': _(u'Keiner / direkte Abrechnung (Tageswanderung)'),
'trainer_fee': 0,
'pre_meeting_fee': 0,
'trainer_day_fee': 0,
'participant_fee': 0,
'participant_day_fee': 0,
},
'A': {'description': _(u'A (Mehrtageswanderung Mittelgebirge'),
'trainer_fee': 40,
'trainer_day_fee': 50,
'participant_fee': 10,
'participant_day_fee': 10,
'pre_meeting_fee': 0,
},
'B': {'description': _(u'B (Alpine Mehrtageswanderung)'),
'trainer_fee': 50,
'trainer_day_fee': 75,
'participant_fee': 10,
'participant_day_fee': 20,
'pre_meeting_fee': 0,
},
'C': {'description': _(u'C (Tour/Kurs ohne Übernachtung)'),
'trainer_fee': 30,
'trainer_day_fee': 60,
'participant_fee': 10,
'participant_day_fee': 30,
'pre_meeting_fee': 0,
},
'D': {'description': _(u'D (Tour/Kurs Mittelgebirge)'),
'trainer_fee': 50,
'trainer_day_fee': 75,
'participant_fee': 20,
'participant_day_fee': 25,
'pre_meeting_fee': 0,
},
'E': {'description': _(u'E (Alpine Klettertour DE/AU)'),
'trainer_fee': 80,
'trainer_day_fee': 75,
'participant_fee': 40,
'participant_day_fee': 40,
'pre_meeting_fee': 0,
},
'F': {'description': _(u'F (Alpine Klettertour CH/FR/IT)'),
'trainer_fee': 80,
'trainer_day_fee': 85,
'participant_fee': 40,
'participant_day_fee': 45,
'pre_meeting_fee': 0,
},
'G': {'description': _(u'G (Alpiner Kurs DE/AU)'),
'trainer_fee': 100,
'trainer_day_fee': 75,
'participant_fee': 35,
'participant_day_fee': 30,
'pre_meeting_fee': 0,
},
'H': {'description': _(u'H (Alpiner Kurs CH/FR/IT/..)'),
'trainer_fee': 100,
'trainer_day_fee': 85,
'participant_fee': 35,
'participant_day_fee': 30,
'pre_meeting_fee': 0,
},
'I': {'description': _(u'I (Alpine MTB/Ski-Tour DE/AU)'),
'trainer_fee': 80,
'trainer_day_fee': 75,
'participant_fee': 25,
'participant_day_fee': 25,
'pre_meeting_fee': 0,
},
'J': {'description': _(u'J (Alpine MTB/Ski-Tour CH/FR/IT/..)'),
'trainer_fee': 80,
'trainer_day_fee': 85,
'participant_fee': 25,
'participant_day_fee': 25,
'pre_meeting_fee': 0,
},
'K': {'description': _(u'K (Ski-Tour/-Kurs mit Liftbenutzung)'),
'trainer_fee': 80,
'trainer_day_fee': 130,
'participant_fee': 40,
'participant_day_fee': 40,
'pre_meeting_fee': 0,
},
}
class DefaultSetting(object):
def __init__(self, name, value, key_name=None, validator=None):
self.name = name
self.value = value
if key_name is None:
self.key_name = self.name.upper()
else:
self.key_name = key_name
self.validator = validator
def validate(self, value):
if hasattr(self, 'validator') and self.validator is not None:
if callable(self.validator):
if not self.validator(value):
raise ImproperlyConfigured("Validator callback {clb} returned False".format(clb=self.validator))
else:
if not re.search(self.validator, value):
raise ImproperlyConfigured("Does not match /{re}/".format(re=self.validator))
class AppSettings(object):
def __init__(self, app_name, defaults):
settings_name = 'main.settings-' + app_name
try:
settings_module = importlib.import_module(settings_name)
except ImportError:
settings_module = None
for default in defaults:
if hasattr(settings_module, default.key_name):
value = getattr(settings_module, default.key_name)
try:
default.validate(value)
except ImproperlyConfigured as e:
msg = 'Invalid value of {key} in {module}: {cause}'.format(key=default.key_name,
module=settings_name,
cause=e.message)
raise ImproperlyConfigured(msg)
setattr(self, default.name, value)
elif isinstance(default.value, ImproperlyConfigured):
raise default.value
else:
try:
is_impconf = issubclass(default.value, ImproperlyConfigured)
except TypeError:
is_impconf = False
if is_impconf:
msg = '{key} must be defined in {module}'.format(key=default.key_name,
module=settings_name)
raise default.value(msg)
else:
setattr(self, default.name, default.value)
class AppConfig(_AppConfig):
default_settings = ()
def __init__(self, app_name, app_module):
super(AppConfig, self).__init__(app_name, app_module)
self.settings = AppSettings(app_name, self.default_settings)