From d58aba26c2eba9c3ae5e4bf815eff7ae48f362ca Mon Sep 17 00:00:00 2001 From: Till Tomczak Date: Sun, 27 Apr 2025 07:43:03 +0200 Subject: [PATCH] Refactor OpenAI integration and enhance mindmap UI: Update OpenAI client initialization to use a dedicated class, streamline API key management, and improve loading animations in the mindmap template. Add a modal for adding new thoughts with enhanced user feedback and error handling, while updating the loading overlay for better visual appeal and responsiveness. --- website/__pycache__/app.cpython-311.pyc | Bin 51839 -> 53250 bytes website/__pycache__/init_db.cpython-311.pyc | Bin 5384 -> 11142 bytes website/app.py | 23 +- website/cookies.txt | 4 + website/create_admin.py | 44 ++++ website/database/systades.db | Bin 106496 -> 106496 bytes website/database/systades.db.backup | Bin 0 -> 106496 bytes website/fix_db.py | 70 ++++++ website/rebuild_db.py | 73 ++++++ website/templates/mindmap.html | 261 ++++++++++++++++++-- website/test_db.py | 30 +++ 11 files changed, 469 insertions(+), 36 deletions(-) create mode 100644 website/cookies.txt create mode 100644 website/create_admin.py create mode 100644 website/database/systades.db.backup create mode 100755 website/fix_db.py create mode 100644 website/rebuild_db.py create mode 100644 website/test_db.py diff --git a/website/__pycache__/app.cpython-311.pyc b/website/__pycache__/app.cpython-311.pyc index c43e69d683bc8ed6fb8089771dc3e9637d7077c5..b13252694aec472c5266270b89a09d33ddc906c9 100644 GIT binary patch delta 11489 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 delta 10218 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 jn!w4jc*+t_nc}G$^ zvFyRcw28*65A$M76ysALL}EyMKumlvHMP{l#Ke~-O%vbfgE6GV#61ubCYenB^P9~4 z{xiSjZTs@J{o_Dom>`G-%a81(QftIYwoL?RD+SE+GElcZ{}JP_b^Dk!LHhOy-@gC5 zb@QpuZ@vN^f(@I)u4IxRK3NSm-;D8PYhLKh4P0D$vscc?QzM4$6>h zT}HE@8?l6uusFr#xT3|>sHCfWA|fif5Z6U(h$=@6SySYMp&2qCQ6g$I!%Kpikuyq0 zKSts|dQvnR6GdzAm*piMSm`$2*`d}bj{BB^{c~SDs`%y+#jR1>=gYo9?fk=pm_5Sn z&W+xxn}#FctT!d_DbdeQ&_5Wu;DNigLx&B z)l23Tid=*D*3EZ-V)kh2bCb3enp{|#gEnyE_8jbzNjLV+!Fi8o#p`sifdCY9xR8cw zaA7eGVGNEz5ZNK9$JfSS93Q9QEIyk70e>Eb8vJ?;UbYoN4jh<)W^iJ1+A1u~z^;3x z((YheTA--l6RQO{kRFEt3}zu&IlVYB|5heDt#TLo`g%H(m(Uyq-rLH#U8<7TCv!L6 z#qn`#_=Pl_!WIK6od4(VW+BKGSjxdRHo__#eDnxBiZnjF4$tgi+Rk<~;=?SQz|XEj zmB(Iq6&!4BEv$~=594qbi=)8CvdUt9BAc6>p5rbi2RjG5dppZal(&_wTZDhdf78c#zxUksoOAu?G9B;JzfvUq zA-T0~eo8hKlI+2LSBDQd=VoX1xx9K98t~7n(2WmL(1iLByl{NQUThtKe%p$(7XKcC z({N%lI1JYS>Tr1k+P(FbqMT(_t(>XBtr2Ji7OjH1O&A3OY^y{y-qWn})NJl*@CVqF zRd)7DxV)D}oSK3lRc#3e?;DmVs>&B^*sPm`Fp%99cs~nWRAoVAuznU|P=S|c;kkXn zZ)X>K4;%b81p)kJ3Qkf?A??Gzrl1G>n^qSF$UZNw=in0MD}+4QlY+D0#ak(O3cd~4 LvGE(!_CE73_&q;$ delta 1983 zcmZ`(Z)_7~7{BLwz4p4bZwK27jBPhJM8p1c*Xy+v6R9v*H#Y|R17rO0+P+;cYp=C; z9gYupDbk9x%mWrp4uhHYB-&x=9 z3_9WaeaX7*^H{*Tn1(KE(tY~#mdBEk5~Nqh!8krxoXaQn4x}V`Wbnm~OhyXJy}dD6 zk)==wXQE+Q#)=Y4_R5h+G8jxrK{XbZLaAg*Nv0JwrY2P-5)DP7SV}7xTMlqBfgWp8 zIPGcaIQW3Ze0FjoSsK_`l#9yf>}-EWG7?t8Avq+;6d^68Lg|bYO(o?_QjUhB!JsOq zSD4nY-@!3kgaevkV4a>2|#aj;OtdRCpr zIxdO3aM>*D(_&dqi(0mX#dz5`u9aqJ4C|s=&d`iO&rRTxVO}|-r*+K`(=@Ojt2vEE z%x)xsCftGR|#kLl~vuudY*Qt>e@_|@*k8wO{d(tnwvAQ zI7`W>IXGRFn4ndqVhNk7sTFjp%BEif*1hI;r#OBI;@?E9O<3UB|f`&Wq3D<7LAz4Xo*+W|(4zI;G~ZZmKyk zbLCP=Oxu{`@n)Y2-O9^hGDOdI700y;u%w$ z#o~$b+CBL1Qnfu&LNul*3X5rvRzqC)Uv$ofw+9tjJE;GM4c%|zE`$C=cQ4jG{}bBi zWE}twmIDU}tlc<^eznuT()2Clb8%p&StkdAz+PD3c3k9k{PoO*_rTxdnqxeCg7Gb* zuhBX0joN9?r|!F+mt5EQglmrbk>?$ldzanhkeS=e>&)wm)`Y9lwazu?Tv@U%IUSWQ z54nC6o`xFYKL$T@=nrP!qBYb~d0cP>nwsF1c2iB}aH^2E*ZIN2L%!P&i8?Kh4O7h* z#a;2SzOlqmAGv%4+R2v**i62i0Fit=3S;0R&M|lb+{@i#@H~KG1G$f#v3?<;` zeF6G7w0f*b&K20Y6)G=~#X)EVCs`VVQF3hvo+OSuxa_+0k{E<%8L!;>Lhf-22wmiqy9tC1AM%Z4~+Ma^LwG0oSB5ynvHbiZhAAv z>dEE9aFlDP99~b_kHB+Kzf21eMe15d4h>M~^)}K*^7a7S;d|=%z|LkHXagA?hIQP! zO2AKAhF~+)k?lk9C!0VdJ_Y@pzasg_8&jYFBA-pcJwEPzs9^*7pdUIoU!|p%Oz)vu Wz2vPuaEIMnL#(4P47Kks1pfx#`Z*o| diff --git a/website/database/systades.db.backup b/website/database/systades.db.backup new file mode 100644 index 0000000000000000000000000000000000000000..1223cb7e838f974e2b5c507bef7b6ba21e349467 GIT binary patch literal 106496 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 literal 0 HcmV?d00001 diff --git a/website/fix_db.py b/website/fix_db.py new file mode 100755 index 0000000..9bfbc93 --- /dev/null +++ b/website/fix_db.py @@ -0,0 +1,70 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +import os +import sqlite3 +from datetime import datetime +from app import app, db_path +from models import db + +def ensure_db_dir(): + """Make sure the database directory exists.""" + os.makedirs(os.path.dirname(db_path), exist_ok=True) + +def fix_database_schema(): + """Fix the database schema by adding missing columns.""" + with app.app_context(): + # Ensure directory exists + ensure_db_dir() + + # Check if database exists, create tables if needed + if not os.path.exists(db_path): + print("Database doesn't exist. Creating all tables from scratch...") + db.create_all() + print("Database tables created successfully!") + return + + # Connect to existing database + print(f"Connecting to database: {db_path}") + conn = sqlite3.connect(db_path) + cursor = conn.cursor() + + # Check if User table exists + cursor.execute("SELECT name FROM sqlite_master WHERE type='table' AND name='user'") + if not cursor.fetchone(): + print("User table doesn't exist. Creating all tables from scratch...") + conn.close() + db.create_all() + print("Database tables created successfully!") + return + + # Check existing columns + cursor.execute("PRAGMA table_info(user)") + columns = cursor.fetchall() + column_names = [col[1] for col in columns] + print("Existing columns in User table:", column_names) + + # Add missing columns + if 'created_at' not in column_names: + print("Adding 'created_at' column to User table...") + cursor.execute("ALTER TABLE user ADD COLUMN created_at TIMESTAMP") + + if 'last_login' not in column_names: + print("Adding 'last_login' column to User table...") + cursor.execute("ALTER TABLE user ADD COLUMN last_login TIMESTAMP") + + if 'avatar' not in column_names: + print("Adding 'avatar' column to User table...") + cursor.execute("ALTER TABLE user ADD COLUMN avatar VARCHAR(200)") + + if 'bio' not in column_names: + print("Adding 'bio' column to User table...") + cursor.execute("ALTER TABLE user ADD COLUMN bio TEXT") + + # Commit the changes + conn.commit() + conn.close() + print("Database schema updated successfully!") + +if __name__ == "__main__": + fix_database_schema() \ No newline at end of file diff --git a/website/rebuild_db.py b/website/rebuild_db.py new file mode 100644 index 0000000..159eb08 --- /dev/null +++ b/website/rebuild_db.py @@ -0,0 +1,73 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +import os +import sqlite3 +from datetime import datetime +from app import app, db_path, create_default_categories +from models import db, User, Category + +def rebuild_database(): + """Completely rebuilds the database by dropping and recreating all tables.""" + with app.app_context(): + print(f"Database path: {db_path}") + + # Back up existing database if it exists + if os.path.exists(db_path): + backup_path = db_path + '.backup' + try: + import shutil + shutil.copy2(db_path, backup_path) + print(f"Backed up existing database to {backup_path}") + except Exception as e: + print(f"Warning: Could not create backup - {str(e)}") + + # Ensure directory exists + os.makedirs(os.path.dirname(db_path), exist_ok=True) + + # Drop all tables and recreate them + print("Dropping all tables...") + db.drop_all() + + print("Creating all tables...") + db.create_all() + + # Create admin user + print("Creating admin user...") + admin = User( + username='admin', + email='admin@example.com', + is_admin=True, + created_at=datetime.utcnow() + ) + admin.set_password('admin') + db.session.add(admin) + + # Create regular user + print("Creating regular user...") + user = User( + username='user', + email='user@example.com', + is_admin=False, + created_at=datetime.utcnow() + ) + user.set_password('user') + db.session.add(user) + + try: + # Commit to generate user IDs + db.session.commit() + print("Users created successfully!") + + # Create default categories + print("Creating default categories...") + create_default_categories() + + print("Database rebuild completed successfully!") + except Exception as e: + db.session.rollback() + print(f"Error during database rebuild: {str(e)}") + raise + +if __name__ == "__main__": + rebuild_database() \ No newline at end of file diff --git a/website/templates/mindmap.html b/website/templates/mindmap.html index b1c3982..c06af0f 100644 --- a/website/templates/mindmap.html +++ b/website/templates/mindmap.html @@ -577,13 +577,38 @@
- -
+ + + + + + + + + + + + + + + + + + + + + + + + + +
-
-

Wissenslandschaft wird geladen...

-
-
+
+

Wissenslandschaft wird geladen...

+

Daten werden aus der Datenbank abgerufen

+
+
@@ -646,6 +671,33 @@
+ + +
{% endblock %} @@ -653,17 +705,20 @@ + + + + - - +