From 77095e91b657b9c714bbc5fe2c79a08335434441 Mon Sep 17 00:00:00 2001 From: Till Tomczak Date: Sat, 10 May 2025 22:14:16 +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 84302 -> 86611 bytes app.py | 161 ++++++++++++++++-- database/systades.db | Bin 147456 -> 131072 bytes systades.db | Bin 131072 -> 0 bytes utils/__pycache__/db_rebuild.cpython-313.pyc | Bin 3809 -> 3799 bytes utils/__pycache__/db_test.cpython-313.pyc | Bin 5849 -> 5839 bytes utils/__pycache__/server.cpython-313.pyc | Bin 1901 -> 1891 bytes .../__pycache__/user_manager.cpython-313.pyc | Bin 8306 -> 8296 bytes update_db.py => utils/update_db.py | 0 9 files changed, 143 insertions(+), 18 deletions(-) delete mode 100644 systades.db rename update_db.py => utils/update_db.py (100%) diff --git a/__pycache__/app.cpython-313.pyc b/__pycache__/app.cpython-313.pyc index 15b03257633500483b51676bc31c69a5279a6e55..3e75dff940610371a9d4b6df807a8de7dd307fd4 100644 GIT binary patch delta 2965 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 diff --git a/app.py b/app.py index 7883c5f..ccb0314 100644 --- a/app.py +++ b/app.py @@ -122,6 +122,33 @@ socketio = SocketIO(app) migrate = Migrate(app, db) +# Funktion zum Erstellen von Standardbenutzern +def create_default_users(): + """Erstellt Standardbenutzer für die Anwendung""" + users = [ + { + 'username': 'admin', + 'email': 'admin@example.com', + 'password': 'admin', + 'role': 'admin' + }, + { + 'username': 'user', + 'email': 'user@example.com', + 'password': 'user', + 'role': 'user' + } + ] + + for user_data in users: + password = user_data.pop('password') + user = User(**user_data) + user.set_password(password) + db.session.add(user) + + db.session.commit() + print(f"{len(users)} Benutzer wurden erstellt.") + # Automatische Datenbankinitialisierung - Aktualisiert für Flask 2.2+ Kompatibilität def initialize_app(): """Initialisierung der Anwendung""" @@ -155,31 +182,129 @@ def initialize_app(): with app.app_context(): initialize_app() -def create_default_users(): - """Erstellt Standardbenutzer für die Anwendung""" - users = [ +def create_sample_mindmap(): + """Erstellt eine Beispiel-Mindmap mit Knoten und Beziehungen""" + + # Kategorien für die Zuordnung + categories = Category.query.all() + category_map = {cat.name: cat for cat in categories} + + # Beispielknoten erstellen + nodes = [ { - 'username': 'admin', - 'email': 'admin@example.com', - 'password': 'admin', - 'role': 'admin' + 'name': 'Wissensmanagement', + 'description': 'Systematische Erfassung, Speicherung und Nutzung von Wissen in Organisationen.', + 'color_code': '#6366f1', + 'icon': 'database', + 'category': category_map.get('Philosophie'), + 'x': 0, + 'y': 0 }, { - 'username': 'user', - 'email': 'user@example.com', - 'password': 'user', - 'role': 'user' + 'name': 'Mind-Mapping', + 'description': 'Technik zur visuellen Darstellung von Informationen und Zusammenhängen.', + 'color_code': '#10b981', + 'icon': 'git-branch', + 'category': category_map.get('Technologie'), + 'x': 200, + 'y': -150 + }, + { + 'name': 'Cytoscape.js', + 'description': 'JavaScript-Bibliothek für die Visualisierung und Manipulation von Graphen.', + 'color_code': '#3b82f6', + 'icon': 'code', + 'category': category_map.get('Technologie'), + 'x': 350, + 'y': -50 + }, + { + 'name': 'Socket.IO', + 'description': 'Bibliothek für Echtzeit-Kommunikation zwischen Client und Server.', + 'color_code': '#3b82f6', + 'icon': 'zap', + 'category': category_map.get('Technologie'), + 'x': 350, + 'y': 100 + }, + { + 'name': 'Kollaboration', + 'description': 'Zusammenarbeit mehrerer Benutzer an gemeinsamen Inhalten.', + 'color_code': '#f59e0b', + 'icon': 'users', + 'category': category_map.get('Psychologie'), + 'x': 200, + 'y': 150 + }, + { + 'name': 'SQLite', + 'description': 'Leichtgewichtige relationale Datenbank, die ohne Server-Prozess auskommt.', + 'color_code': '#3b82f6', + 'icon': 'database', + 'category': category_map.get('Technologie'), + 'x': 0, + 'y': 200 + }, + { + 'name': 'Flask', + 'description': 'Leichtgewichtiges Python-Webframework für die Entwicklung von Webanwendungen.', + 'color_code': '#3b82f6', + 'icon': 'server', + 'category': category_map.get('Technologie'), + 'x': -200, + 'y': 150 + }, + { + 'name': 'REST API', + 'description': 'Architekturstil für verteilte Systeme, insbesondere Webanwendungen.', + 'color_code': '#10b981', + 'icon': 'link', + 'category': category_map.get('Wissenschaft'), + 'x': -200, + 'y': -150 } ] - for user_data in users: - password = user_data.pop('password') - user = User(**user_data) - user.set_password(password) - db.session.add(user) + # Erstelle einen zentralen "Wissen"-Knoten + wissen_node = MindMapNode.query.filter_by(name="Wissen").first() + if not wissen_node: + wissen_node = MindMapNode( + name="Wissen", + description="Zentrale Wissensbasis", + color_code="#4299E1", + icon="brain", + is_public=True + ) + db.session.add(wissen_node) + db.session.flush() + + # Erstelle die Knoten und verbinde sie mit dem Wissen-Knoten + created_nodes = [] + for node_data in nodes: + node = MindMapNode( + name=node_data['name'], + description=node_data['description'], + color_code=node_data['color_code'], + icon=node_data.get('icon', 'circle'), + is_public=True, + category=node_data.get('category') + ) + db.session.add(node) + db.session.flush() + + # Verbinde mit dem Wissen-Knoten + wissen_node.children.append(node) + created_nodes.append(node) + + # Erstelle einige Verbindungen zwischen den Knoten + if len(created_nodes) >= 2: + # Verbinde einige Knoten miteinander + created_nodes[0].children.append(created_nodes[1]) # Wissensmanagement -> Mind-Mapping + if len(created_nodes) >= 3: + created_nodes[1].children.append(created_nodes[2]) # Mind-Mapping -> Cytoscape.js db.session.commit() - print(f"{len(users)} Benutzer wurden erstellt.") + print("Beispiel-Mindmap wurde erstellt!") def create_default_categories(): """Erstellt die Standardkategorien für die Mindmap""" @@ -1918,7 +2043,7 @@ def admin_update_database(): if request.method == 'POST': try: - import update_db + import utils.update_db as update_db update_success = update_db.update_user_table() if update_success: message = "Die Datenbank wurde erfolgreich aktualisiert." diff --git a/database/systades.db b/database/systades.db index 2b37256d2ba3d9aa3620db76e57902b2c9c3f84d..3dc01aacbcd80288a811f4c582ad39bde42e038d 100644 GIT binary patch delta 606 zcmZo@;B08%m>?}E!oa|w0K_mLGEv9aP=rCRO_LQU#K`{}Bq7TGo980$Yi?UEUXD8U z3N~ey{j3j|?O5^{>zM8`8Z#PCY+OA3d_vTFEOh7upkWoyMi!-q-u_UobAibiiTJ1cOBr6gC}TD$x4D zAi!A1z$e3ho_`stk6D>m_A~c0+cDl}tONOYV26GRXj||{G;sE)I7mO_# zxYfDtaLRGbWS3^mXI{=~#J7jHk;#-NhQV^8qxg2=EXHKU>HlpRxu$QhXVRU1#+oU4 zdx$MlA>;O0iHs{)8O5d_G-j0A9-Gcs$jB%T_9sh|ks$l_`-Y5$jNA2WnA8}zAG2e! XV%)wbkI_YN(E$Zu5Q0fySPB3Dh-aCt delta 4985 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 B@H_wj diff --git a/systades.db b/systades.db deleted file mode 100644 index 019eb0c00fc3f23c67cea131faf4f599789b0f31..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 131072 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 QSzMBsl3Kj^7S~^90ABMIUjP6A diff --git a/utils/__pycache__/db_test.cpython-313.pyc b/utils/__pycache__/db_test.cpython-313.pyc index bd43f5fefc10895cb9cf3276a1fa96f90b2acafa..39ed7c36894b03b1a5ede3e6f6822cf7b268c244 100644 GIT binary patch delta 52 zcmcbqdtR6OGcPX}0}yQdBe;=UkX6da*(xTqIJKxaCM3k)*Ez~j&(+t}F~%jeY_kLF GOhEvjDG$v6 delta 62 zcmX@FdsCPDGcPX}0}vQw2yNsRWL2?owu%WYPAw{qNy{us&5dzMEzT~i$Z QEG|h*NiE)N#yV3F071wT!~g&Q diff --git a/utils/__pycache__/server.cpython-313.pyc b/utils/__pycache__/server.cpython-313.pyc index ccc45a03a0d111df197cc79d6e388671917badc0..96ce9cd916b3a236b1dd64ee274eff7fd5013cb9 100644 GIT binary patch delta 52 zcmaFM_n43SGcPX}0}yQdBe;?KFSC@PvsFxJacWUkuUX delta 62 zcmaFN_m+?QGcPX}0}vQw2yNv4%dBGUY!wq)oLW>Ila^VOnj7PiTAW>yUl3zxXc!Y* QSzMBsl3Ki3iN%o_0At7$8~^|S diff --git a/utils/__pycache__/user_manager.cpython-313.pyc b/utils/__pycache__/user_manager.cpython-313.pyc index f8c0dccdab928b999de25b80524531e5de0a29ba..d77e2b1817483ccd2d9215201ebf97d1c3f70434 100644 GIT binary patch delta 52 zcmez5@WO%nGcPX}0}!nKAhMA=fK$rc*(xTqIJKxaCM3k)*Ez~j&(+t}F~%jeY;!&5 GXE6Y|h7kY& delta 62 zcmaFi@X3MuGcPX}0}wDXh;8H!;8byRwu%WYPAw{qNy{us&5dzMEzT~i$Z QEG|h*NiE)7%K2Fg07*v_bpQYW diff --git a/update_db.py b/utils/update_db.py similarity index 100% rename from update_db.py rename to utils/update_db.py