From 21750f35628c9dfa1584ed1e9942fd12501bf3cf Mon Sep 17 00:00:00 2001 From: Peter Stockings Date: Sat, 19 Nov 2022 13:32:44 +1100 Subject: [PATCH] Refactor stats into generic function --- app.py | 5 ++-- db.py | 4 +-- templates/index.html | 48 ++++-------------------------- templates/person.html | 39 +++---------------------- templates/workout.html | 2 +- utils.py | 66 ++++++++++++------------------------------ 6 files changed, 32 insertions(+), 132 deletions(-) diff --git a/app.py b/app.py index 715073f..e175738 100644 --- a/app.py +++ b/app.py @@ -2,7 +2,7 @@ import os from flask import Flask, render_template, redirect, request, url_for from decorators import validate_person, validate_topset, validate_workout from db import DataBase -from utils import get_people_and_exercise_rep_maxes, get_dashboard_stats +from utils import get_people_and_exercise_rep_maxes app = Flask(__name__) app.config.from_pyfile('config.py') @@ -15,8 +15,7 @@ def dashboard(): all_topsets = db.get_all_topsets() people_and_exercise_rep_maxes = get_people_and_exercise_rep_maxes( all_topsets) - stats = get_dashboard_stats(all_topsets) - return render_template('index.html', model=people_and_exercise_rep_maxes, stats=stats) + return render_template('index.html', model=people_and_exercise_rep_maxes) @ app.route("/person/") diff --git a/db.py b/db.py index 4576627..8124ec8 100644 --- a/db.py +++ b/db.py @@ -4,7 +4,7 @@ from psycopg2.extras import RealDictCursor from datetime import datetime from urllib.parse import urlparse -from utils import get_all_exercises_from_topsets, get_people_and_exercise_rep_maxes, get_workouts, get_person_stats +from utils import get_all_exercises_from_topsets, get_stats_from_topsets, get_workouts class DataBase(): @@ -149,7 +149,7 @@ class DataBase(): return { 'PersonId': next((t['PersonId'] for t in topsets), -1), 'PersonName': next((t['PersonName'] for t in topsets), 'Unknown'), - 'Stats': get_person_stats(topsets), + 'Stats': get_stats_from_topsets(topsets), 'Exercises': get_all_exercises_from_topsets(topsets), 'Workouts': get_workouts(topsets) } diff --git a/templates/index.html b/templates/index.html index 84eb1ea..a8d494d 100644 --- a/templates/index.html +++ b/templates/index.html @@ -14,7 +14,7 @@
- {% for p in model %} + {% for p in model['People'] %}
@@ -91,55 +91,17 @@
-
-
-
- {{ stats['TotalWorkouts'] - }} -

Total workouts tracked

-
-
-
+ {% for stat in model['Stats'] %}
{{ - stats['AverageWorkoutsPerWeek'] - }} -

Avg. weekly workouts

+ stat['Value'] }} +

{{ stat['Text'] }}

-
-
-
- {{ stats['NumberOfPeople'] - }} -

People tracked

-
-
-
- {% if stats['TotalWorkouts'] > 0 %} -
-
-
- {{ - stats['DaysSinceFirstWorkout'] - }} -

Days since first workout

-
-
-
-
-
-
- {{ stats['DaysSinceLastWorkout'] - }} -

Days since last workout

-
-
-
- {% endif %} + {% endfor %}
{% endblock %} \ No newline at end of file diff --git a/templates/person.html b/templates/person.html index 110dc3c..e2d0f0a 100644 --- a/templates/person.html +++ b/templates/person.html @@ -97,48 +97,17 @@
+ {% for stat in person['Stats'] %}
{{ - person['Stats']['NumberOfWorkouts'] }} -

Total workouts tracked

+ stat['Value'] }} +

{{ stat['Text'] }}

- -
-
-
- {{ - person['Stats']['TrainingDurationInDays'] }} -

Duration of workout tracking

-
-
-
- -
-
-
- {{ - person['Stats']['AverageWorkoutsPerWeek'] }} -

Average weekly workouts

