Files
workout/routes/exercises.py
2026-02-08 16:48:47 +11:00

185 lines
8.6 KiB
Python

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/<int:exercise_id>", 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/<int:exercise_id>/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/<int:exercise_id>/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/<int:exercise_id>/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("/exercises/search")
@login_required
def search_exercises():
query = request.args.get('q', '')
exercises = db.exercises.get(query)
html = ""
for exercise in exercises:
html += render_template('partials/exercise.html',
exercise_id=exercise['exercise_id'],
name=exercise['name'],
attributes=exercise['attributes'])
return html
@exercises_bp.route("/exercise/<int:exercise_id>/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 ""
# Category Management Routes
@exercises_bp.route("/category", methods=['POST'])
@login_required
@admin_required
def create_category():
name = request.form.get("name")
category = db.exercises.add_category(name)
db.activityRequest.log(current_user.id, 'CREATE_CATEGORY', 'category', category['category_id'], f"Created attribute category: {name}")
return render_template('partials/exercise/category_admin.html', category_id=category['category_id'], name=category['name'], attributes=[])
@exercises_bp.route("/category/<int:category_id>", methods=['GET', 'PUT'])
@login_required
@admin_required
def update_category(category_id):
if request.method == 'GET':
category = db.exercises.execute('SELECT category_id, name FROM exercise_attribute_category WHERE category_id = %s', [category_id], one=True)
is_edit = request.args.get('is_edit') == 'true'
all_attrs = db.exercises.execute('SELECT attribute_id, name FROM exercise_attribute WHERE category_id = %s', [category_id])
return render_template('partials/exercise/category_admin.html', category_id=category_id, name=category['name'], attributes=all_attrs, is_edit=is_edit)
name = request.form.get("name")
category = db.exercises.update_category(category_id, name)
db.activityRequest.log(current_user.id, 'UPDATE_CATEGORY', 'category', category_id, f"Updated attribute category: {name}")
all_attrs = db.exercises.execute('SELECT attribute_id, name FROM exercise_attribute WHERE category_id = %s', [category_id])
return render_template('partials/exercise/category_admin.html', category_id=category_id, name=name, attributes=all_attrs)
@exercises_bp.route("/category/<int:category_id>", methods=['DELETE'])
@login_required
@admin_required
def delete_category(category_id):
db.exercises.delete_category(category_id)
db.activityRequest.log(current_user.id, 'DELETE_CATEGORY', 'category', category_id, f"Deleted attribute category")
return ""
# Attribute Management Routes
@exercises_bp.route("/attribute", methods=['POST'])
@login_required
@admin_required
def create_attribute():
name = request.form.get("name")
category_id = request.form.get("category_id", type=int)
attribute = db.exercises.add_attribute(name, category_id)
db.activityRequest.log(current_user.id, 'CREATE_ATTRIBUTE', 'attribute', attribute['attribute_id'], f"Created attribute: {name}")
return render_template('partials/exercise/attribute_admin.html', attribute=attribute)
@exercises_bp.route("/attribute/<int:attribute_id>", methods=['GET', 'PUT'])
@login_required
@admin_required
def update_attribute(attribute_id):
if request.method == 'GET':
attribute = db.exercises.execute('SELECT attribute_id, name, category_id FROM exercise_attribute WHERE attribute_id = %s', [attribute_id], one=True)
is_edit = request.args.get('is_edit') == 'true'
return render_template('partials/exercise/attribute_admin.html', attribute=attribute, is_edit=is_edit)
name = request.form.get("name")
attribute = db.exercises.update_attribute(attribute_id, name)
db.activityRequest.log(current_user.id, 'UPDATE_ATTRIBUTE', 'attribute', attribute_id, f"Updated attribute: {name}")
return render_template('partials/exercise/attribute_admin.html', attribute=attribute)
@exercises_bp.route("/attribute/<int:attribute_id>", methods=['DELETE'])
@login_required
@admin_required
def delete_attribute(attribute_id):
db.exercises.delete_attribute(attribute_id)
db.activityRequest.log(current_user.id, 'DELETE_ATTRIBUTE', 'attribute', attribute_id, "Deleted attribute")
return ""