From 404bba9d518271533d5e4c83dabd8541726bf248 Mon Sep 17 00:00:00 2001 From: stilbruch Date: Sat, 23 Apr 2022 14:15:35 -0500 Subject: Move routes into seperate folder --- app/routes/__init__.py | 3 ++ app/routes/basic.py | 11 ++++++++ app/routes/user.py | 52 ++++++++++++++++++++++++++++++++++ app/routes/workout.py | 77 ++++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 143 insertions(+) create mode 100644 app/routes/__init__.py create mode 100644 app/routes/basic.py create mode 100644 app/routes/user.py create mode 100644 app/routes/workout.py (limited to 'app/routes') diff --git a/app/routes/__init__.py b/app/routes/__init__.py new file mode 100644 index 0000000..e243576 --- /dev/null +++ b/app/routes/__init__.py @@ -0,0 +1,3 @@ +from routes.user import * +from routes.workout import * +from routes.basic import * diff --git a/app/routes/basic.py b/app/routes/basic.py new file mode 100644 index 0000000..36f42f5 --- /dev/null +++ b/app/routes/basic.py @@ -0,0 +1,11 @@ +from app import app, db +from flask_login import login_required + +@app.route("/", methods=["GET"]) +def index(): + return render_template('index.html') + +@app.route("/home", methods=["GET"]) +@login_required +def home(): + return render_template('home.html') diff --git a/app/routes/user.py b/app/routes/user.py new file mode 100644 index 0000000..4568d97 --- /dev/null +++ b/app/routes/user.py @@ -0,0 +1,52 @@ +from app import app, db +from flask import render_template, redirect, request, url_for, flash +from flask_login import current_user, login_user, login_required, logout_user +from forms import LoginForm, RegisterForm +from tables import User + +@app.route("/login", methods=['GET', 'POST']) +def login(): + form = LoginForm() + username = form.username.data + password = form.password.data + + if form.validate_on_submit(): + # Valid submission + user = User.query.filter_by(username=username).first() + + # TODO: show user if login succeeded + if user and user.verify_password(password): + login_user(user) + return redirect(url_for('home')) + else: + flash("Invalid username or password", "danger") + + return render_template('user/login.html', form=form) + +@app.route("/logout", methods=['GET', 'POST']) +def logout(): + logout_user() + return redirect('/') + +@app.route("/register", methods=['GET', 'POST']) +def register(): + form = RegisterForm() + # Load data from form + username = form.username.data + password = form.password.data + email = form.email.data + + if form.validate_on_submit(): + # Valid submission + user = User.query.filter_by(username=username).first() + if not user: + # No user with this username + user = User(username, password, email) + db.session.add(user) + db.session.commit() + return redirect(url_for('login')) + else: + flash("User already exists", "danger") + + return render_template('user/register.html', form=form) + diff --git a/app/routes/workout.py b/app/routes/workout.py new file mode 100644 index 0000000..db8ab48 --- /dev/null +++ b/app/routes/workout.py @@ -0,0 +1,77 @@ +from app import app, db +from flask import render_template, redirect, request, url_for, flash +from flask_login import current_user, login_required +from forms import LoginForm, RegisterForm, WorkoutCreateForm +from tables import User, Workout + +@app.route("/workout/create", methods=['GET', 'POST']) +@login_required +def createWorkout(): + form = WorkoutCreateForm() + name = form.name.data + + if form.validate_on_submit(): + # Make sure the user doesn't already have a workout with this name + workout = Workout.query.filter_by(user_id=current_user.id, name=name).first() + if not workout: + # TODO: add exercises + workout = Workout(current_user, name, [e.data for e in form.exercises.entries]) + db.session.add(workout) + db.session.commit() + + return redirect(url_for('home')); + else: + flash("Workout with this name already exists", "danger") + + return render_template('workout/create.html', form=form, title="Create a Workout") + +@app.route("/workout/edit", methods=['GET', 'POST']) +@login_required +def editWorkout(): + # Id is required + if 'id' not in request.args: + return redirect(url_for('home')) + + # Validate Id + workout = Workout.query.filter_by(id=int(request.args['id']), user_id=current_user.id).first() + if not workout: + return redirect(url_for('home')) + + form = WorkoutCreateForm() + + if form.validate_on_submit(): + # Form has been submitted, write changes + + workout.name = form.name.data + # TODO: Add exercise changes + + # Write changes to database + db.session.commit() + return redirect(url_for('home')); + else: + form.name.data = workout.name + form.exercises.pop_entry() # TODO: better way to do this? + + for exercise in workout.exercises: + form.exercises.append_entry(exercise) + + return render_template('workout/create.html', form=form, title=f'Edit Workout "{workout.name}"') + +@app.route("/workout/record", methods=['GET']) +@login_required +def recordWorkout(): + # Id is required + if 'id' not in request.args: + return redirect(url_for('home')) + + # Matching workout required + workout = Workout.query.filter_by(id=int(request.args['id']), user_id=current_user.id).first() + if not workout: + return redirect(url_for('home')); + + return render_template('workout/record.html', workout=workout) + +@app.route("/workout/select", methods=['GET']) +@login_required +def selectWorkout(): + return render_template('workout/select.html') -- cgit v1.2.3 From 316edff9e6b90ab310978c10adbeffa87d18e746 Mon Sep 17 00:00:00 2001 From: stilbruch Date: Sat, 23 Apr 2022 14:26:59 -0500 Subject: Fix workout deleting option --- app/routes/__init__.py | 1 + app/routes/api.py | 17 +++++++++++++++++ app/routes/basic.py | 1 + app/routes/user.py | 1 + 4 files changed, 20 insertions(+) create mode 100644 app/routes/api.py (limited to 'app/routes') diff --git a/app/routes/__init__.py b/app/routes/__init__.py index e243576..09fcbf3 100644 --- a/app/routes/__init__.py +++ b/app/routes/__init__.py @@ -1,3 +1,4 @@ +from routes.api import * from routes.user import * from routes.workout import * from routes.basic import * diff --git a/app/routes/api.py b/app/routes/api.py new file mode 100644 index 0000000..58b4732 --- /dev/null +++ b/app/routes/api.py @@ -0,0 +1,17 @@ +from app import app, db +from flask import redirect, request +from flask_login import current_user, login_required +from tables import Workout + +@app.route("/api/workout/delete", methods=['GET']) +@login_required +def api_workout_delete(): + if 'id' not in request.args: + return redirect('/home'); + + workout = Workout.query.filter_by(id=int(request.args['id']), user_id=current_user.id).first() + if workout: + db.session.delete(workout) + db.session.commit() + + return redirect('/home') diff --git a/app/routes/basic.py b/app/routes/basic.py index 36f42f5..5883b97 100644 --- a/app/routes/basic.py +++ b/app/routes/basic.py @@ -1,4 +1,5 @@ from app import app, db +from flask import render_template from flask_login import login_required @app.route("/", methods=["GET"]) diff --git a/app/routes/user.py b/app/routes/user.py index 4568d97..d218738 100644 --- a/app/routes/user.py +++ b/app/routes/user.py @@ -24,6 +24,7 @@ def login(): return render_template('user/login.html', form=form) @app.route("/logout", methods=['GET', 'POST']) +@login_required def logout(): logout_user() return redirect('/') -- cgit v1.2.3 From 4f1e55112138a1f3b4be3bf23e3740ae3effac35 Mon Sep 17 00:00:00 2001 From: stilbruch Date: Sat, 23 Apr 2022 15:48:45 -0500 Subject: Add javascript to add sets while recording workout --- app/routes/workout.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'app/routes') diff --git a/app/routes/workout.py b/app/routes/workout.py index db8ab48..8615156 100644 --- a/app/routes/workout.py +++ b/app/routes/workout.py @@ -69,7 +69,7 @@ def recordWorkout(): if not workout: return redirect(url_for('home')); - return render_template('workout/record.html', workout=workout) + return render_template('workout/record.html', workout=workout, form=None) @app.route("/workout/select", methods=['GET']) @login_required -- cgit v1.2.3