aboutsummaryrefslogtreecommitdiff
path: root/app/__init__.py
diff options
context:
space:
mode:
authorKaran Jayachandra <mail@karanjayachandra.com>2025-07-14 20:16:07 +0200
committerKaran Jayachandra <mail@karanjayachandra.com>2025-07-14 20:16:07 +0200
commitb73e8f510f1b3a13d942e1ad42c8a04401eb6b8c (patch)
tree26612c20e03adb3cb26c36f36d31576f3c77dc1c /app/__init__.py
parent072d546490ba6cd4422cbc9cd6644b455f58fd46 (diff)
parent895ed4be433a4159250b276bd99f574c9c39c98e (diff)
Merge branch 'develop' into 'main'3.0
Develop See merge request KaranJayachandra/match_up!17
Diffstat (limited to 'app/__init__.py')
-rw-r--r--app/__init__.py132
1 files changed, 130 insertions, 2 deletions
diff --git a/app/__init__.py b/app/__init__.py
index 2e0a8be..3d3b498 100644
--- a/app/__init__.py
+++ b/app/__init__.py
@@ -1,11 +1,139 @@
-from flask import Flask
+from pandas import read_csv
+from functools import wraps
from app.config import Config
from flask_migrate import Migrate
from flask_sqlalchemy import SQLAlchemy
+from flask_simplelogin import SimpleLogin
+from werkzeug.utils import secure_filename
+from flask_simplelogin import is_logged_in
+from flask import (
+ Flask,
+ render_template_string,
+ render_template,
+ request,
+ redirect,
+ url_for,
+ Response,
+ get_template_attribute,
+)
app = Flask(__name__)
app.config.from_object(Config)
db = SQLAlchemy(app)
migrate = Migrate(app, db)
+SimpleLogin(app)
-from app import routes
+
+from app.controller import Session # noqa: E402
+
+g = Session()
+
+
+@app.route("/", methods=["GET"])
+def home():
+ return render_template("index.j2", url_for=url_for)
+
+
+@app.route("/control", methods=["GET"])
+def get_controls():
+ return render_template("controls.j2", courts=g.courts.all())
+
+
+@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("/courts", methods=["GET"])
+def get_list_of_courts():
+ return render_template("courts.j2", courts=g.courts.all())
+
+
+@app.route("/propose", methods=["POST"])
+def get_random_games():
+ if not is_logged_in():
+ return redirect(url_for("login"))
+ 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():
+ if not is_logged_in():
+ return redirect(url_for("simplelogin.login"))
+ 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()}"
+ )
+
+def login_required(f):
+ @wraps(f)
+ def decorated_function(*args, **kwargs):
+ if not is_logged_in():
+ response = Response("User isn't logged in!")
+ response.headers["HX-Redirect"] = url_for("simplelogin.login")
+ return response
+ return f(*args, **kwargs)
+ return decorated_function
+
+@app.route("/reset", methods=["POST"])
+@login_required
+def reset_games():
+ return render_template("games.j2", games=g.reset(), title=f"Round: {g.round()}")
+
+
+@app.route("/player-toggle/<player_request>", methods=["POST"])
+@login_required
+def toggle_player(player_request):
+ id = int(player_request)
+ player = g.players.toggle(id)
+ button = get_template_attribute("macros.j2", "player_button")
+ return render_template_string("{{button(player)}}", player=player, button=button)
+
+
+@app.route("/reset_players", methods=["POST"])
+@login_required
+def reset_all_players():
+ g.players.reset()
+ return redirect(url_for("players"))
+
+
+@app.route("/update_players", methods=["POST"])
+@login_required
+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("All columns aren't available in the data.")
+ except: # noqa: E722
+ return response
+ g.players.update(data)
+ return redirect(url_for("players"))
+
+
+@app.route("/court-toggle/<court_number>", methods=["POST"])
+@login_required
+def toggle_court(court_number):
+ id = int(court_number)
+ court = g.courts.toggle(id)
+ button = get_template_attribute("macros.j2", "court_button")
+ return render_template_string("{{button(court)}}", court=court, button=button)