From 81cd6636d8a6116a1a1a405c3c4b2fa320b264cd Mon Sep 17 00:00:00 2001 From: Jenny Danzmayr Date: Tue, 17 Sep 2024 16:50:34 +0200 Subject: [PATCH] added `getlist` method to c3nav config parser --- src/c3nav/settings.py | 21 +++++++++------------ src/c3nav/utils/config.py | 10 ++++++++++ 2 files changed, 19 insertions(+), 12 deletions(-) diff --git a/src/c3nav/settings.py b/src/c3nav/settings.py index b7690487..0ec52eee 100644 --- a/src/c3nav/settings.py +++ b/src/c3nav/settings.py @@ -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, ) diff --git a/src/c3nav/utils/config.py b/src/c3nav/utils/config.py index cc5b84f7..91da2c56 100644 --- a/src/c3nav/utils/config.py +++ b/src/c3nav/utils/config.py @@ -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