Minor refactor to person list view, still need to combine filter logic and move to service

This commit is contained in:
Peter Stockings
2023-08-08 21:35:36 +10:00
parent ffbe8ca7c2
commit 2cbd6808a4

92
app.py
View File

@@ -11,6 +11,7 @@ from utils import flatten, get_date_info, get_people_and_exercise_rep_maxes, con
from flask_htmx import HTMX from flask_htmx import HTMX
import minify_html import minify_html
from urllib.parse import urlparse, unquote, quote from urllib.parse import urlparse, unquote, quote
import random
app = Flask(__name__) app = Flask(__name__)
app.config.from_pyfile('config.py') app.config.from_pyfile('config.py')
@@ -79,63 +80,66 @@ def get_person(person_id):
(min_date, max_date) = get_earliest_and_latest_workout_date(person) (min_date, max_date) = get_earliest_and_latest_workout_date(person)
min_date = convert_str_to_date(request.args.get( min_date = request.args.get(
'min_date'), '%Y-%m-%d') or min_date 'min_date', default=min_date, type=convert_str_to_date)
max_date = convert_str_to_date(request.args.get( max_date = request.args.get(
'max_date'), '%Y-%m-%d') or max_date 'max_date', default=max_date, type=convert_str_to_date)
graph_axis = request.args.getlist('graph_axis') or [] graph_axis = request.args.getlist('graph_axis')
selected_exercise_ids = request.args.getlist('exercise_id', type=int)
all_exercise_ids_for_person = [e['ExerciseId']
for e in person['Exercises']]
selected_exercise_ids = [int(i)
for i in request.args.getlist('exercise_id')]
if not selected_exercise_ids and htmx.trigger_name != 'exercise_id': if not selected_exercise_ids and htmx.trigger_name != 'exercise_id':
selected_exercise_ids = [e['ExerciseId'] for e in person['Exercises']] selected_exercise_ids = all_exercise_ids_for_person
person['Workouts'] = [filter_workout_topsets(workout, selected_exercise_ids) for workout in person['Workouts'] if person['Workouts'] = [filter_workout_topsets(workout, selected_exercise_ids) for workout in person['Workouts'] if
workout['StartDate'] <= max_date and workout['StartDate'] >= min_date] workout['StartDate'] <= max_date and workout['StartDate'] >= min_date]
active_exercise_ids = get_exercise_ids_from_workouts(person['Workouts'])
# Filter out workouts that dont contain any of the selected exercises # Filter out workouts that dont contain any of the selected exercises
person['Workouts'] = [workout for workout in person['Workouts'] if person['Workouts'] = [workout for workout in person['Workouts'] if
workout['TopSets']] workout['TopSets']]
filtered_exercises = filter( filtered_exercises = filter(
lambda e: e['ExerciseId'] in active_exercise_ids, person['Exercises']) lambda e: e['ExerciseId'] in selected_exercise_ids, person['Exercises'])
person['FilteredExercises'] = list(filtered_exercises) person['FilteredExercises'] = list(filtered_exercises)
# New feature to plot reps and weights over time if graph_axis:
topsets_with_start_date = flatten([(p['StartDate'], p['TopSets']) # New feature to plot reps and weights over time
for p in person['Workouts']]) topsets_with_start_date = flatten([(p['StartDate'], p['TopSets'])
topsets = flatten([[{**t, 'StartDate': start_date} for t in topsets] for p in person['Workouts']])
for (start_date, topsets) in topsets_with_start_date]) topsets = flatten([[{**t, 'StartDate': start_date} for t in topsets]
for (start_date, topsets) in topsets_with_start_date])
exercise_graph_view_models = [] exercise_graph_view_models = []
for exercise_id in active_exercise_ids: for exercise_id in selected_exercise_ids:
topsets_for_exercise = [ topsets_for_exercise = [
t for t in topsets if t['ExerciseId'] == exercise_id] t for t in topsets if t['ExerciseId'] == exercise_id]
if topsets_for_exercise: if topsets_for_exercise:
repitions = [t['Repetitions'] for t in topsets_for_exercise] repitions = [t['Repetitions'] for t in topsets_for_exercise]
weights = [t['Weight'] for t in topsets_for_exercise] weights = [t['Weight'] for t in topsets_for_exercise]
estimated_one_rep_max = [t['Estimated1RM'] estimated_one_rep_max = [t['Estimated1RM']
for t in topsets_for_exercise] for t in topsets_for_exercise]
start_dates = [t['StartDate'].strftime( start_dates = [t['StartDate'].strftime(
"%Y-%m-%d") for t in topsets_for_exercise] "%Y-%m-%d") for t in topsets_for_exercise]
exercise_view_model = { exercise_view_model = {
'ExerciseId': exercise_id, 'ExerciseId': exercise_id,
'ExerciseName': topsets_for_exercise[0]['ExerciseName'], 'ExerciseName': topsets_for_exercise[0]['ExerciseName'],
'Repetitions': repitions[::-1], 'Repetitions': repitions[::-1],
'Weights': weights[::-1], 'Weights': weights[::-1],
'Estimated1RM': estimated_one_rep_max[::-1], 'Estimated1RM': estimated_one_rep_max[::-1],
'StartDates': start_dates[::-1] 'StartDates': start_dates[::-1]
} }
exercise_graph_view_models.append(exercise_view_model) exercise_graph_view_models.append(exercise_view_model)
person['ExerciseGraphs'] = exercise_graph_view_models person['ExerciseGraphs'] = exercise_graph_view_models
else:
person['ExerciseGraphs'] = []
if htmx: if htmx:
return render_block(app.jinja_env, 'person.html', 'content', person=person, selected_exercise_ids=active_exercise_ids, max_date=max_date, min_date=min_date, tags=tags, graph_axis=graph_axis), 200, {"HX-Trigger": "updatedPeople"} return render_block(app.jinja_env, 'person.html', 'content', person=person, selected_exercise_ids=selected_exercise_ids, max_date=max_date, min_date=min_date, tags=tags, graph_axis=graph_axis), 200, {"HX-Trigger": "updatedPeople"}
return render_template('person.html', person=person, selected_exercise_ids=active_exercise_ids, max_date=max_date, min_date=min_date, tags=tags, graph_axis=graph_axis), 200, {"HX-Trigger": "updatedPeople"} return render_template('person.html', person=person, selected_exercise_ids=selected_exercise_ids, max_date=max_date, min_date=min_date, tags=tags, graph_axis=graph_axis), 200, {"HX-Trigger": "updatedPeople"}
@ app.route("/person/<int:person_id>/calendar") @ app.route("/person/<int:person_id>/calendar")
@@ -400,6 +404,16 @@ def create_new_tag_for_workout(person_id, workout_id):
return render_template('partials/workout_tags_list.html', workout_tags=workout_tags) return render_template('partials/workout_tags_list.html', workout_tags=workout_tags)
# # TODO: Remove me, just for testing
# @ app.route("/sparkline", methods=['GET'])
# def get_sparkline():
# width = request.args.get('width', 400, type=int)
# height = request.args.get('height', 200, type=int)
# number_of_points = request.args.get('number_of_points', 50, type=int)
# points = [random.randint(1, 100) for _ in range(number_of_points)]
# return render_template('partials/sparkline.html', width=width, height=height, points=points)
@app.teardown_appcontext @app.teardown_appcontext
def closeConnection(exception): def closeConnection(exception):
db.close_connection() db.close_connection()