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 @@
-
- {{ config.get('banner').banner_message }}
+
+ {{ config.get('banner').get('message') }}
diff --git a/general/templates/general/base-bare.html b/general/templates/general/base-bare.html
index 47439c8f..3e3ac891 100644
--- a/general/templates/general/base-bare.html
+++ b/general/templates/general/base-bare.html
@@ -45,7 +45,7 @@
{% if config.get('YODA_ENVIRONMENT') != "production" %}{% include 'environment.html' %}{% endif %}
- {% if config.get('banner').banner_enabled %}{% include 'banner.html' %}{% endif %}
+ {% if config.get('banner').get('enabled') %}{% include 'banner.html' %}{% endif %}
{% block container %}
diff --git a/general/templates/general/base.html b/general/templates/general/base.html
index f388ad1d..988b76f8 100644
--- a/general/templates/general/base.html
+++ b/general/templates/general/base.html
@@ -44,7 +44,7 @@
{% if config.get('YODA_ENVIRONMENT') != "production" %}{% include 'environment.html' %}{% endif %}
- {% if config.get('banner').banner_enabled %}{% include 'banner.html' %}{% endif %}
+ {% if config.get('banner').get('enabled') %}{% include 'banner.html' %}{% endif %}
diff --git a/util.py b/util.py
index af69660c..1f9a0940 100644
--- a/util.py
+++ b/util.py
@@ -147,17 +147,17 @@ def get_validated_static_path(
return static_dir, asset_name
-def length_check(banner_message: str) -> Tuple[str, bool]:
+def length_check(message: str) -> Tuple[str, bool]:
"""
Check banner message length.
- :param banner_message: Message to validate.
+ :param message: Message to validate.
:returns: Error message and validity status.
"""
max_length = 256
- if not banner_message:
+ if not message:
return "Empty banner message found.", False
- elif len(banner_message) > max_length:
+ elif len(message) > max_length:
return "Banner message too long.", False
return None, True