diff --git a/conf/settings.py b/conf/settings.py index 5d77582..a82b3dc 100644 --- a/conf/settings.py +++ b/conf/settings.py @@ -11,16 +11,12 @@ from pathlib import Path as __Path +from django.core.validators import EmailValidator as __EmailValidator + from django_yunohost_integration.base_settings import * # noqa from django_yunohost_integration.secret_key import get_or_create_secret as __get_or_create_secret -# Set via config_panel.toml -DEBUG_ENABLED = '__DEBUG_ENABLED__' -DEBUG = bool(int(DEBUG_ENABLED)) - -# ----------------------------------------------------------------------------- - FINALPATH = __Path('__FINALPATH__') # /opt/yunohost/$app assert FINALPATH.is_dir(), f'Directory not exists: {FINALPATH}' @@ -33,6 +29,25 @@ assert LOG_FILE.is_file(), f'File not exists: {LOG_FILE}' PATH_URL = '__PATH_URL__' # $YNH_APP_ARG_PATH PATH_URL = PATH_URL.strip('/') +# ----------------------------------------------------------------------------- +# config_panel.toml settings: + +DEBUG_ENABLED = '__DEBUG_ENABLED__' +LOG_LEVEL = '__LOG_LEVEL__' +ADMIN_EMAIL = '__ADMIN_EMAIL__' +# ----------------------------------------------------------------------------- +# Use/convert/validate config_panel.toml settings: + +DEBUG = bool(int(DEBUG_ENABLED)) +assert LOG_LEVEL in ( + 'DEBUG', + 'INFO', + 'WARNING', + 'ERROR', + 'CRITICAL', +), f'Invalid LOG_LEVEL: {LOG_LEVEL!r}' +__EmailValidator(message='ADMIN_EMAIL from config panel is not valid!')(ADMIN_EMAIL) + # ----------------------------------------------------------------------------- # Function that will be called to finalize a user profile: @@ -45,7 +60,7 @@ SECRET_KEY = __get_or_create_secret(FINALPATH / 'secret.txt') # /opt/yunohost/$ # ----------------------------------------------------------------------------- -ADMINS = (('__ADMIN__', '__ADMINMAIL__'),) +ADMINS = (('__ADMIN__', ADMIN_EMAIL),) MANAGERS = ADMINS @@ -76,7 +91,7 @@ SERVER_EMAIL = 'noreply@__DOMAIN__' # Default email address to use for various automated correspondence from # the site managers. Used for registration emails. -DEFAULT_FROM_EMAIL = '__ADMINMAIL__' +DEFAULT_FROM_EMAIL = ADMIN_EMAIL # List of URLs your site is supposed to serve ALLOWED_HOSTS = ['__DOMAIN__'] @@ -111,6 +126,7 @@ else: STATIC_ROOT = str(PUBLIC_PATH / 'static') MEDIA_ROOT = str(PUBLIC_PATH / 'media') + # ----------------------------------------------------------------------------- LOGGING = { @@ -137,17 +153,17 @@ LOGGING = { }, }, 'loggers': { - '': {'handlers': ['log_file', 'mail_admins'], 'level': 'INFO', 'propagate': False}, - 'django': {'handlers': ['log_file', 'mail_admins'], 'level': 'INFO', 'propagate': False}, - 'axes': {'handlers': ['log_file', 'mail_admins'], 'level': 'WARNING', 'propagate': False}, + '': {'handlers': ['log_file', 'mail_admins'], 'level': LOG_LEVEL, 'propagate': False}, + 'django': {'handlers': ['log_file', 'mail_admins'], 'level': LOG_LEVEL, 'propagate': False}, + 'axes': {'handlers': ['log_file', 'mail_admins'], 'level': LOG_LEVEL, 'propagate': False}, 'django_tools': { 'handlers': ['log_file', 'mail_admins'], - 'level': 'INFO', + 'level': LOG_LEVEL, 'propagate': False, }, 'django_yunohost_integration': { 'handlers': ['log_file', 'mail_admins'], - 'level': 'INFO', + 'level': LOG_LEVEL, 'propagate': False, }, }, diff --git a/config_panel.toml b/config_panel.toml index c7144fc..d1b530a 100644 --- a/config_panel.toml +++ b/config_panel.toml @@ -7,10 +7,24 @@ services = ["__APP__"] [main.config] name = "Configuration Options" + [main.config.admin_email] + ask = "ADMIN email" + type = "string" + help = "EMail address for error emails." + default = "root@localhost" + bind = "admin_email:__FINALPATH__/settings.py" + [main.config.debug_enabled] - ask = "Enable DEBUG mode" + ask = "DEBUG mode" type = "boolean" yes = "1" no = "0" help = "Should be never enabled in production!" bind = "debug_enabled:__FINALPATH__/settings.py" + + [main.config.log_level] + type = "string" + ask = "Log Level" + choices = ["DEBUG", "INFO", "WARNING", "ERROR", "CRITICAL"] + default = "WARNING" + bind = "log_level:__FINALPATH__/settings.py" diff --git a/scripts/_common.sh b/scripts/_common.sh index fee5921..6716bab 100644 --- a/scripts/_common.sh +++ b/scripts/_common.sh @@ -18,6 +18,12 @@ app=$YNH_APP_INSTANCE_NAME # 'debug_enabled' -> '__DEBUG_ENABLED__' -> settings.DEBUG debug_enabled="0" +# 'log_level' -> '__LOG_LEVEL__' -> settings.LOG_LEVEL +log_level="WARNING" + +# 'admin_email' -> '__ADMIN_EMAIL__' add in settings.ADMINS +admin_email="${admin}@${domain}" + #================================================= # SET CONSTANTS #================================================= @@ -27,8 +33,6 @@ final_path=/opt/yunohost/$app log_path=/var/log/$app log_file="${log_path}/django_example_ynh.log" -adminmail=$(ynh_user_get_info --username=$admin --key=mail) - #================================================= # COMMON VARIABLES #================================================= diff --git a/scripts/change_url b/scripts/change_url index 98f98d6..f109026 100644 --- a/scripts/change_url +++ b/scripts/change_url @@ -31,9 +31,15 @@ log_path=$(ynh_app_setting_get --app="$app" --key=log_path) port=$(ynh_app_setting_get --app="$app" --key=port) db_pwd=$(ynh_app_setting_get --app="$app" --key=psqlpwd) -admin_mail=$(ynh_user_get_info "$admin" mail) redis_db=$(ynh_app_setting_get --app="$app" --key=redis_db) +#------------------------------------------------- +# config_panel.toml settings: + +debug_enabled=$(ynh_app_setting_get --app="$app" --key=debug_enabled) +log_level=$(ynh_app_setting_get --app="$app" --key=log_level) +admin_email=$(ynh_app_setting_get --app="$app" --key=admin_email) + #================================================= # BACKUP BEFORE UPGRADE THEN ACTIVE TRAP #================================================= diff --git a/scripts/install b/scripts/install index 5eab770..c826807 100755 --- a/scripts/install +++ b/scripts/install @@ -55,13 +55,16 @@ port=$(ynh_find_port --port=8000) ynh_app_setting_set --app="$app" --key=port --value="$port" db_pwd=$(ynh_app_setting_get --app="$app" --key=psqlpwd) -admin_mail=$(ynh_user_get_info --username="$admin" --key=mail) redis_db=$(ynh_redis_get_free_db) ynh_app_setting_set --app="$app" --key=redis_db --value="$redis_db" -# Always deactivate settings.DEBUG: +#------------------------------------------------- +# config_panel.toml settings: + ynh_app_setting_set --app="$app" --key=debug_enabled --value="$debug_enabled" +ynh_app_setting_set --app="$app" --key=log_level --value="$log_level" +ynh_app_setting_set --app="$app" --key=admin_email --value="$admin_email" #================================================= # STANDARD MODIFICATIONS @@ -164,7 +167,7 @@ cd "$final_path" || exit ./manage.py collectstatic --no-input # Create/update Django superuser (set unusable password, because auth done via SSOwat): -./manage.py create_superuser --username="$admin" --email="$admin_mail" +./manage.py create_superuser --username="$admin" --email="$(ynh_user_get_info "$admin" mail)" # Check the configuration # This may fail in some cases with errors, etc., but the app works and the user can fix issues later. diff --git a/scripts/upgrade b/scripts/upgrade index 9dfc208..3c17990 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -26,15 +26,29 @@ db_pwd=$(ynh_app_setting_get --app="$app" --key=psqlpwd) db_name=$(ynh_sanitize_dbid --db_name="$app") db_user=$db_name -admin_mail=$(ynh_user_get_info "$admin" mail) redis_db=$(ynh_app_setting_get --app="$app" --key=redis_db) +#------------------------------------------------- +# config_panel.toml settings: + debug_enabled=$(ynh_app_setting_get --app="$app" --key=debug_enabled) if [ -z "$debug_enabled" ]; then debug_enabled="0" ynh_app_setting_set --app="$app" --key=debug_enabled --value="$debug_enabled" fi +log_level=$(ynh_app_setting_get --app="$app" --key=log_level) +if [ -z "$log_level" ]; then + log_level="WARNING" + ynh_app_setting_set --app="$app" --key=log_level --value="$log_level" +fi + +admin_email=$(ynh_app_setting_get --app="$app" --key=admin_email) +if [ -z "$admin_email" ]; then + admin_email="root@localhost" + ynh_app_setting_set --app="$app" --key=admin_email --value="$admin_email" +fi + #================================================= # BACKUP BEFORE UPGRADE THEN ACTIVE TRAP #================================================= @@ -58,13 +72,6 @@ ynh_script_progression --message="Stopping systemd services..." --weight=5 ynh_systemd_action --service_name="$app" --action="stop" -#================================================= -# Manage old settings -#================================================= - -# Always deactivate settings.DEBUG: -ynh_app_setting_set --app=$app --key=debug_enabled --value="False" - #================================================= # NGINX CONFIGURATION #================================================= @@ -156,7 +163,7 @@ cd "$final_path" || exit ./manage.py collectstatic --no-input # Create/update Django superuser (set unusable password, because auth done via SSOwat): -./manage.py create_superuser --username="$admin" --email="$admin_mail" +./manage.py create_superuser --username="$admin" --email="$(ynh_user_get_info "$admin" mail)" # Check the configuration # This may fail in some cases with errors, etc., but the app works and the user can fix issues later. diff --git a/tests/conftest.py b/tests/conftest.py index d1a679f..c2ac595 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -28,6 +28,8 @@ def pytest_configure(): runserver=False, extra_replacements={ '__DEBUG_ENABLED__': '0', + '__LOG_LEVEL__': 'INFO', + '__ADMIN_EMAIL__': 'foo-bar@test.tld', }, ) print('Local test files created here:') diff --git a/tests/test_django_project.py b/tests/test_django_project.py index cb6460b..6f81a8b 100644 --- a/tests/test_django_project.py +++ b/tests/test_django_project.py @@ -27,6 +27,12 @@ class DjangoYnhTestCase(HtmlAssertionMixin, TestCase): assert settings.ROOT_URLCONF == 'urls' + def test_config_panel_settings(self): + # config_panel.toml settings, set via tests.conftest.pytest_configure(): + assert settings.DEBUG_ENABLED == '0' and settings.DEBUG is False + assert settings.LOG_LEVEL == 'INFO' + assert settings.ADMIN_EMAIL == 'foo-bar@test.tld' + def test_urls(self): assert reverse('admin:index') == '/app_path/'