From 2e2f35ccc12bcf3ee0c46f1ba70e87314a47478e Mon Sep 17 00:00:00 2001 From: Till Tomczak Date: Wed, 14 May 2025 11:58:31 +0200 Subject: [PATCH] =?UTF-8?q?chore:=20=C3=84nderungen=20commited?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- __pycache__/app.cpython-313.pyc | Bin 111458 -> 108235 bytes app.py | 285 ++++++++++++++++---------------- database/systades.db | Bin 143360 -> 143360 bytes logs/app.log | 243 +++++++++++++++++++++++++++ 4 files changed, 386 insertions(+), 142 deletions(-) diff --git a/__pycache__/app.cpython-313.pyc b/__pycache__/app.cpython-313.pyc index bfd59e4c6f023570a7cb995aca9bfa318f7606fb..a395e7797a170c2063bd47a41b4f558bacdd5d97 100644 GIT binary patch delta 14612 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 diff --git a/app.py b/app.py index 6d6d3bb..5b39231 100644 --- a/app.py +++ b/app.py @@ -2062,6 +2062,149 @@ def dummy_network_bg(): """Leere Antwort für die nicht mehr verwendeten Netzwerk-Hintergrundbilder.""" return '', 200 +# API-Endpunkt für die Root-Mindmap +@app.route('/api/mindmap/root') +def get_root_mindmap_data(): + """Liefert die Daten für die Root-Mindmap.""" + try: + # Hauptkategorien mit Unterkategorien in einer Abfrage laden + categories = Category.query.filter_by(parent_id=None).options( + joinedload(Category.children) + ).all() + + # Überprüfen, ob Kategorien vorhanden sind + if not categories: + print("Keine Hauptkategorien gefunden") + return jsonify({ + 'success': False, + 'error': 'Keine Hauptkategorien gefunden', + 'details': 'Bitte führen Sie das Datenbank-Initialisierungsskript aus' + }), 404 + + print(f"Gefundene Hauptkategorien: {[cat.name for cat in categories]}") + + # Basis-Knoten erstellen + nodes = [{ + 'id': 'root', + 'name': 'Wissen', + 'description': 'Zentrale Wissensbasis', + 'color_code': '#4299E1', + 'is_center': True, + 'has_children': bool(categories), + 'icon': 'fa-solid fa-circle' + }] + + # Kategorien als Knoten hinzufügen + for category in categories: + nodes.append({ + 'id': f'cat_{category.id}', + 'name': category.name, + 'description': category.description or '', + 'color_code': category.color_code or '#9F7AEA', + 'category': category.name, + 'has_children': bool(category.children.count() > 0), + 'icon': category.icon or 'fa-solid fa-circle' + }) + + # Kanten erstellen (vereinheitlichte Schlüssel) + edges = [{ + 'source': 'root', + 'target': f'cat_{category.id}', + 'strength': 0.8 + } for category in categories] + + return jsonify({ + 'success': True, + 'nodes': nodes, + 'edges': edges + }) + except Exception as e: + print(f"Fehler beim Abrufen der Root-Mindmap: {str(e)}") + traceback.print_exc() + return jsonify({ + 'success': False, + 'error': 'Root-Mindmap konnte nicht geladen werden', + 'details': str(e) + }), 500 + +# Spezifische Routen für Kategorien +@app.route('/api/mindmap/philosophy') +def get_philosophy_mindmap_data(): + return get_category_mindmap_data('Philosophie') + +@app.route('/api/mindmap/science') +def get_science_mindmap_data(): + return get_category_mindmap_data('Wissenschaft') + +@app.route('/api/mindmap/technology') +def get_technology_mindmap_data(): + return get_category_mindmap_data('Technologie') + +@app.route('/api/mindmap/arts') +def get_arts_mindmap_data(): + return get_category_mindmap_data('Künste') + +# Generische Route für spezifische Knoten +@app.route('/api/mindmap/') +def get_mindmap_data(node_id): + """Liefert die Daten für einen spezifischen Mindmap-Knoten.""" + try: + # Prüfen, ob es sich um eine spezielle Route handelt + if node_id in ['root', 'philosophy', 'science', 'technology', 'arts']: + return jsonify({ + 'success': False, + 'error': 'Ungültige Knoten-ID', + 'details': 'Diese ID ist für spezielle Routen reserviert' + }), 400 + + # Knoten mit Unterknoten in einer Abfrage laden + node = MindMapNode.query.options( + joinedload(MindMapNode.children) + ).get_or_404(node_id) + + # Basis-Knoten erstellen + nodes = [{ + 'id': str(node.id), + 'name': node.name, + 'description': node.description or '', + 'color_code': node.color_code or '#9F7AEA', + 'is_center': True, + 'has_children': bool(node.children), + 'icon': node.icon or 'fa-solid fa-circle' + }] + + # Unterknoten hinzufügen + for child in node.children: + nodes.append({ + 'id': str(child.id), + 'name': child.name, + 'description': child.description or '', + 'color_code': child.color_code or '#9F7AEA', + 'category': node.name, + 'has_children': bool(child.children), + 'icon': child.icon or 'fa-solid fa-circle' + }) + + # Kanten erstellen (vereinheitlichte Schlüssel) + edges = [{ + 'source': str(node.id), + 'target': str(child.id), + 'strength': 0.8 + } for child in node.children] + + return jsonify({ + 'success': True, + 'nodes': nodes, + 'edges': edges + }) + except Exception as e: + print(f"Fehler beim Abrufen der Mindmap-Daten für Knoten {node_id}: {str(e)}") + return jsonify({ + 'success': False, + 'error': 'Mindmap-Daten konnten nicht geladen werden', + 'details': str(e) + }), 500 + # Route zum expliziten Neu-Laden der Umgebungsvariablen @app.route('/admin/reload-env', methods=['POST']) @admin_required @@ -2394,145 +2537,3 @@ def get_category_mindmap_data(category_name): 'details': str(e) }), 500 -@app.route('/api/mindmap/root') -def get_root_mindmap_data(): - """Liefert die Daten für die Root-Mindmap.""" - try: - # Hauptkategorien mit Unterkategorien in einer Abfrage laden - categories = Category.query.filter_by(parent_id=None).options( - joinedload(Category.children) - ).all() - - # Überprüfen, ob Kategorien vorhanden sind - if not categories: - print("Keine Hauptkategorien gefunden") - return jsonify({ - 'success': False, - 'error': 'Keine Hauptkategorien gefunden', - 'details': 'Bitte führen Sie das Datenbank-Initialisierungsskript aus' - }), 404 - - print(f"Gefundene Hauptkategorien: {[cat.name for cat in categories]}") - - # Basis-Knoten erstellen - nodes = [{ - 'id': 'root', - 'name': 'Wissen', - 'description': 'Zentrale Wissensbasis', - 'color_code': '#4299E1', - 'is_center': True, - 'has_children': bool(categories), - 'icon': 'fa-solid fa-circle' - }] - - # Kategorien als Knoten hinzufügen - for category in categories: - nodes.append({ - 'id': f'cat_{category.id}', - 'name': category.name, - 'description': category.description or '', - 'color_code': category.color_code or '#9F7AEA', - 'category': category.name, - 'has_children': bool(category.children.count() > 0), - 'icon': category.icon or 'fa-solid fa-circle' - }) - - # Kanten erstellen (vereinheitlichte Schlüssel) - edges = [{ - 'source': 'root', - 'target': f'cat_{category.id}', - 'strength': 0.8 - } for category in categories] - - return jsonify({ - 'success': True, - 'nodes': nodes, - 'edges': edges - }) - except Exception as e: - print(f"Fehler beim Abrufen der Root-Mindmap: {str(e)}") - traceback.print_exc() - return jsonify({ - 'success': False, - 'error': 'Root-Mindmap konnte nicht geladen werden', - 'details': str(e) - }), 500 - -# Spezifische Routen für Kategorien -@app.route('/api/mindmap/philosophy') -def get_philosophy_mindmap_data(): - return get_category_mindmap_data('Philosophie') - -@app.route('/api/mindmap/science') -def get_science_mindmap_data(): - return get_category_mindmap_data('Wissenschaft') - -@app.route('/api/mindmap/technology') -def get_technology_mindmap_data(): - return get_category_mindmap_data('Technologie') - -@app.route('/api/mindmap/arts') -def get_arts_mindmap_data(): - return get_category_mindmap_data('Künste') - -# Generische Route für spezifische Knoten -@app.route('/api/mindmap/') -def get_mindmap_data(node_id): - """Liefert die Daten für einen spezifischen Mindmap-Knoten.""" - try: - # Prüfen, ob es sich um eine spezielle Route handelt - if node_id in ['root', 'philosophy', 'science', 'technology', 'arts']: - return jsonify({ - 'success': False, - 'error': 'Ungültige Knoten-ID', - 'details': 'Diese ID ist für spezielle Routen reserviert' - }), 400 - - # Knoten mit Unterknoten in einer Abfrage laden - node = MindMapNode.query.options( - joinedload(MindMapNode.children) - ).get_or_404(node_id) - - # Basis-Knoten erstellen - nodes = [{ - 'id': str(node.id), - 'name': node.name, - 'description': node.description or '', - 'color_code': node.color_code or '#9F7AEA', - 'is_center': True, - 'has_children': bool(node.children), - 'icon': node.icon or 'fa-solid fa-circle' - }] - - # Unterknoten hinzufügen - for child in node.children: - nodes.append({ - 'id': str(child.id), - 'name': child.name, - 'description': child.description or '', - 'color_code': child.color_code or '#9F7AEA', - 'category': node.name, - 'has_children': bool(child.children), - 'icon': child.icon or 'fa-solid fa-circle' - }) - - # Kanten erstellen (vereinheitlichte Schlüssel) - edges = [{ - 'source': str(node.id), - 'target': str(child.id), - 'strength': 0.8 - } for child in node.children] - - return jsonify({ - 'success': True, - 'nodes': nodes, - 'edges': edges - }) - except Exception as e: - print(f"Fehler beim Abrufen der Mindmap-Daten für Knoten {node_id}: {str(e)}") - return jsonify({ - 'success': False, - 'error': 'Mindmap-Daten konnten nicht geladen werden', - 'details': str(e) - }), 500 - diff --git a/database/systades.db b/database/systades.db index 4f5dd31e67287d1120dcd01efaf68238c28d99a7..2f9ecb311a9ebf6ab85ebf85e6cdbdb081fe9912 100644 GIT binary patch delta 54 zcmZp8z|ru4V}dlJ>O>i5R#gVQHqDJGW^#fi3I>)|re;>gCVD0Yrj~}r&8y|wSIaSO KUoFQJDhL3nvkw0N delta 54 zcmZp8z|ru4V}dlJ%0wAwRuu-lc