diff --git a/app.py b/app.py index 383e894..b66b18c 100644 --- a/app.py +++ b/app.py @@ -22,6 +22,7 @@ from routes.endpoints import endpoints_bp # Import the new endpoints blueprint from routes.export import export_bp # Import the new export blueprint from routes.tags import tags_bp # Import the new tags blueprint from routes.programs import programs_bp # Import the new programs blueprint +from routes.exercises import exercises_bp # Import the new exercises blueprint from extensions import db from utils import convert_str_to_date from flask_htmx import HTMX @@ -71,6 +72,7 @@ app.register_blueprint(endpoints_bp) # Register the endpoints blueprint (prefix app.register_blueprint(export_bp) # Register the export blueprint (prefix defined in blueprint file) app.register_blueprint(tags_bp) # Register the tags blueprint (prefix defined in blueprint file) app.register_blueprint(programs_bp) # Register the programs blueprint (prefix defined in blueprint file) +app.register_blueprint(exercises_bp) # Register the exercises blueprint @app.after_request def response_minify(response): @@ -219,72 +221,8 @@ def get_person_name(person_id): return render_template('partials/person.html', person_id=person_id, name=name) -@ app.route("/exercise", methods=['POST']) -@login_required -def create_exercise(): - name = request.form.get("name") - attribute_ids = request.form.getlist('attribute_ids') - exercise = db.create_exercise(name, attribute_ids) - db.activityRequest.log(current_user.id, 'CREATE_EXERCISE', 'exercise', exercise['exercise_id'], f"Created exercise: {name}") - return render_template('partials/exercise.html', - exercise_id=exercise['exercise_id'], - name=exercise['name'], - attributes=exercise['attributes']) -@ app.route("/exercise/", methods=['GET']) -def get_exercise(exercise_id): - exercise = db.get_exercise(exercise_id) - return render_template('partials/exercise.html', - exercise_id=exercise_id, - name=exercise['name'], - attributes=exercise['attributes']) - - -@ app.route("/exercise//edit_form", methods=['GET']) -@login_required -def get_exercise_edit_form(exercise_id): - exercise = db.get_exercise(exercise_id) - all_attributes = db.exercises.get_attributes_by_category() - - # Format options for custom_select - formatted_options = {} - ex_attr_ids = [a['attribute_id'] for a in exercise['attributes']] - for cat, attrs in all_attributes.items(): - formatted_options[cat] = [ - { - "id": a['attribute_id'], - "name": a['name'], - "selected": a['attribute_id'] in ex_attr_ids - } for a in attrs - ] - - return render_template('partials/exercise.html', - exercise_id=exercise_id, - name=exercise['name'], - attributes=exercise['attributes'], - all_attributes=formatted_options, - is_edit=True) - - -@ app.route("/exercise//update", methods=['PUT']) -@login_required -def update_exercise(exercise_id): - new_name = request.form.get('name') - attribute_ids = request.form.getlist('attribute_ids') - exercise = db.update_exercise(exercise_id, new_name, attribute_ids) - db.activityRequest.log(current_user.id, 'UPDATE_EXERCISE', 'exercise', exercise_id, f"Updated exercise: {new_name}") - return render_template('partials/exercise.html', - exercise_id=exercise_id, - name=exercise['name'], - attributes=exercise['attributes']) - - -""" @ app.route("/exercise//delete", methods=['DELETE']) -def delete_exercise(exercise_id): - db.delete_exercise(exercise_id) - return "" """ - @ app.route("/settings") @ login_required @@ -364,41 +302,7 @@ def get_people_graphs(): return render_template('partials/people_graphs.html', graphs=graphs, refresh_url=request.full_path) -@app.route("/exercises/get") -def get_exercises(): - query = request.args.get('query') - person_id = request.args.get('person_id', type=int) - exercises = db.exercises.get(query) - return render_template('partials/exercise/exercise_dropdown.html', exercises=exercises, person_id=person_id) -@app.route("/exercise//edit_name", methods=['GET', 'POST']) -@login_required -def edit_exercise_name(exercise_id): - exercise = db.exercises.get_exercise(exercise_id) - person_id = request.args.get('person_id', type=int) - if request.method == 'GET': - return render_template('partials/exercise/edit_exercise_name.html', exercise=exercise, person_id=person_id) - else: - updated_name = request.form['name'] - updated_exercise = db.exercises.update_exercise_name(exercise_id, updated_name) - return render_template('partials/exercise/exercise_list_item.html', exercise=updated_exercise, person_id=person_id) - -@app.route("/exercises/add", methods=['POST']) -@login_required -def add_exercise(): - exercise_name = request.form['query'] - new_exercise = db.exercises.add_exercise(exercise_name) - person_id = request.args.get('person_id', type=int) - return render_template('partials/exercise/exercise_list_item.html', exercise=new_exercise, person_id=person_id) - -@ app.route("/exercise//delete", methods=['DELETE']) -@login_required -@admin_required -def delete_exercise(exercise_id): - exercise = db.get_exercise(exercise_id) - db.exercises.delete_exercise(exercise_id) - db.activityRequest.log(current_user.id, 'DELETE_EXERCISE', 'exercise', exercise_id, f"Deleted exercise: {exercise['name']}") - return "" @app.teardown_appcontext def closeConnection(exception): diff --git a/routes/auth.py b/routes/auth.py index 34af543..6dbebae 100644 --- a/routes/auth.py +++ b/routes/auth.py @@ -1,6 +1,6 @@ from flask import Blueprint, render_template, redirect, url_for, flash, request from werkzeug.security import generate_password_hash, check_password_hash -from flask_login import login_user, login_required, logout_user +from flask_login import login_user, login_required, logout_user, current_user from forms.login import LoginForm from forms.signup import SignupForm from extensions import db diff --git a/routes/exercises.py b/routes/exercises.py new file mode 100644 index 0000000..18fd1b6 --- /dev/null +++ b/routes/exercises.py @@ -0,0 +1,103 @@ +from flask import Blueprint, render_template, request, url_for +from flask_login import login_required, current_user +from extensions import db +from decorators import admin_required + +exercises_bp = Blueprint('exercises', __name__) + +@exercises_bp.route("/exercise", methods=['POST']) +@login_required +def create_exercise(): + name = request.form.get("name") + attribute_ids = request.form.getlist('attribute_ids') + exercise = db.create_exercise(name, attribute_ids) + db.activityRequest.log(current_user.id, 'CREATE_EXERCISE', 'exercise', exercise['exercise_id'], f"Created exercise: {name}") + return render_template('partials/exercise.html', + exercise_id=exercise['exercise_id'], + name=exercise['name'], + attributes=exercise['attributes']) + + +@exercises_bp.route("/exercise/", methods=['GET']) +def get_exercise(exercise_id): + exercise = db.get_exercise(exercise_id) + return render_template('partials/exercise.html', + exercise_id=exercise_id, + name=exercise['name'], + attributes=exercise['attributes']) + + +@exercises_bp.route("/exercise//edit_form", methods=['GET']) +@login_required +def get_exercise_edit_form(exercise_id): + exercise = db.get_exercise(exercise_id) + all_attributes = db.exercises.get_attributes_by_category() + + # Format options for custom_select + formatted_options = {} + ex_attr_ids = [a['attribute_id'] for a in exercise['attributes']] + for cat, attrs in all_attributes.items(): + formatted_options[cat] = [ + { + "id": a['attribute_id'], + "name": a['name'], + "selected": a['attribute_id'] in ex_attr_ids + } for a in attrs + ] + + return render_template('partials/exercise.html', + exercise_id=exercise_id, + name=exercise['name'], + attributes=exercise['attributes'], + all_attributes=formatted_options, + is_edit=True) + + +@exercises_bp.route("/exercise//update", methods=['PUT']) +@login_required +def update_exercise(exercise_id): + new_name = request.form.get('name') + attribute_ids = request.form.getlist('attribute_ids') + exercise = db.update_exercise(exercise_id, new_name, attribute_ids) + db.activityRequest.log(current_user.id, 'UPDATE_EXERCISE', 'exercise', exercise_id, f"Updated exercise: {new_name}") + return render_template('partials/exercise.html', + exercise_id=exercise_id, + name=exercise['name'], + attributes=exercise['attributes']) + + +@exercises_bp.route("/exercises/get") +def get_exercises(): + query = request.args.get('query') + person_id = request.args.get('person_id', type=int) + exercises = db.exercises.get(query) + return render_template('partials/exercise/exercise_dropdown.html', exercises=exercises, person_id=person_id) + +@exercises_bp.route("/exercise//edit_name", methods=['GET', 'POST']) +@login_required +def edit_exercise_name(exercise_id): + exercise = db.exercises.get_exercise(exercise_id) + person_id = request.args.get('person_id', type=int) + if request.method == 'GET': + return render_template('partials/exercise/edit_exercise_name.html', exercise=exercise, person_id=person_id) + else: + updated_name = request.form['name'] + updated_exercise = db.exercises.update_exercise_name(exercise_id, updated_name) + return render_template('partials/exercise/exercise_list_item.html', exercise=updated_exercise, person_id=person_id) + +@exercises_bp.route("/exercises/add", methods=['POST']) +@login_required +def add_exercise(): + exercise_name = request.form['query'] + new_exercise = db.exercises.add_exercise(exercise_name) + person_id = request.args.get('person_id', type=int) + return render_template('partials/exercise/exercise_list_item.html', exercise=new_exercise, person_id=person_id) + +@exercises_bp.route("/exercise//delete", methods=['DELETE']) +@login_required +@admin_required +def delete_exercise(exercise_id): + exercise = db.get_exercise(exercise_id) + db.exercises.delete_exercise(exercise_id) + db.activityRequest.log(current_user.id, 'DELETE_EXERCISE', 'exercise', exercise_id, f"Deleted exercise: {exercise['name']}") + return "" diff --git a/routes/workout.py b/routes/workout.py index 1c964c6..2f8bd00 100644 --- a/routes/workout.py +++ b/routes/workout.py @@ -216,7 +216,26 @@ def get_topset(person_id, workout_id, topset_id): def get_topset_edit_form(person_id, workout_id, topset_id): exercises = db.get_all_exercises() topset = db.get_topset(topset_id) - return render_template('partials/topset.html', person_id=person_id, workout_id=workout_id, topset_id=topset_id, exercises=exercises, exercise_id=topset.get('exercise_id'), exercise_name=topset.get('exercise_name'), repetitions=topset.get('repetitions'), weight=topset.get('weight'), is_edit=True) + + # Format exercises for custom_select + formatted_exercises = [ + { + "exercise_id": ex['exercise_id'], + "name": ex['name'], + "selected": ex['exercise_id'] == topset.get('exercise_id') + } for ex in exercises + ] + + return render_template('partials/topset.html', + person_id=person_id, + workout_id=workout_id, + topset_id=topset_id, + exercises=formatted_exercises, + exercise_id=topset.get('exercise_id'), + exercise_name=topset.get('exercise_name'), + repetitions=topset.get('repetitions'), + weight=topset.get('weight'), + is_edit=True) @workout_bp.route("/person//workout//topset", methods=['POST']) @login_required diff --git a/templates/partials/exercise.html b/templates/partials/exercise.html index f32ea22..ee4ee49 100644 --- a/templates/partials/exercise.html +++ b/templates/partials/exercise.html @@ -40,7 +40,7 @@ {% if is_edit|default(false, true) == false %} diff --git a/templates/partials/exercise/exercise_list_item.html b/templates/partials/exercise/exercise_list_item.html index cf76034..dff6469 100644 --- a/templates/partials/exercise/exercise_list_item.html +++ b/templates/partials/exercise/exercise_list_item.html @@ -5,7 +5,7 @@ {{ exercise.name }} - diff --git a/templates/partials/exercise/exercise_select.html b/templates/partials/exercise/exercise_select.html index 14518cf..a0fb7e6 100644 --- a/templates/partials/exercise/exercise_select.html +++ b/templates/partials/exercise/exercise_select.html @@ -2,7 +2,7 @@

Add New Exercise