diff --git a/.gitignore b/.gitignore index bf6fab7..4a73e55 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ *.db +socket.io.js __pycache__/ logs/* venv/* @@ -9,5 +10,4 @@ flask_session/ /test/.pytest_cache/ /test/flask_session/ /Website/__pycache__/ -/Website/.pytest_cache/ -/.idea \ No newline at end of file +/Website/.pytest_cache/ \ No newline at end of file diff --git a/README b/README index e86ae96..7886119 100644 --- a/README +++ b/README @@ -5,6 +5,8 @@ How to get started: source venv/bin/activate install requiremens: pip install -r requirements.txt + create the log folder: + mkdir logs start the program: - 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 + python main.py + You can now accses the Website on http://127.0.0.1:5000 \ No newline at end of file diff --git a/Website/__init__.py b/Website/__init__.py index ddaa1ca..856b26a 100644 --- a/Website/__init__.py +++ b/Website/__init__.py @@ -1,21 +1,27 @@ import queue, time, uuid, json, logging, datetime, os -from flask import Flask, render_template, render_template_string, request, make_response, session, send_file, g +from flask import Flask, render_template, request, make_response, session, send_file, g from flask_socketio import SocketIO, join_room, leave_room from flask_session import Session -from Website.db import get_db -import Website.db as db_handler +from markupsafe import escape +from .db import get_db from datetime import datetime finished = None -preis = -150 #Ein Getraenk + #flask_config DATABASE = './Website/mate.db' -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_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 create_app(test_config=None): app = Flask(__name__) @@ -24,15 +30,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) @@ -42,32 +48,32 @@ def create_app(test_config=None): # db = getattr(g, '_database', None) # if db is not None: # db.close() - # appt.logger.info("Website exited") + # app.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 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('/socket.io.js') + #def socketiojs(): + # return url_for('static', filename='socket.io.js') @app.route("/") def index(): - return render_template("index.html") + 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 @app.route("/list/user", methods=['GET']) def user_info(): @@ -133,18 +117,41 @@ def create_app(test_config=None): c = db.cursor() id = request.args.get("id") c.execute(f"SELECT * FROM users WHERE id=?", [id]) - user = c.fetchone() - if user != None : + user_list = c.fetchall() + if user_list != []: + user = user_list[0] c.execute(f"SELECT * FROM tags WHERE userid={user[0]}") tags = c.fetchall() - return render_template("user.html", user=user, tags=tags, min_value=-50000) - + 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' else: return render_template("error.html", error_code="043") @@ -170,11 +181,20 @@ 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() == []: - db_handler.add_user(username) + c.execute("INSERT or IGNORE INTO users (username, balance) VALUES (?, 0)", [username]) + db.commit() socketio.emit("update", "update") c.execute(f"SELECT * FROM users WHERE username=?", [username]) user = c.fetchone() - return render_template("redirect.html") + log(type="adduser", userid=user[0], after=user[1]) + return """ + + +tag was sucsesfully added
+ + """ else: return render_template("error.html", error_code="757") @@ -185,16 +205,27 @@ def create_app(test_config=None): c = db.cursor() try: user_id = request.form["id"] - change = int(float(request.form["change"]) * float(100)) + change = float(request.form["change"]) + print(change) 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] - db_handler.change_balance(user_id, change) + 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]) socketio.emit("update", "update") - return render_template("redirect.html") + return """ + + + + """ else: return render_template("error.html", error_code="043") @@ -254,9 +285,17 @@ 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 != []: - db_handler.remove_tag(tag_id) + c.execute(f"DELETE FROM tags WHERE (tagid = ? AND userid = ?)", [tag_id, user_id]) + db.commit() message = f"Removed {tag_id} from user {user_id}" - return render_template("redirect.html") + log(type="removetag", userid=user_id, before=tag_id) + return f""" + + + + """ else: return render_template("error.html", error_code="054") @@ -287,75 +326,44 @@ def create_app(test_config=None): socketio.emit("error", "418", to=session[id]) leave_room(session[id]) - @app.route("/transfare") - def transfare(): - db = get_db() - c = db.cursor() - c.execute("SELECT * FROM users") - user_list = c.fetchall() - 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']) + #api + @app.route("/api/change", methods=['GET', 'POST']) 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=['POST']) - def get_id(): 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]) + 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"})) + + + @app.route("/api/tag_id", methods=['GET', 'POST']) + def get_id(): global finished global message + db = get_db() + c = db.cursor() try: tag_id = request.form["id"] except: - return make_response(json.dumps({"mode":"error", "error":"638"})) + tag_id = request.args.get("id") c.execute(f"SELECT * FROM tags WHERE tagid=?", [tag_id]) tag_list = c.fetchall() @@ -375,16 +383,20 @@ def create_app(test_config=None): finished = queue_item return make_response(json.dumps({"mode":"error","error":"170"})) else: - db_handler.add_tag(user_id, tag_id) + c.execute(f"INSERT OR IGNORE INTO tags (tagid, userid) VALUES ({tag_id}, ?)", [user_id]) + db.commit() 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: @@ -402,9 +414,11 @@ def create_app(test_config=None): if user_list != []: balance_old = user_list[0][2] if user_queue.qsize() == 0: - db_handler.change_balance(tag[1], preis) + c.execute(f"UPDATE users SET balance = balance - 150 WHERE id={tag[1]}") + db.commit() 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: @@ -412,35 +426,9 @@ 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} + return {"app":app,"socketio":socketio} \ No newline at end of file diff --git a/Website/db.py b/Website/db.py index c0fedc0..a805a88 100644 --- a/Website/db.py +++ b/Website/db.py @@ -1,58 +1,9 @@ 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 new file mode 100644 index 0000000..d20b9a5 --- /dev/null +++ b/Website/mate.db.sql.txt @@ -0,0 +1,14 @@ +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 ed0bd96..56a152e 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" ( - "type" TEXT NOT NULL, - "user_id" INTEGER, - "before" TEXT, - "after" TEXT, - "change" INTEGER + "timestamp" INTEGER NOT NULL, + "userid" INTEGER NOT NULL, + "type" TEXT NOT NULL, + "before" TEXT, + "after" TEXT ); -COMMIT; +COMMIT; \ No newline at end of file diff --git a/Website/templates/addtag.html b/Website/templates/addtag.html index 4d564ae..98b5c17 100644 --- a/Website/templates/addtag.html +++ b/Website/templates/addtag.html @@ -1,25 +1,26 @@ -{% extends "base.html" %} -{% block customscript %} - -{% endblock %} + + + + + \ No newline at end of file diff --git a/Website/templates/adduser.html b/Website/templates/adduser.html index 1d2c97a..7368ebe 100644 --- a/Website/templates/adduser.html +++ b/Website/templates/adduser.html @@ -1,10 +1,8 @@ -{% extends "base.html" %} -{% block title %} -add user -{% endblock %} -{% block content %} - - -{% endblock %} + + +user and tag list | Documentation
++
+ + \ No newline at end of file diff --git a/Website/templates/base.html b/Website/templates/base.html index 213308a..0925b8d 100644 --- a/Website/templates/base.html +++ b/Website/templates/base.html @@ -1,29 +1,17 @@ - -