Refactor: split code into several django apps (we call them modules).
This commit is contained in:
71
dav_base/config/apps.py
Normal file
71
dav_base/config/apps.py
Normal file
@@ -0,0 +1,71 @@
|
||||
import importlib
|
||||
import logging
|
||||
import re
|
||||
from django.apps import AppConfig as _AppConfig
|
||||
from django.core.exceptions import ImproperlyConfigured
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
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)
|
||||
Reference in New Issue
Block a user