🎉 Improved backend structure & added utility modules 🎨📚

This commit is contained in:
2025-06-01 00:26:29 +02:00
parent 91548dfb0e
commit 9e1719df4d
27 changed files with 750 additions and 60 deletions

View File

@ -1724,14 +1724,10 @@ def api_admin_system_health():
"error": str(e)
}), 500
# ===== INTEGRATION IN BESTEHENDE ROUTEN =====
# Erweitere bestehende Job-Routen um Dashboard-Events
@app.route("/api/admin/system-health", methods=['GET'])
@app.route("/api/admin/system-health-dashboard", methods=['GET'])
@login_required
@admin_required
def api_admin_system_health():
def api_admin_system_health_dashboard():
"""API-Endpunkt für System-Gesundheitscheck mit Dashboard-Integration."""
try:
# Basis-System-Gesundheitscheck durchführen
@ -5064,6 +5060,192 @@ def setup_database_with_migrations():
app_logger.error(f"❌ Fehler bei Datenbank-Setup: {str(e)}")
raise e
# ===== PRIVACY UND TERMS ROUTEN =====
@app.route("/privacy")
def privacy_policy():
"""Datenschutzerklärung anzeigen"""
try:
return render_template("privacy_policy.html", title="Datenschutzerklärung")
except Exception as e:
app_logger.error(f"Fehler beim Laden der Datenschutzerklärung: {str(e)}")
flash("Fehler beim Laden der Datenschutzerklärung", "error")
return redirect(url_for("index"))
@app.route("/terms")
def terms_of_service():
"""Nutzungsbedingungen anzeigen"""
try:
return render_template("terms_of_service.html", title="Nutzungsbedingungen")
except Exception as e:
app_logger.error(f"Fehler beim Laden der Nutzungsbedingungen: {str(e)}")
flash("Fehler beim Laden der Nutzungsbedingungen", "error")
return redirect(url_for("index"))
@app.route("/legal")
def legal_notice():
"""Impressum anzeigen"""
try:
return render_template("legal_notice.html", title="Impressum")
except Exception as e:
app_logger.error(f"Fehler beim Laden des Impressums: {str(e)}")
flash("Fehler beim Laden des Impressums", "error")
return redirect(url_for("index"))
@app.route("/api/privacy/accept", methods=["POST"])
@login_required
def accept_privacy_policy():
"""API-Endpunkt für Akzeptierung der Datenschutzerklärung"""
db_session = get_db_session()
try:
data = request.get_json() or {}
version = data.get("version", "1.0")
# Benutzer aus der Datenbank laden
user = db_session.query(User).filter(User.id == int(current_user.id)).first()
if not user:
return jsonify({"error": "Benutzer nicht gefunden"}), 404
# Privacy-Akzeptierung in Benutzer-Einstellungen speichern
if hasattr(user, 'settings'):
import json
settings = json.loads(user.settings) if user.settings else {}
else:
settings = session.get('user_settings', {})
# Privacy-Akzeptierung hinzufügen
if 'privacy_acceptance' not in settings:
settings['privacy_acceptance'] = {}
settings['privacy_acceptance'] = {
'accepted': True,
'version': version,
'timestamp': datetime.now().isoformat(),
'ip_address': request.remote_addr
}
# Einstellungen speichern
if hasattr(user, 'settings'):
user.settings = json.dumps(settings)
user.updated_at = datetime.now()
db_session.commit()
else:
session['user_settings'] = settings
user_logger.info(f"Benutzer {current_user.username} hat Datenschutzerklärung v{version} akzeptiert")
return jsonify({
"success": True,
"message": "Datenschutzerklärung erfolgreich akzeptiert",
"version": version,
"timestamp": datetime.now().isoformat()
})
except Exception as e:
db_session.rollback()
app_logger.error(f"Fehler bei Privacy-Akzeptierung: {str(e)}")
return jsonify({"error": "Interner Serverfehler"}), 500
finally:
db_session.close()
@app.route("/api/terms/accept", methods=["POST"])
@login_required
def accept_terms_of_service():
"""API-Endpunkt für Akzeptierung der Nutzungsbedingungen"""
db_session = get_db_session()
try:
data = request.get_json() or {}
version = data.get("version", "1.0")
# Benutzer aus der Datenbank laden
user = db_session.query(User).filter(User.id == int(current_user.id)).first()
if not user:
return jsonify({"error": "Benutzer nicht gefunden"}), 404
# Terms-Akzeptierung in Benutzer-Einstellungen speichern
if hasattr(user, 'settings'):
import json
settings = json.loads(user.settings) if user.settings else {}
else:
settings = session.get('user_settings', {})
# Terms-Akzeptierung hinzufügen
if 'terms_acceptance' not in settings:
settings['terms_acceptance'] = {}
settings['terms_acceptance'] = {
'accepted': True,
'version': version,
'timestamp': datetime.now().isoformat(),
'ip_address': request.remote_addr
}
# Einstellungen speichern
if hasattr(user, 'settings'):
user.settings = json.dumps(settings)
user.updated_at = datetime.now()
db_session.commit()
else:
session['user_settings'] = settings
user_logger.info(f"Benutzer {current_user.username} hat Nutzungsbedingungen v{version} akzeptiert")
return jsonify({
"success": True,
"message": "Nutzungsbedingungen erfolgreich akzeptiert",
"version": version,
"timestamp": datetime.now().isoformat()
})
except Exception as e:
db_session.rollback()
app_logger.error(f"Fehler bei Terms-Akzeptierung: {str(e)}")
return jsonify({"error": "Interner Serverfehler"}), 500
finally:
db_session.close()
@app.route("/api/legal/status", methods=["GET"])
@login_required
def get_legal_status():
"""API-Endpunkt für Abfrage des rechtlichen Status (Privacy/Terms Akzeptierung)"""
try:
# Benutzer-Einstellungen laden
if hasattr(current_user, 'settings') and current_user.settings:
import json
settings = json.loads(current_user.settings)
else:
settings = session.get('user_settings', {})
privacy_acceptance = settings.get('privacy_acceptance', {})
terms_acceptance = settings.get('terms_acceptance', {})
return jsonify({
"success": True,
"legal_status": {
"privacy_policy": {
"accepted": privacy_acceptance.get('accepted', False),
"version": privacy_acceptance.get('version'),
"timestamp": privacy_acceptance.get('timestamp')
},
"terms_of_service": {
"accepted": terms_acceptance.get('accepted', False),
"version": terms_acceptance.get('version'),
"timestamp": terms_acceptance.get('timestamp')
},
"compliance_required": not (
privacy_acceptance.get('accepted', False) and
terms_acceptance.get('accepted', False)
)
}
})
except Exception as e:
app_logger.error(f"Fehler bei Legal-Status-Abfrage: {str(e)}")
return jsonify({"error": "Interner Serverfehler"}), 500
# ===== STARTUP UND MAIN =====
if __name__ == "__main__":
import sys