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("/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//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/", 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/", 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/", 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/", 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 ""