From f0601115cd8b0de43ebdd03aee7cadf11f0ed64b Mon Sep 17 00:00:00 2001 From: Dylan Hsin Date: Wed, 31 Jul 2024 15:21:13 +0200 Subject: [PATCH] YDA-5834: make portal config folder configurable --- admin/admin.py | 18 +++---- admin/templates/admin/admin.html | 6 +-- app.py | 64 +++++++++++++----------- config/.gitignore | 4 ++ general/templates/general/banner.html | 4 +- general/templates/general/base-bare.html | 2 +- general/templates/general/base.html | 2 +- util.py | 8 +-- 8 files changed, 60 insertions(+), 48 deletions(-) create mode 100644 config/.gitignore diff --git a/admin/admin.py b/admin/admin.py index 33090168..7b8f82c2 100644 --- a/admin/admin.py +++ b/admin/admin.py @@ -64,11 +64,11 @@ def set_banner() -> Response: :returns: Redirect to admin page with status message """ - banner_message = request.form.get('banner', '').strip() - banner_message = escape(banner_message) # Ensure safe text + message = request.form.get('banner', '').strip() + message = escape(message) # Ensure safe text # Message length check - error_message, is_valid = length_check(banner_message) + error_message, is_valid = length_check(message) if not is_valid: flash(error_message, "danger") return redirect(url_for('admin_bp.index')) @@ -76,9 +76,9 @@ def set_banner() -> Response: # Update app config settings and save settings settings = { 'banner': { - 'banner_enabled': True, - 'banner_importance': 'importance' in request.form, - 'banner_message': banner_message + 'enabled': True, + 'importance': 'importance' in request.form, + 'message': message } } flash_msg = 'Set banner message successfully' @@ -94,7 +94,7 @@ def remove_banner() -> Response: """ settings = { 'banner': { - 'banner_enabled': False, + 'enabled': False, } } flash_msg = 'Banner removed successfully' @@ -131,7 +131,7 @@ def save_settings(settings: Dict[str, Any], flash_msg: str) -> Response: :returns: Redirect with flash message """ - setting_file_path = path.join(app.config['APP_SHARED_FOLDER'], 'admin_settings.json') + setting_file_path = path.join(app.config['YODA_CONFIG_PATH'], 'admin_settings.json') app.config.update(settings) # Read existing settings @@ -174,7 +174,7 @@ def set_theme_loader(app: Flask, remove_cache: Optional[bool] = False) -> None: # Target theme path theme_path = path.join(app.config.get('YODA_THEME_PATH'), app.config.get('YODA_THEME')) # Secondary theme path for scanning missing templates - default_theme_path = path.join(app.config.get('YODA_MAIN_PATH'), 'general/templates/general') + default_theme_path = path.join(app.config.get('YODA_PORTAL_PATH'), 'general/templates/general') # Create theme path list to scan templates theme_path_lst = [theme_path, default_theme_path] diff --git a/admin/templates/admin/admin.html b/admin/templates/admin/admin.html index 00ad3bbe..d162d1c8 100644 --- a/admin/templates/admin/admin.html +++ b/admin/templates/admin/admin.html @@ -22,11 +22,11 @@

Set Maintenance Banner

+ required>{{config.get('banner').get('message','')}}
- +
@@ -51,7 +51,7 @@

Change Portal Theme

{% set current_theme = config.get('YODA_THEME', 'uu') %} {% for folder in theme_directories %} - + {% endfor %} diff --git a/app.py b/app.py index cabedc0c..99547544 100644 --- a/app.py +++ b/app.py @@ -5,7 +5,7 @@ import json from os import path -from typing import Dict, Optional +from typing import Any, Dict, Optional from flask import Flask, g, redirect, request, Response, send_from_directory, url_for from flask_session import Session @@ -24,7 +24,7 @@ from search.search import search_bp from stats.stats import stats_bp from user.user import user_bp -from util import get_validated_static_path +from util import get_validated_static_path, log_error from vault.vault import vault_bp @@ -36,45 +36,53 @@ app.config.from_pyfile('flask.cfg') -def load_admin_config(): - """Load or initialize admin configurations from config file, writing defaults if no config file exists.""" - config_file_path = path.join(app.config['APP_SHARED_FOLDER'], 'admin_settings.json') - default_config = { +def load_admin_setting() -> Dict[str, Any]: + """Load or initialize admin settings from a JSON file. + + If no setting file exists, it writes default loaded_settings and returns them. + + If a setting file exists, it reads and returns the updated loaded_settings. + + :returns: admin settings from file or default settings + """ + + # configure default admin settings + config_folder = app.config['YODA_CONFIG_PATH'] + settings_file_path = path.join(config_folder, 'admin_settings.json') + default_settings = { 'banner': { - 'banner_enabled': False, - 'banner_importance': False, - 'banner_message': '' + 'enabled': False, + 'importance': False, + 'message': '' }, 'YODA_THEME': app.config.get('YODA_THEME') } try: # If file doesn't exist, create and write the default configuration - if not path.exists(config_file_path): - with open(config_file_path, 'w') as file: - json.dump(default_config, file) - return default_config - - # If the file exists, read and return the configuration - with open(config_file_path, 'r') as file: - settings = json.load(file) - banner_set = settings.get('banner', default_config['banner']) # Get banner settings or use default - return { + if not path.exists(settings_file_path): + with open(settings_file_path, 'w') as file: + json.dump(default_settings, file) + return default_settings + + # If the file exists, read and return the setting + with open(settings_file_path, 'r') as file: + loaded_settings = json.load(file) + merged_settings = { 'banner': { - 'banner_enabled': banner_set.get('banner_enabled', default_config['banner']['banner_enabled']), - 'banner_importance': banner_set.get('banner_importance', default_config['banner']['banner_importance']), - 'banner_message': banner_set.get('banner_message', default_config['banner']['banner_message']) + **default_settings['banner'], + **loaded_settings.get('banner', {}) }, - 'YODA_THEME': settings.get('YODA_THEME', default_config['YODA_THEME']) + 'YODA_THEME': loaded_settings.get('YODA_THEME', default_settings['YODA_THEME']) } + return merged_settings except Exception: - print("An unexpected error occurred") - return default_config - + log_error("Unexpected error occurred.", True) + return default_settings -app.config['APP_SHARED_FOLDER'] = '/tmp' -app.config.update(load_admin_config()) +# Load admin settings +app.config.update(load_admin_setting()) # Load theme templates set_theme_loader(app) diff --git a/config/.gitignore b/config/.gitignore new file mode 100644 index 00000000..5e7d2734 --- /dev/null +++ b/config/.gitignore @@ -0,0 +1,4 @@ +# Ignore everything in this directory +* +# Except this file +!.gitignore diff --git a/general/templates/general/banner.html b/general/templates/general/banner.html index 6fc51b1a..cd07cf78 100644 --- a/general/templates/general/banner.html +++ b/general/templates/general/banner.html @@ -1,3 +1,3 @@ -