-
-
-
- - {% if person['Stats']['NumberOfWorkouts'] > 0 %} -
-
-
- {{ - person['Stats']['DaysSinceLastWorkout'] }} -

Days since last workout

-
-
-
- {% endif %} - + {% endfor %}
{% endblock %} \ No newline at end of file diff --git a/templates/workout.html b/templates/workout.html index 28e9a3c..55a029a 100644 --- a/templates/workout.html +++ b/templates/workout.html @@ -29,7 +29,7 @@
diff --git a/utils.py b/utils.py index 6bba74a..a3c47ea 100644 --- a/utils.py +++ b/utils.py @@ -85,36 +85,10 @@ def get_people_and_exercise_rep_maxes(topsets): 'NumberOfWorkouts': len(list(set([t['WorkoutId'] for t in workouts_for_person if t['WorkoutId'] is not None]))), 'Exercises': get_rep_maxes_for_person(workouts_for_person) }) - return people + return {"People": people, "Stats": get_stats_from_topsets(topsets)} -def get_person_stats(topsets): - workout_start_dates = [datetime.strptime( - workout['StartDate'], '%Y-%m-%d') for workout in topsets if workout['StartDate'] is not None] - if not workout_start_dates: - return { - 'FirstWorkout': None, - 'LastWorkout': None, - 'NumberOfWorkouts': 0, - 'TrainingDurationInDays': 0, - 'AverageWorkoutsPerWeek': 0, - 'DaysSinceLastWorkout': None, - } - first_workout_date = min(workout_start_dates) - last_workout_date = max(workout_start_dates) - training_duration = last_workout_date - first_workout_date - no_of_workouts = len(list(set([t['WorkoutId'] for t in topsets]))) - return { - 'FirstWorkout': first_workout_date.strftime("%b %d %Y"), - 'LastWorkout': last_workout_date.strftime("%b %d %Y"), - 'NumberOfWorkouts': no_of_workouts, - 'TrainingDurationInDays': training_duration.days, - 'AverageWorkoutsPerWeek': round(no_of_workouts / (training_duration.days / 7), 2), - 'DaysSinceLastWorkout': (datetime.now() - last_workout_date).days, - } - - -def get_dashboard_stats(topsets): +def get_stats_from_topsets(topsets): workout_count = len(set([t['WorkoutId'] for t in topsets if t['WorkoutId'] is not None])) people_count = len(set([t['PersonId'] @@ -122,25 +96,21 @@ def get_dashboard_stats(topsets): workout_start_dates = [datetime.strptime( t['StartDate'], '%Y-%m-%d') for t in topsets if t['StartDate'] is not None] - if workout_count == 0: - return { - 'TotalWorkouts': workout_count, - 'NumberOfPeople': people_count, - 'DaysSinceLastWorkout': None, - 'AverageWorkoutsPerWeek': 0, - } + stats = [{"Text": "Total Workouts", "Value": workout_count}] + if people_count > 1: + stats.append({"Text": "Number of People", "Value": people_count}) + if workout_count > 0: + first_workout_date = min(workout_start_dates) + last_workout_date = max(workout_start_dates) + training_duration = last_workout_date - first_workout_date + average_workouts_per_week = round( + workout_count / (training_duration.days / 7), 2) + stats.append({"Text": "Days Since First Workout", "Value": ( + datetime.now() - first_workout_date).days}) + stats.append({"Text": "Days Since Last Workout", + "Value": ( + datetime.now() - last_workout_date).days}) + stats.append({"Text": "Average Workouts Per Week", + "Value": average_workouts_per_week}) - first_workout_date = min(workout_start_dates) - last_workout_date = max(workout_start_dates) - training_duration = last_workout_date - first_workout_date - average_workouts_per_week = round( - workout_count / (training_duration.days / 7), 2) - - stats = { - 'TotalWorkouts': workout_count, - 'NumberOfPeople': people_count, - 'DaysSinceFirstWorkout': (datetime.now() - first_workout_date).days, - 'DaysSinceLastWorkout': training_duration.days, - 'AverageWorkoutsPerWeek': average_workouts_per_week, - } return stats