added getlist method to c3nav config parser

This commit is contained in:
Jenny Danzmayr 2024-09-17 16:50:34 +02:00
parent 7dc718475e
commit 81cd6636d8
2 changed files with 19 additions and 12 deletions

View file

@ -94,9 +94,9 @@ PUBLIC_EDITOR = config.getboolean('c3nav', 'editor', fallback=True)
PUBLIC_BASE_MAPDATA = config.getboolean('c3nav', 'public_base_mapdata', fallback=False)
AUTO_PROCESS_UPDATES = config.getboolean('c3nav', 'auto_process_updates', fallback=True)
RANDOM_LOCATION_GROUPS = config.get('c3nav', 'random_location_groups', fallback=None)
RANDOM_LOCATION_GROUPS = config.getlist('c3nav', 'random_location_groups', fallback=None)
if RANDOM_LOCATION_GROUPS:
RANDOM_LOCATION_GROUPS = tuple(int(i) for i in RANDOM_LOCATION_GROUPS.split(','))
RANDOM_LOCATION_GROUPS = tuple(int(i) for i in RANDOM_LOCATION_GROUPS)
SECRET_KEY = config.get('django', 'secret', fallback=None)
if not SECRET_KEY:
@ -243,7 +243,7 @@ DEFAULT_AUTO_FIELD = 'django.db.models.AutoField'
STATIC_URL = config.get('django', 'static_url', fallback='/static/', env='C3NAV_STATIC_URL')
MEDIA_URL = config.get('django', 'media_url', fallback='/media/', env='C3NAV_MEDIA_URL')
ALLOWED_HOSTS = [n for n in config.get('django', 'allowed_hosts', fallback='*').split(',') if n]
ALLOWED_HOSTS = config.getlist('django', 'allowed_hosts', fallback='*')
if config.getboolean('django', 'reverse_proxy', fallback=False):
SECURE_PROXY_SSL_HEADER = ("HTTP_X_FORWARDED_PROTO", "https")
@ -269,7 +269,7 @@ EMAIL_SUBJECT_PREFIX = ('[c3nav-%s] ' % INSTANCE_NAME) if INSTANCE_NAME else '[c
if config.has_section('mail'):
raise ImproperlyConfigured('mail config section got renamed to email. Please fix your config file.')
ADMINS = [('Admin', n) for n in config.get('mail', 'admins', fallback='').split(",") if n]
ADMINS = [('Admin', n) for n in config.getlist('mail', 'admins', fallback='')]
CACHES = {
'default': {
@ -299,7 +299,7 @@ REDIS_CONNECTION_POOL = None
if HAS_REDIS:
import redis
HAS_REAL_CACHE = True
REDIS_SERVERS = re.split("[;,]", config.get('redis', 'location', env='C3NAV_REDIS'))
REDIS_SERVERS = config.getlist('redis', 'location', env='C3NAV_REDIS')
CACHES['redis'] = {
"BACKEND": "django.core.cache.backends.redis.RedisCache",
"LOCATION": REDIS_SERVERS,
@ -431,7 +431,7 @@ if HAS_REDIS:
'default': {
'BACKEND': 'channels_redis.core.RedisChannelLayer',
'CONFIG': {
"hosts": config.get('redis', 'location', env='C3NAV_REDIS').split(','),
"hosts": config.getlist('redis', 'location', env='C3NAV_REDIS'),
},
},
}
@ -465,7 +465,7 @@ EXTRA_LANG_INFO = {
LANG_INFO = dict(django.conf.locale.LANG_INFO, **EXTRA_LANG_INFO)
django.conf.locale.LANG_INFO = LANG_INFO
SELECTED_LANGUAGES = frozenset(config.get('c3nav', 'languages', fallback='en,de').split(','))
SELECTED_LANGUAGES = frozenset(config.getlist('c3nav', 'languages', fallback='en,de'))
LANGUAGES = [(code, name) for code, name in [
('en', _('English')),
('en-UW', _('Engwish UwU')),
@ -631,7 +631,7 @@ BASE_THEME = {
}
}
WIFI_SSIDS = [n for n in config.get('c3nav', 'wifi_ssids', fallback='').split(',') if n]
WIFI_SSIDS = config.getlist('c3nav', 'wifi_ssids', fallback='')
# Projection
@ -796,10 +796,7 @@ if SSO_ENABLED:
# we need this despite our own strategy looking it up directly because the backends context processor of
# social_django directly uses the django setting without asking the normal config pipeline
AUTHENTICATION_BACKENDS = (
* (
backend.strip()
for backend in config.get('sso', 'authentication_backends', fallback='').split(',')
),
* config.getlist('sso', 'authentication_backends', fallback=''),
*AUTHENTICATION_BACKENDS,
)

View file

@ -1,3 +1,4 @@
import re
from configparser import _UNSET, NoOptionError, NoSectionError, RawConfigParser
from contextlib import contextmanager
@ -8,6 +9,7 @@ from c3nav.utils.environ import Env
class C3navConfigParser(RawConfigParser):
env: Env
LIST_PATTERN = re.compile(r"[;,]")
def __init__(self, env: Env = None, **kwargs):
if env is None:
@ -69,3 +71,11 @@ class C3navConfigParser(RawConfigParser):
return value
with self._error_wrapper(section, option, env):
return super().getboolean(section, option, raw=raw, vars=vars, fallback=fallback)
def getlist(self, section: str, option: str, *, raw=False, vars=None, fallback=_UNSET,
env: bool | str = True, **kwargs) -> tuple[str] | None:
value = self.env.str(self.get_env_key(section, option, env), default=None) if env else None
if value is None:
with self._error_wrapper(section, option, env):
value = super().get(section, option, raw=raw, vars=vars, fallback=fallback)
return tuple(i.strip() for i in self.LIST_PATTERN.split(value) if i) if value is not None else value