diff --git a/.gitignore b/.gitignore index cc8e6be..545b266 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ .venv/ +.vscode/ *.pyc __pycache__/ diff --git a/myriad/__init__.py b/myriad/__init__.py index 07fd641..a77c4fd 100644 --- a/myriad/__init__.py +++ b/myriad/__init__.py @@ -1,6 +1,8 @@ -import os +import os, datetime from flask import Flask +from myriad.utilities import server_time, get_datetime_str +from myriad.db import get_db def create_app(test_config=None): @@ -33,6 +35,16 @@ def create_app(test_config=None): def get_themes(): themes = os.listdir(app.config["THEMES_FOLDER"]) return themes - return dict(get_themes=get_themes) + def w_server_time(): + return server_time() + def w_get_datetime_str(dt_obj): + return get_datetime_str(dt_obj) + def get_member(mid): + db = get_db() + member = db.execute("SELECT * FROM member WHERE id=(?)",(mid,)).fetchone() + return member + + + return dict(get_themes=get_themes, server_time=w_server_time, get_datetime_str=w_get_datetime_str, get_member=get_member) return app diff --git a/myriad/auth.py b/myriad/auth.py index ce13c95..4644546 100644 --- a/myriad/auth.py +++ b/myriad/auth.py @@ -14,9 +14,7 @@ def login_required(view): def wrapped_view(**kwargs): if g.user is None: return redirect(url_for('auth.login')) - return view(**kwargs) - return wrapped_view @@ -27,9 +25,7 @@ def load_logged_in_user(): if user_id is None: g.user = None else: - g.user = get_db().execute( - 'SELECT * FROM user WHERE id = ?', (user_id,) - ).fetchone() + g.user = get_db().execute('SELECT * FROM user WHERE id = ?', (user_id,)).fetchone() @@ -50,10 +46,7 @@ def register(): if error is None: try: - db.execute( - "INSERT INTO user (username, password) VALUES (?, ?)", - (username, generate_password_hash(password)), - ) + db.execute("INSERT INTO user (username, password) VALUES (?, ?)",(username, generate_password_hash(password)),) db.commit() except db.IntegrityError: error = f"User {username} is already registered." @@ -71,9 +64,7 @@ def login(): password = request.form['password'] db = get_db() error = None - user = db.execute( - 'SELECT * FROM user WHERE username = ?', (username,) - ).fetchone() + user = db.execute('SELECT * FROM user WHERE username = ?', (username,)).fetchone() if user is None: error = 'Incorrect username.' diff --git a/myriad/blog.py b/myriad/blog.py index ee0220f..cdf8be2 100644 --- a/myriad/blog.py +++ b/myriad/blog.py @@ -3,6 +3,7 @@ from flask import ( ) from werkzeug.utils import secure_filename import os, uuid +from myriad.utilities import server_time, get_datetime_obj, get_datetime_str from myriad.auth import login_required from myriad.db import get_db @@ -36,8 +37,9 @@ def new(): content = request.form['content'] mid = request.form["mid"] privacy = request.form["privacy"] + created = get_datetime_obj(server_time()) - db.execute("INSERT INTO blog (member_id, title, content, public) VALUES (?, ?, ?, ?)",(mid, title, content, privacy)) + db.execute("INSERT INTO blog (member_id, title, content, public, created) VALUES (?, ?, ?, ?, ?)",(mid, title, content, privacy, created)) db.commit() return redirect(url_for('blog.blog')) diff --git a/myriad/home.py b/myriad/home.py index 7dbd7de..94fba7d 100644 --- a/myriad/home.py +++ b/myriad/home.py @@ -14,6 +14,18 @@ def index(): fronters = db.execute("SELECT * FROM member WHERE front=(?) ORDER BY member_name",(1,)).fetchall() homepage = db.execute("SELECT * FROM member WHERE homepage=(?) ORDER BY member_name",(1,)).fetchall() + latest_start = db.execute("SELECT start_time FROM front_log ORDER BY start_time DESC").fetchone() + latest_end = db.execute("SELECT end_time FROM front_log ORDER BY end_time DESC").fetchone() + + latest = None + if latest_end[0]: + if latest_start[0] < latest_end[0]: + latest = latest_end[0] + else: + latest = latest_start[0] + else: + latest = latest_start[0] + icons={} for member in homepage: icon_id = member[6] @@ -24,7 +36,7 @@ def index(): else: icons[member[0]] = None - return render_template('index.html', front_list=fronters, home_pins=homepage, icons=icons) + return render_template('index.html', front_list=fronters, home_pins=homepage, icons=icons, last_updated=latest) @bp.route('/full') def full_list(): diff --git a/myriad/manage.py b/myriad/manage.py index 2a54f9f..c518f57 100644 --- a/myriad/manage.py +++ b/myriad/manage.py @@ -2,6 +2,7 @@ from flask import Blueprint, flash, g, redirect, render_template, request, sessi from werkzeug.utils import secure_filename import os, uuid, json, zipfile, datetime +from myriad.utilities import server_time, get_datetime_obj, server_time_obj from myriad.auth import login_required from myriad.db import get_db @@ -16,9 +17,11 @@ def new(): subtitle = request.form["subtitle"] bio = request.form['bio'] user_id = g.user[0] + date_created = get_datetime_obj(server_time()) + db = get_db() - db.execute("INSERT INTO member (user_id, member_name, bio, subtitle) VALUES (?, ?, ?, ?)",(user_id, name, bio, subtitle)) + db.execute("INSERT INTO member (user_id, member_name, bio, subtitle, created) VALUES (?, ?, ?, ?, ?)",(user_id, name, bio, subtitle, date_created)) db.commit() return redirect(url_for('home.full_list')) @@ -193,6 +196,9 @@ def add_to_front(mid,location): db.execute("UPDATE member SET front=(?) WHERE id=(?)",(1, mid)) db.commit() + db.execute("INSERT INTO front_log (member_id, start_time) VALUES (?, ?)",(mid, server_time_obj())) + db.commit() + if location == "home": return redirect(url_for('index')) else: @@ -205,10 +211,24 @@ def remove_front(mid, location): db.execute("UPDATE member SET front=(?) WHERE id=(?)",(0, mid)) db.commit() + current_entry = db.execute("SELECT id FROM front_log WHERE member_id=(?) AND end_time IS NULL",(mid,)).fetchone() + current_entry_id = current_entry[0] + db.execute("UPDATE front_log SET end_time=(?) WHERE id=(?)",(server_time_obj(), current_entry_id)) + db.commit() + if location == "home": return redirect(url_for('index')) else: return redirect(url_for('home.full_list')) + +@bp.route("/delete_front_log/") +@login_required +def delete_front_log(fid): + db = get_db() + db.execute("DELETE FROM front_log WHERE id=(?)",(fid,)) + db.commit() + + return redirect(url_for('manage.admin')) @bp.route("/add_to_home//") @@ -255,13 +275,9 @@ def import_member(member): db = get_db() mid = member["id"] - date_raw = member["date-created"].split(",") - date = date_raw[0] - day,month,year = date.split("/") - time = date_raw[1] - hour,minute,second = time.split(":") - date_created = datetime.datetime(int(year), int(month), int(day), int(hour), int(minute), int(second)) + date_created_obj = get_datetime_obj(member["date-created"]) + name = member["name"] subtitle = member["subtitle"] description = member["description"] @@ -284,12 +300,7 @@ def import_member(member): blog = member["blog"] for post in blog: - date_raw = post["date-created"].split(",") - date = date_raw[0] - day,month,year = date.split("/") - time = date_raw[1] - hour,minute,second = time.split(":") - date_created = datetime.datetime(int(year), int(month), int(day), int(hour), int(minute), int(second)) + post_date_created = get_datetime_obj(post["date-created"]) title = post["title"] content = post["content"] @@ -299,7 +310,7 @@ def import_member(member): else: privacy = 0 - db.execute("INSERT INTO blog (member_id, created, title, content, public) VALUES (?, ?, ?, ?, ?)",(mid, date_created, title, content, privacy)) + db.execute("INSERT INTO blog (member_id, created, title, content, public) VALUES (?, ?, ?, ?, ?)",(mid, post_date_created, title, content, privacy)) db.commit() icons = member["icons"] @@ -320,7 +331,7 @@ def import_member(member): db.execute("INSERT INTO stamps (member_id, stamp_location) VALUES (?, ?)",(mid, stamp)) db.commit() - db.execute("INSERT INTO member (id,created,user_id, member_name,subtitle, bio,public,theme,homepage,main_icon) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)",(mid, date_created, user_id, name, subtitle, description,privacy, theme, homepage, main_icon_id)) + db.execute("INSERT INTO member (id,created,user_id, member_name,subtitle, bio,public,theme,homepage,main_icon) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)",(mid, date_created_obj, user_id, name, subtitle, description,privacy, theme, homepage, main_icon_id)) db.commit() @@ -369,8 +380,9 @@ def admin(): return "go home" users = db.execute("SELECT * FROM user").fetchall() + front_log = db.execute("SELECT * FROM front_log ORDER BY start_time DESC").fetchall() - return render_template("manage/admin.html", users=users) + return render_template("manage/admin.html", users=users, front_log=front_log) @@ -394,7 +406,7 @@ def generate_json(mid): else: privacy = "private" - date_created = member[2].strftime("%d/%m/%Y, %H:%M:%S") + date_created = member[2] homepage = member[7] @@ -403,7 +415,7 @@ def generate_json(mid): groups.append(group[0]) blog = [] for post in blog_r: - d_c = post[2].strftime("%d/%m/%Y, %H:%M:%S") + d_c = post[2] if post[5] == 1: priv = "public" diff --git a/myriad/schema.sql b/myriad/schema.sql index 23106f3..479413e 100644 --- a/myriad/schema.sql +++ b/myriad/schema.sql @@ -7,6 +7,7 @@ DROP TABLE IF EXISTS blog; DROP TABLE IF EXISTS blinkies; DROP TABLE IF EXISTS stamps; DROP TABLE IF EXISTS sections; +DROP TABLE IF EXISTS front_log; CREATE TABLE user ( id INTEGER PRIMARY KEY AUTOINCREMENT, @@ -17,7 +18,7 @@ CREATE TABLE user ( CREATE TABLE member ( id INTEGER PRIMARY KEY AUTOINCREMENT, user_id INTEGER NOT NULL, - created TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + created TIMESTAMP, member_name TEXT NOT NULL, subtitle TEXT DEFAULT "", bio TEXT, @@ -55,7 +56,7 @@ CREATE TABLE group_members ( CREATE TABLE blog ( id INTEGER PRIMARY KEY AUTOINCREMENT, member_id INTEGER NOT NULL, - created TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + created TIMESTAMP, title TEXT, content TEXT, public BOOLEAN NOT NULL DEFAULT 1, @@ -82,4 +83,12 @@ CREATE TABLE sections ( title TEXT, content TEXT, FOREIGN KEY (member_id) REFERENCES member (id) +); + +CREATE TABLE front_log ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + member_id INTEGER NOT NULL, + start_time TIMESTAMP, + end_time TIMESTAMP, + FOREIGN KEY (member_id) REFERENCES member (id) ); \ No newline at end of file diff --git a/myriad/static/style.css b/myriad/static/style.css index 9ea1464..67ed919 100644 --- a/myriad/static/style.css +++ b/myriad/static/style.css @@ -225,6 +225,11 @@ form textarea{ font-size:10px; } +.log{ + max-height:300px; + overflow-y:scroll; +} + diff --git a/myriad/templates/base.html b/myriad/templates/base.html index 6ce098e..d2d422f 100644 --- a/myriad/templates/base.html +++ b/myriad/templates/base.html @@ -12,6 +12,7 @@