feat: assign tags to exercises and show muscle distribution of workout

This commit is contained in:
Peter Stockings
2026-01-30 23:53:04 +11:00
parent 78f4a53c49
commit d03581bff4
10 changed files with 278 additions and 60 deletions

60
app.py
View File

@@ -1,7 +1,7 @@
from datetime import date
import os
from flask import Flask, abort, render_template, redirect, request, url_for
from flask_login import LoginManager, login_required
from flask_login import LoginManager, login_required, current_user
import jinja_partials
from jinja2_fragments import render_block
from decorators import (validate_person, validate_topset, validate_workout,
@@ -200,27 +200,57 @@ def get_person_name(person_id):
@ app.route("/exercise", methods=['POST'])
def create_exercise():
name = request.form.get("name")
new_exercise_id = db.create_exercise(name)
return render_template('partials/exercise.html', exercise_id=new_exercise_id, name=name)
attribute_ids = request.form.getlist('attribute_ids')
exercise = db.create_exercise(name, attribute_ids)
return render_template('partials/exercise.html',
exercise_id=exercise['exercise_id'],
name=exercise['name'],
attributes=exercise['attributes'])
@ app.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)
return render_template('partials/exercise.html',
exercise_id=exercise_id,
name=exercise['name'],
attributes=exercise['attributes'])
@ app.route("/exercise/<int:exercise_id>/edit_form", methods=['GET'])
def get_exercise_edit_form(exercise_id):
exercise = db.get_exercise(exercise_id)
return render_template('partials/exercise.html', exercise_id=exercise_id, name=exercise['name'], is_edit=True)
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/<int:exercise_id>/update", methods=['PUT'])
def update_exercise(exercise_id):
new_name = request.form.get('name')
db.update_exercise(exercise_id, new_name)
return render_template('partials/exercise.html', exercise_id=exercise_id, name=new_name)
attribute_ids = request.form.getlist('attribute_ids')
exercise = db.update_exercise(exercise_id, new_name, attribute_ids)
return render_template('partials/exercise.html',
exercise_id=exercise_id,
name=exercise['name'],
attributes=exercise['attributes'])
""" @ app.route("/exercise/<int:exercise_id>/delete", methods=['DELETE'])
@@ -230,12 +260,24 @@ def delete_exercise(exercise_id):
@ app.route("/settings")
@ login_required
def settings():
# check if user is admin
if current_user.id != 1007:
return redirect(url_for('dashboard'))
people = db.get_people()
exercises = db.get_all_exercises()
all_attributes = db.exercises.get_attributes_by_category()
# Format options for custom_select
formatted_options = {}
for cat, attrs in all_attributes.items():
formatted_options[cat] = [{"id": a['attribute_id'], "name": a['name']} for a in attrs]
if htmx:
return render_block(app.jinja_env, "settings.html", "content", people=people, exercises=exercises), 200, {"HX-Trigger": "updatedPeople"}
return render_template('settings.html', people=people, exercises=exercises)
return render_block(app.jinja_env, "settings.html", "content",
people=people, exercises=exercises, all_attributes=formatted_options), 200, {"HX-Trigger": "updatedPeople"}
return render_template('settings.html', people=people, exercises=exercises, all_attributes=formatted_options)
# Routes moved to routes/tags.py blueprint