Files
django-dav-events/dav_base/config/apps.py
T
heinzel 8d40f0cb4f
Run tests / Execute tox to run the test suite (push) Successful in 3m36s
dav_base: moved constants into config
2026-06-10 15:06:18 +02:00

77 lines
3.0 KiB
Python

import importlib
import logging
import re
from django.apps import AppConfig as _AppConfig
from django.core.exceptions import ImproperlyConfigured
from ..config import DJANGO_MAIN_MODULE, MODULE_APP_SETTINGS_PREFIX
logger = logging.getLogger(__name__)
class DefaultSetting: # pylint: disable=too-few-public-methods
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 self.validator is None:
return
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: # pylint: disable=too-few-public-methods
def __init__(self, app_name, defaults):
settings_name = '{main_module}.{prefix}{app_name}'.format(main_module=DJANGO_MAIN_MODULE,
prefix=MODULE_APP_SETTINGS_PREFIX,
app_name=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)
raise ImproperlyConfigured(msg) from e
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)
setattr(self, default.name, default.value)
class AppConfig(_AppConfig):
default_settings = ()
def __init__(self, app_name, app_module):
super().__init__(app_name, app_module)
self.settings = AppSettings(app_name, self.default_settings)