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 ""