diff --git a/.gitignore b/.gitignore index 4a73e55..bf6fab7 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,4 @@ *.db -socket.io.js __pycache__/ logs/* venv/* @@ -10,4 +9,5 @@ flask_session/ /test/.pytest_cache/ /test/flask_session/ /Website/__pycache__/ -/Website/.pytest_cache/ \ No newline at end of file +/Website/.pytest_cache/ +/.idea \ No newline at end of file diff --git a/README b/README index 7886119..e86ae96 100644 --- a/README +++ b/README @@ -5,8 +5,6 @@ How to get started: source venv/bin/activate install requiremens: pip install -r requirements.txt - create the log folder: - mkdir logs start the program: - python main.py - You can now accses the Website on http://127.0.0.1:5000 \ No newline at end of file + venv/bin/gunicorn -b "127.0.0.1:5000" -k geventwebsocket.gunicorn.workers.GeventWebSocketWorker -w 1 main:app + You can now accses the Website on http://127.0.0.1:5000 diff --git a/Website/__init__.py b/Website/__init__.py index 856b26a..ddaa1ca 100644 --- a/Website/__init__.py +++ b/Website/__init__.py @@ -1,27 +1,21 @@ import queue, time, uuid, json, logging, datetime, os -from flask import Flask, render_template, request, make_response, session, send_file, g +from flask import Flask, render_template, render_template_string, request, make_response, session, send_file, g from flask_socketio import SocketIO, join_room, leave_room from flask_session import Session -from markupsafe import escape -from .db import get_db +from Website.db import get_db +import Website.db as db_handler from datetime import datetime finished = None - +preis = -150 #Ein Getraenk #flask_config DATABASE = './Website/mate.db' -#def create_logs(app): -# now = datetime.datetime.now().strftime('%d-%m-%Y-%H-%M-%S') -# logging.basicConfig(filename=f"logs/matekasse-{now}.log",filemode='w', format='%(asctime)s - %(name)s - %(levelname)s - %(message)s' ,encoding='utf-8', level=logging.INFO) -# app.logger = logging.getLogger('db') -# -# app.logger.info("Website is starting") - -def log(type=None, userid=None, before=None, after=None): - db = get_db() - c = db.cursor() - c.execute("INSERT or IGNORE INTO transaction_log (timestamp, userid, type, before, after) VALUES (?, ?, ?, ?, ?)", [datetime.now(), userid, type, before, after]) - db.commit() +def limit_length(text, length=50): + if type(text) != str: + text = str(text) + if len(text) > length: + return f"{text[:(length -3)]}..." + return text def create_app(test_config=None): app = Flask(__name__) @@ -30,15 +24,15 @@ def create_app(test_config=None): app.config['SESSION_TYPE'] = 'filesystem' app.config['SECRET_KEY'] = key app.config['DATABASE'] = DATABASE + app.jinja_env.filters['limit_length'] = limit_length else: app.config.from_mapping(test_config) try: os.makedirs(app.instance_path) + except OSError: pass - #with app.app_context(): - # create_logs(app) Session(app) socketio = SocketIO(app) @@ -48,32 +42,32 @@ def create_app(test_config=None): # db = getattr(g, '_database', None) # if db is not None: # db.close() - # app.logger.info("Website exited") + # appt.logger.info("Website exited") #var user_queue = queue.Queue() #website @app.route('/favicon.ico') + @app.route('/ccc_logo.png') def favicon(): return send_file("../static/Logo_CCC.svg.png") - #@app.route('/socket.io.js') - #def socketiojs(): - # return url_for('static', filename='socket.io.js') + @app.route('/socket.io.js') + def socketiojs(): + return send_file('../static/socket.io.js') + + @app.route('/ka-ching.wav') + def kaching(): + return send_file('../static/ka-ching.wav') + + @app.route('/new.css') + def newcss(): + return send_file('../static/new.min.css') @app.route("/") def index(): - return """ - user and tag list -
The creator of this website accepts no liability for any linguistic or technical errors!
-{escape(i[1])}: {i[2]/100}€
user and tag list | Documentation
- - -{i[0]} userid: {i[1]} {i[2]} {i[3]} to {i[4]}
" - return text + action = { + "statement":i[0], + "user_id":i[1], + "before":i[2], + "after":i[3], + "change":i[4] + } + if action["statement"] == "balance": + action["reverse_statement"] = "balance" + action["reverse_user_id"] = action["user_id"] + action["reverse_before"] = None + action["reverse_after"] = None + action["reverse_change"] = action["change"] *(-1) + elif action["statement"] == "add_user": + action["reverse_statement"] = "remove_user" + action["reverse_user_id"] = action["user_id"] + action["reverse_before"] = action["after"] + action["reverse_after"] = None + action["reverse_change"] = None + elif action["statement"] == "remove_user": + action["reverse_statement"] = "add_user" + action["reverse_user_id"] = action["user_id"] + action["reverse_before"] = None + action["reverse_after"] = action["before"] + action["reverse_change"] = None + elif action["statement"] == "add_tag": + action["reverse_statement"] = "remove_tag" + action["reverse_user_id"] = action["user_id"] + action["reverse_before"] = action["after"] + action["reverse_after"] = None + action["reverse_change"] = None + elif action["statement"] == "remove_tag": + action["reverse_statement"] = "add_tag" + action["reverse_user_id"] = action["user_id"] + action["reverse_before"] = None + action["reverse_after"] = action["before"] + action["reverse_change"] = None + else: + raise Exception(statement) + action_list.append(action) + return render_template("transactionlist.html", action_list=action_list) @app.route("/list/user", methods=['GET']) def user_info(): @@ -117,41 +133,18 @@ def create_app(test_config=None): c = db.cursor() id = request.args.get("id") c.execute(f"SELECT * FROM users WHERE id=?", [id]) - user_list = c.fetchall() - if user_list != []: - user = user_list[0] + user = c.fetchone() + if user != None : c.execute(f"SELECT * FROM tags WHERE userid={user[0]}") tags = c.fetchall() - text = "" - for tag in tags: - text = text + f' ' - return f""" - - - -user and tag list | Documentation
-{escape(user[1])} : {escape(user[2]/100)}€
-
- - - -Tags:
- {text} -user and tag list | Documentation
Deleted user {escape(user_name)}
return to the tags and user list' + return render_template("removeuser.html", user_name=user_name) else: return render_template("error.html", error_code="043") @@ -181,20 +170,11 @@ def create_app(test_config=None): return render_template("error.html", error_code="418") c.execute("SELECT * FROM users WHERE username=?", [username]) if c.fetchall() == []: - c.execute("INSERT or IGNORE INTO users (username, balance) VALUES (?, 0)", [username]) - db.commit() + db_handler.add_user(username) socketio.emit("update", "update") c.execute(f"SELECT * FROM users WHERE username=?", [username]) user = c.fetchone() - log(type="adduser", userid=user[0], after=user[1]) - return """ - - -tag was sucsesfully added
- - """ + return render_template("redirect.html") else: return render_template("error.html", error_code="757") @@ -205,27 +185,16 @@ def create_app(test_config=None): c = db.cursor() try: user_id = request.form["id"] - change = float(request.form["change"]) - print(change) + change = int(float(request.form["change"]) * float(100)) except: return render_template("error.html", error_code="095") c.execute(f"SELECT * FROM users WHERE id=?", [user_id]) users = c.fetchall() if users != []: balance_old = users[0][2] - c.execute(f"UPDATE users SET balance = balance + {change*100} WHERE id={user_id}") - db.commit() - c.execute(f"SELECT * FROM users WHERE id={user_id}") - user = c.fetchone() - log(type="balance", userid=user[0], before=balance_old, after=user[2]) + db_handler.change_balance(user_id, change) socketio.emit("update", "update") - return """ - - - - """ + return render_template("redirect.html") else: return render_template("error.html", error_code="043") @@ -285,17 +254,9 @@ def create_app(test_config=None): c = db.cursor() c.execute(f"SELECT * FROM tags WHERE (tagid = ? AND userid = ?)", [tag_id, user_id]) if c.fetchall != []: - c.execute(f"DELETE FROM tags WHERE (tagid = ? AND userid = ?)", [tag_id, user_id]) - db.commit() + db_handler.remove_tag(tag_id) message = f"Removed {tag_id} from user {user_id}" - log(type="removetag", userid=user_id, before=tag_id) - return f""" - - - - """ + return render_template("redirect.html") else: return render_template("error.html", error_code="054") @@ -326,44 +287,75 @@ def create_app(test_config=None): socketio.emit("error", "418", to=session[id]) leave_room(session[id]) - #api - @app.route("/api/change", methods=['GET', 'POST']) - def api_change(): + @app.route("/transfare") + def transfare(): db = get_db() c = db.cursor() - try: - userid = request.form["id"] - except: - userid = request.args.get("id") - c.execute("SELECT * FROM users WHERE id=?", [userid]) + c.execute("SELECT * FROM users") user_list = c.fetchall() - if user_list != []: - user = user_list[0] - try: - change = int(request.args.get("change")) - except: - change = -1.5 - c.execute(f"UPDATE users SET balance = balance + {change*100} WHERE id={user[0]}") - db.commit() - c.execute(f"SELECT * FROM users WHERE id = {userid}") - user_new = c.fetchone() - log(type="balance", userid=user[0], before=user[2], after=user_new[2]) - socketio.emit("update", "update") - return make_response(json.dumps({"mode":"balance", "username":user[1], "balance":user_new[2]})) - else: - return make_response(json.dumps({"mode":"error","error":"043"})) + return render_template("transfare.html", user_list=user_list) + + @app.route("/api/transfare", methods=['POST']) + def api_transfare(): + db = get_db() + c = db.cursor() + transfare_from = request.form["transfarefrom"] + transfare_to = request.form["transfareto"] + change = int(float(request.form["change"]) * float(100)) + c.execute("SELECT * FROM users WHERE id=?", [transfare_from]) + if c.fetchall() == []: + return render_template("error.html", error_code="043") + c.execute("SELECT * FROM users WHERE id=?", [transfare_to]) + if c.fetchall() == []: + return render_template("error.html", error_code="043") + db_handler.change_balance(transfare_from, -change) + db_handler.change_balance(transfare_to, change) + return render_template("redirect.html") + + @app.route("/api/balance", methods=['POST', 'GET']) + def api_change(): + if request.method == 'POST': + db = get_db() + c = db.cursor() + userid = request.form["id"] + c.execute("SELECT * FROM users WHERE id=?", [userid]) + user_list = c.fetchall() + if user_list != []: + user = user_list[0] + try: + change = int(request.args.get("change")) + except: + change = preis + db_handler.change_balance(userid, change) + socketio.emit("update", "update") + c.execute("SELECT * FROM users WHERE id=?",[userid]) + return make_response(json.dumps({"mode":"balance", "username":user[1], "balance":c.fetchone()[2]})) + else: + return make_response(json.dumps({"mode":"error","error":"043"})) + + elif request.method == 'GET': + db = get_db() + c = db.cursor() + userid = request.args.get("id") + c.execute("SELECT * FROM users WHERE id=?", [userid]) + user = c.fetchone() + if user != None: + return make_response(json.dumps({"mode":"balance", "username":user[1], "balance":user[2]})) + else: + return make_response(json.dumps({"mode":"error", "error":"043"})) + - @app.route("/api/tag_id", methods=['GET', 'POST']) + @app.route("/api/tag_id", methods=['POST']) def get_id(): + db = get_db() + c = db.cursor() global finished global message - db = get_db() - c = db.cursor() try: tag_id = request.form["id"] except: - tag_id = request.args.get("id") + return make_response(json.dumps({"mode":"error", "error":"638"})) c.execute(f"SELECT * FROM tags WHERE tagid=?", [tag_id]) tag_list = c.fetchall() @@ -383,20 +375,16 @@ def create_app(test_config=None): finished = queue_item return make_response(json.dumps({"mode":"error","error":"170"})) else: - c.execute(f"INSERT OR IGNORE INTO tags (tagid, userid) VALUES ({tag_id}, ?)", [user_id]) - db.commit() + db_handler.add_tag(user_id, tag_id) message = f"Added {tag_id} to {username}" - log(type="addtag", userid=user_id ,after=tag_id) finished = queue_item return make_response(json.dumps({"mode":"message","username":"{}".format(username),"message":"A tag was added"})) elif state == "remove": c.execute(f"SELECT * FROM tags WHERE (tagid = {tag_id} AND userid = ?)", [user_id]) tags = c.fetchall() if tags != []: - c.execute(f"DELETE FROM tags WHERE (tagid = {tag_id} AND userid = ?)", [user_id]) db.commit() message = f"Removed {tag_id} from {username}" - log(type="removetag", userid=user_id, before=tag_id) finished = queue_item return make_response(json.dumps({"mode":"message","username":"{}".format(username),"message":"A tag was removed"})) else: @@ -414,11 +402,9 @@ def create_app(test_config=None): if user_list != []: balance_old = user_list[0][2] if user_queue.qsize() == 0: - c.execute(f"UPDATE users SET balance = balance - 150 WHERE id={tag[1]}") - db.commit() + db_handler.change_balance(tag[1], preis) c.execute(f"SELECT * FROM users WHERE id={tag[1]}") user = c.fetchone() - log(type="balance", userid=user[0], before=balance_old, after=user[2]) socketio.emit("update", "update") return make_response(json.dumps({"mode":"balance", "username":user[1], "balance":user[2]/100})) else: @@ -426,9 +412,35 @@ def create_app(test_config=None): socketio.emit("update", "update") return make_response(json.dumps({"mode":"error","error":"054"})) + + @app.route("/api/change", methods=['POST']) + def reroll(): + statement = request.form["statement"] + user_id = request.form["user_id"] + before = request.form["before"] + after = request.form["after"] + change = request.form["change"] + + if statement == "add_user": + db_handler.add_user(after) + elif statement == "remove_user": + db_handler.remove_user(user_id) + elif statement == "add_tag": + db_handler.add_tag(user_id, after) + elif statement == "remove_tag": + db_handler.remove_tag(befor) + elif statement == "balance": + db_handler.change_balance(user_id, change) + else: + return make_response(json.dumps({"mode":"error", "error":"418"})) #Error code + + socketio.emit("update", "update") + return render_template("index.html") + #Documentation @app.route("/documentation") def documentation(): return render_template("documentation.html") - return {"app":app,"socketio":socketio} \ No newline at end of file + + return {"app":app,"socketio":socketio} diff --git a/Website/db.py b/Website/db.py index a805a88..c0fedc0 100644 --- a/Website/db.py +++ b/Website/db.py @@ -1,9 +1,58 @@ from re import M +from markupsafe import escape import sqlite3 - +from datetime import datetime import click from flask import current_app, g +def log(statement, user_id=None, before=None, after=None, change=None): + db = get_db() + c = db.cursor() + c.execute("INSERT INTO transaction_log (type, user_id, before, after, change) VALUES (?, ?, ?, ?, ?)", [ statement, user_id, before, after, change]) + db.commit() + +def add_user(after): + db = get_db() + c = db.cursor() + c.execute("INSERT or IGNORE INTO users (username, balance) VALUES (?, 0)", [after]) + user_id = c.lastrowid + log("add_user", user_id=user_id, after=after) + db.commit() + +def remove_user(user_id): + db = get_db() + c = db.cursor() + c.execute("SELECT * FROM users WHERE id = ?", [user_id]) + user_name = c.fetchone()[1] + c.execute("SELECT * FROM tags WHERE userid = ?", [user_id]) + for tag in c.fetchall(): + remove_tag(tag[0]) + c.execute("DELETE FROM users WHERE id = ?", [user_id]) + log("remove_user", user_id=user_id, before=user_name) + db.commit() + +def add_tag(user_id, tag_id): + db = get_db() + c = db.cursor() + c.execute("INSERT OR IGNORE INTO tags (tagid, userid) VALUES (?, ?)", [tag_id, user_id]) + db.commit() + log("add_tag", after=tag_id, user_id=user_id) + +def remove_tag(tag_id): + db = get_db() + c = db.cursor() + c.execute("SELECT * FROM tags WHERE tagid = ?", [tag_id]) + user_id = c.fetchone()[1] + c.execute("DELETE FROM tags WHERE tagid = ?", [tag_id]) + log("remove_tag", before=tag_id, user_id=user_id) + db.commit() + +def change_balance(user_id, change): + db = get_db() + c = db.cursor() + c.execute("UPDATE users SET balance = balance + ? WHERE id=?", [change, user_id]) + log("balance", user_id=user_id, change=change) + db.commit() def get_db(): if 'db' not in g: diff --git a/Website/mate.db.sql.txt b/Website/mate.db.sql.txt deleted file mode 100644 index d20b9a5..0000000 --- a/Website/mate.db.sql.txt +++ /dev/null @@ -1,14 +0,0 @@ -BEGIN TRANSACTION; -CREATE TABLE IF NOT EXISTS "users" ( - "id" INTEGER NOT NULL, - "username" TEXT NOT NULL, - "balance" INTEGER NOT NULL, - PRIMARY KEY("id") -); -CREATE TABLE IF NOT EXISTS "tags" ( - "tagid" INEGER NOT NULL, - "userid" INTEGER, - FOREIGN KEY("userid") REFERENCES "users"("id"), - PRIMARY KEY("tagid") -); -COMMIT; diff --git a/Website/schema.sql b/Website/schema.sql index 56a152e..ed0bd96 100644 --- a/Website/schema.sql +++ b/Website/schema.sql @@ -12,10 +12,10 @@ CREATE TABLE IF NOT EXISTS "tags" ( PRIMARY KEY("tagid") ); CREATE TABLE IF NOT EXISTS "transaction_log" ( - "timestamp" INTEGER NOT NULL, - "userid" INTEGER NOT NULL, - "type" TEXT NOT NULL, - "before" TEXT, - "after" TEXT + "type" TEXT NOT NULL, + "user_id" INTEGER, + "before" TEXT, + "after" TEXT, + "change" INTEGER ); -COMMIT; \ No newline at end of file +COMMIT; diff --git a/Website/templates/addtag.html b/Website/templates/addtag.html index 98b5c17..4d564ae 100644 --- a/Website/templates/addtag.html +++ b/Website/templates/addtag.html @@ -1,26 +1,25 @@ - - - - - \ No newline at end of file +{% extends "base.html" %} +{% block customscript %} + +{% endblock %} diff --git a/Website/templates/adduser.html b/Website/templates/adduser.html index 7368ebe..1d2c97a 100644 --- a/Website/templates/adduser.html +++ b/Website/templates/adduser.html @@ -1,8 +1,10 @@ - - -user and tag list | Documentation
--
- - \ No newline at end of file +{% extends "base.html" %} +{% block title %} +add user +{% endblock %} +{% block content %} + + +{% endblock %} diff --git a/Website/templates/base.html b/Website/templates/base.html index 0925b8d..213308a 100644 --- a/Website/templates/base.html +++ b/Website/templates/base.html @@ -1,17 +1,29 @@ - -