From 96253f469ec9e221d19381b4960e6438ca0a3bf8 Mon Sep 17 00:00:00 2001 From: cube Date: Mon, 30 Mar 2026 13:16:26 +0100 Subject: [PATCH] full system export including blog and groups --- myriad/manage.py | 153 ++++++++++++++++++++++++----- myriad/schema.sql | 9 ++ myriad/templates/manage/admin.html | 15 +++ 3 files changed, 155 insertions(+), 22 deletions(-) diff --git a/myriad/manage.py b/myriad/manage.py index 0a0b81b..204b107 100644 --- a/myriad/manage.py +++ b/myriad/manage.py @@ -255,13 +255,13 @@ def remove_home(mid,location): return redirect(url_for('home.full_list')) # DATA EXPORTS - -@bp.route("/export_fields/") -@login_required -def export_fields(mid): + +def generate_json(mid): db = get_db() member = db.execute("SELECT * FROM member WHERE id=(?)",(mid,)).fetchone() - + groups_r = db.execute("SELECT group_id FROM group_members WHERE member_id=(?)",(mid,)).fetchall() + blog_r = db.execute("SELECT * FROM blog WHERE member_id=(?)",(mid,)).fetchall() + if member[9] == 1: privacy = "public" else: @@ -269,16 +269,75 @@ def export_fields(mid): date_created = member[2].strftime("%d/%m/%Y, %H:%M:%S") + groups = [] + for group in groups_r: + groups.append(group[0]) + blog = [] + for post in blog_r: + d_c = post[2].strftime("%d/%m/%Y, %H:%M:%S") + + if post[5] == 1: + priv = "public" + else: + priv = "private" + + p = { + "id":post[0], + "member-id":post[1], + "date-created":d_c, + "date-format":"d/m/Y, H:M:S", + "title":post[3], + "content":post[4], + "privacy":priv + } + + blog.append(p) + + data = { "date-created":date_created, "date-format":"d/m/Y, H:M:S", "name":member[3], "subtitle":member[4], "description":member[5], - "privacy":privacy + "privacy":privacy, + "theme":member[10], + "groups":groups, + "blog":blog } - filename = str(member[0]) + "-" + member[3] + ".json" + return data + +def generate_json_groups(): + db = get_db() + groups_r = db.execute("SELECT * FROM groups").fetchall() + + groups = [] + for group in groups_r: + if group[3] == 1: + priv = "public" + else: + priv = "private" + + g = { + "id":group[0], + "name":group[1], + "description":group[2], + "privacy":priv + } + + groups.append(g) + return groups + +@bp.route("/export_fields/") +@login_required +def export_fields(mid): + db = get_db() + member = db.execute("SELECT * FROM member WHERE id=(?)",(mid,)).fetchone() + + data = generate_json(mid) + + filename = str(mid) + "-" + member[3] + ".json" full_path = current_app.config["TMP_FOLDER"] + "/" + filename with open(full_path, 'w') as f: json.dump(data, f) @@ -347,21 +406,7 @@ def export_member(mid): blinkies = db.execute("SELECT blinkie_location FROM blinkies WHERE member_id=(?)",(mid,)).fetchall() stamps = db.execute("SELECT stamp_location FROM stamps WHERE member_id=(?)",(mid,)).fetchall() - if member[9] == 1: - privacy = "public" - else: - privacy = "private" - - date_created = member[2].strftime("%d/%m/%Y, %H:%M:%S") - - data = { - "date-created":date_created, - "date-format":"d/m/Y, H:M:S", - "name":member[3], - "subtitle":member[4], - "description":member[5], - "privacy":privacy - } + data = generate_json(mid) data_name = str(member[0]) + "-" + member[3] + ".json" data_full_path = current_app.config["TMP_FOLDER"] + "/" + data_name @@ -385,6 +430,70 @@ def export_member(mid): return send_file("static/tmp/"+zip_name, as_attachment=True) +@bp.route("/export_system") +@login_required +def export_system(): + db = get_db() + members = db.execute("SELECT * FROM member").fetchall() + groups_r = db.execute("SELECT * FROM groups").fetchall() + + data = {} + count = 0 + for member in members: + d = generate_json(member[0]) + data[count] = d + count+=1 + + groups = generate_json_groups() + data["groups"] = groups + + filename = "myriad_system_textonly.json" + file_full_path = current_app.config["TMP_FOLDER"] + "/" + filename + with open(file_full_path, 'w') as f: + json.dump(data, f) + + return send_file("static/tmp/"+filename, as_attachment=True) + +@bp.route("/export_system_full") +@login_required +def export_system_full(): + db = get_db() + members = db.execute("SELECT * FROM member").fetchall() + icons = db.execute("SELECT icon_location FROM icons").fetchall() + blinkies = db.execute("SELECT blinkie_location FROM blinkies").fetchall() + stamps = db.execute("SELECT stamp_location FROM stamps").fetchall() + + data = {} + count = 0 + for member in members: + d = generate_json(member[0]) + data[count] = d + count+=1 + + groups = generate_json_groups() + data["groups"] = groups + + filename = "myriad_system.json" + file_full_path = current_app.config["TMP_FOLDER"] + "/" + filename + with open(file_full_path, 'w') as f: + json.dump(data, f) + + zip_name = "myriad_system.zip" + zip_path = current_app.config["TMP_FOLDER"] + "/" + zip_name + with zipfile.ZipFile(zip_path, "w") as zipf: + zipf.write(file_full_path) + for icon in icons: + iname = icon[0] + zipf.write(current_app.config["ICON_UPLOAD_FOLDER"] + "/" + iname) + for blinkie in blinkies: + bname = blinkie[0] + zipf.write(current_app.config["BLINKIES_UPLOAD_FOLDER"] + "/" + bname) + for stamp in stamps: + sname = stamp[0] + zipf.write(current_app.config["STAMPS_UPLOAD_FOLDER"] + "/" + sname) + + return send_file("static/tmp/"+zip_name, as_attachment=True) + # ASSETS diff --git a/myriad/schema.sql b/myriad/schema.sql index c9f1dc5..23106f3 100644 --- a/myriad/schema.sql +++ b/myriad/schema.sql @@ -6,6 +6,7 @@ DROP TABLE IF EXISTS group_members; DROP TABLE IF EXISTS blog; DROP TABLE IF EXISTS blinkies; DROP TABLE IF EXISTS stamps; +DROP TABLE IF EXISTS sections; CREATE TABLE user ( id INTEGER PRIMARY KEY AUTOINCREMENT, @@ -73,4 +74,12 @@ CREATE TABLE stamps ( member_id INTEGER NOT NULL, stamp_location TEXT NOT NULL, FOREIGN KEY (member_id) REFERENCES member (id) +); + +CREATE TABLE sections ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + member_id INTEGER NOT NULL, + title TEXT, + content TEXT, + FOREIGN KEY (member_id) REFERENCES member (id) ); \ No newline at end of file diff --git a/myriad/templates/manage/admin.html b/myriad/templates/manage/admin.html index 36dde19..3d09aa8 100644 --- a/myriad/templates/manage/admin.html +++ b/myriad/templates/manage/admin.html @@ -6,7 +6,22 @@ {% block content %}
+
Backup
+ Export entire system TEXT ONLY
+ Export entire system WITH ATTACHMENTS + +
+ Import system from JSON
+ Import system from ZIP + +
+ + Clear database WARNING: this action is permanent and irreversible
+ +

+ +
WIP ZONE
Site Users
These are the usernames that can log in to the site
{% for user in users %}