feat: Add organization name and scheduler refresh interval settings
- Superadmin-only organization name setting displayed in dashboard header - Advanced Options tab with configurable scheduler refresh interval (0 = disabled) - Make system settings GET endpoint public for frontend reads - Scheduler reads refresh_seconds from DB dynamically each loop - Seed default system settings in init_defaults.py
This commit is contained in:
@@ -66,6 +66,8 @@ with engine.connect() as conn:
|
||||
('video_loop', 'true', 'Loop (Wiederholung) für Videos'),
|
||||
('video_volume', '0.8', 'Standard Lautstärke für Videos (0.0 - 1.0)'),
|
||||
('holiday_banner_enabled', 'true', 'Ferienstatus-Banner auf Dashboard anzeigen'),
|
||||
('organization_name', '', 'Name der Organisation (wird im Header angezeigt)'),
|
||||
('refresh_seconds', '0', 'Scheduler Republish-Intervall (Sekunden; 0 deaktiviert)'),
|
||||
]
|
||||
|
||||
for key, value, description in default_settings:
|
||||
|
||||
@@ -5,7 +5,7 @@ Provides key-value storage for system-wide configuration.
|
||||
from flask import Blueprint, jsonify, request
|
||||
from server.database import Session
|
||||
from models.models import SystemSetting
|
||||
from server.permissions import admin_or_higher
|
||||
from server.permissions import admin_or_higher, superadmin_only
|
||||
from sqlalchemy.exc import SQLAlchemyError
|
||||
|
||||
system_settings_bp = Blueprint('system_settings', __name__, url_prefix='/api/system-settings')
|
||||
@@ -31,11 +31,10 @@ def get_all_settings():
|
||||
|
||||
|
||||
@system_settings_bp.route('/<key>', methods=['GET'])
|
||||
@admin_or_higher
|
||||
def get_setting(key):
|
||||
"""
|
||||
Get a specific system setting by key.
|
||||
Admin+ only.
|
||||
Public endpoint - settings are read-only configuration.
|
||||
"""
|
||||
session = Session()
|
||||
try:
|
||||
@@ -265,3 +264,66 @@ def update_holiday_banner_setting():
|
||||
finally:
|
||||
session.close()
|
||||
|
||||
|
||||
@system_settings_bp.route('/organization-name', methods=['GET'])
|
||||
def get_organization_name():
|
||||
"""
|
||||
Get organization name.
|
||||
Public endpoint - header needs this.
|
||||
"""
|
||||
session = Session()
|
||||
try:
|
||||
setting = session.query(SystemSetting).filter_by(key='organization_name').first()
|
||||
name = setting.value if setting and setting.value else ''
|
||||
|
||||
return jsonify({'name': name}), 200
|
||||
except SQLAlchemyError as e:
|
||||
return jsonify({'error': str(e)}), 500
|
||||
finally:
|
||||
session.close()
|
||||
|
||||
|
||||
@system_settings_bp.route('/organization-name', methods=['POST'])
|
||||
@superadmin_only
|
||||
def update_organization_name():
|
||||
"""
|
||||
Update organization name.
|
||||
Superadmin only.
|
||||
|
||||
Request body:
|
||||
{
|
||||
"name": "Meine Organisation"
|
||||
}
|
||||
"""
|
||||
session = Session()
|
||||
try:
|
||||
data = request.get_json()
|
||||
if not data:
|
||||
return jsonify({'error': 'No data provided'}), 400
|
||||
|
||||
name = data.get('name', '')
|
||||
|
||||
# Update or create setting
|
||||
setting = session.query(SystemSetting).filter_by(key='organization_name').first()
|
||||
if setting:
|
||||
setting.value = name
|
||||
else:
|
||||
setting = SystemSetting(
|
||||
key='organization_name',
|
||||
value=name,
|
||||
description='Name der Organisation (wird im Header angezeigt)'
|
||||
)
|
||||
session.add(setting)
|
||||
|
||||
session.commit()
|
||||
|
||||
return jsonify({
|
||||
'name': name,
|
||||
'message': 'Organization name updated successfully'
|
||||
}), 200
|
||||
except SQLAlchemyError as e:
|
||||
session.rollback()
|
||||
return jsonify({'error': str(e)}), 500
|
||||
finally:
|
||||
session.close()
|
||||
|
||||
|
||||
Reference in New Issue
Block a user