diff options
Diffstat (limited to 'app/routes.py')
| -rw-r--r-- | app/routes.py | 121 |
1 files changed, 121 insertions, 0 deletions
diff --git a/app/routes.py b/app/routes.py new file mode 100644 index 0000000..ce9b714 --- /dev/null +++ b/app/routes.py @@ -0,0 +1,121 @@ +from app import app +from pandas import read_csv +from app.forms import LoginForm +from app.controller import Session +from werkzeug.utils import secure_filename +from flask import ( + render_template, + request, + url_for, + Response, + flash, + redirect, + get_template_attribute, +) +from flask import render_template_string as render_string + +g = Session() + + +@app.route("/", methods=["GET"]) +def home(): + return render_template("index.j2", url_for=url_for) + + +@app.route("/login", methods=["GET", "POST"]) +def login(): + form = LoginForm() + if form.validate_on_submit(): + flash(f"User {form.username} is requesting to login.") + return redirect("/") + return render_template("login.j2", form=form) + + +@app.route("/control", methods=["GET"]) +def get_controls(): + return render_template("controls.j2", courts=g.courts.all()) + + +@app.route("/propose", methods=["POST"]) +def get_random_games(): + g.levels = int(request.form["levels"].split()[0]) + g.teams = request.form["team"] == "Teams" + return render_template("games.j2", games=g.propose(), title="Proposal") + + +@app.route("/confirm", methods=["POST"]) +def confirm_games(): + return render_template("games.j2", games=g.confirm(), title=f"Round: {g.round()}") + + +@app.route("/clear", methods=["POST"]) +def clear_games(): + return render_template( + "games.j2", games=g.current_round(), title=f"Round: {g.round()}" + ) + + +@app.route("/reset", methods=["POST"]) +def reset_games(): + return render_template("games.j2", games=g.reset(), title=f"Round: {g.round()}") + + +@app.route("/player-toggle/<player_request>", methods=["POST"]) +def toggle_player(player_request): + id = int(player_request) + player = g.players.toggle(id) + button = get_template_attribute("macros.j2", "player_button") + return render_string("{{button(player)}}", player=player, button=button) + + +@app.route("/players", methods=["GET"]) +def get_list_of_players(): + return render_template( + "players.j2", + regulars=g.players.regulars(), + guests=g.players.guests(), + url_for=url_for, + ) + + +@app.route("/reset_players", methods=["POST"]) +def reset_all_players(): + g.players.reset() + response = Response("Players reset!") + response.headers["HX-Refresh"] = "true" + return response + +@app.route("/update_players", methods=["POST"]) +def update_all_players(): + file = request.files.get("players") + response = Response("File name or data has issues!", 400) + response.headers["HX-Refresh"] = "true" + if file is None: + return response + elif file.filename is None: + return response + file_name = secure_filename(file.filename) + try: + data = read_csv(file_name) + required_columns = ["id","first_name","last_name","level","team"] + if not all([item in data.columns for item in required_columns]): + raise ImportError(f"All columns aren't available in the data.") + except: + return response + g.players.update(data) + response = Response("Players updated!") + response.headers["HX-Refresh"] = "true" + return response + + +@app.route("/court-toggle/<court_number>", methods=["POST"]) +def toggle_court(court_number): + id = int(court_number) + status = g.courts.toggle(id) + button = get_template_attribute("macros.j2", "court_button") + return render_string("{{button(id, status)}}", id=id, status=status, button=button) + + +@app.route("/courts", methods=["GET"]) +def get_list_of_courts(): + return render_template("courts.j2", courts=g.courts.all()) |
