Refactor calendar (month and year view), switching to vertical slice arch. Also in progress of refactoring of stats so they are retreived after inital page load for performance sake

This commit is contained in:
Peter Stockings
2024-04-11 13:45:38 +10:00
parent 76789a4934
commit 63d997a3f1
7 changed files with 302 additions and 133 deletions

85
features/stats.py Normal file
View File

@@ -0,0 +1,85 @@
from collections import Counter
from datetime import date
class Stats:
def __init__(self, db_connection_method):
self.execute = db_connection_method
def get_stats_from_topsets(self, topsets):
if not topsets:
return []
# Extracting necessary fields
workout_ids = [t['WorkoutId'] for t in topsets if t['WorkoutId']]
person_ids = [t['PersonId'] for t in topsets if t['PersonId']]
start_dates = [t['StartDate'] for t in topsets if t['StartDate']]
workout_count = len(set(workout_ids))
people_count = len(set(person_ids))
total_sets = len(topsets)
stats = [
{"Text": "Total Workouts", "Value": workout_count},
{"Text": "Total Sets", "Value": total_sets}
]
if people_count > 1:
stats.append({"Text": "People tracked", "Value": people_count})
if workout_count > 0:
first_workout_date = min(start_dates)
last_workout_date = max(start_dates)
current_date = date.today()
stats.append({"Text": "Days Since First Workout",
"Value": (current_date - first_workout_date).days})
if workout_count >= 2:
stats.append({"Text": "Days Since Last Workout",
"Value": (current_date - last_workout_date).days})
average_sets_per_workout = round(total_sets / workout_count, 1)
stats.append({"Text": "Average sets per workout",
"Value": average_sets_per_workout})
training_duration = last_workout_date - first_workout_date
if training_duration.days > 0:
average_workouts_per_week = round(
workout_count / (training_duration.days / 7), 1)
stats.append({"Text": "Average Workouts Per Week",
"Value": average_workouts_per_week})
return stats
def fetch_stats_for_person(self, person_id):
query = """
SELECT
t.workout_id AS "WorkoutId",
w.person_id AS "PersonId",
w.start_date AS "StartDate"
FROM
topset t
JOIN workout w ON t.workout_id = w.workout_id
JOIN person p ON w.person_id = p.person_id
WHERE p.person_id = %s
"""
workouts_data = self.execute(query, [person_id])
person_stats = self.get_stats_from_topsets(workouts_data)
return person_stats
def fetch_all_stats(self):
query = """
SELECT
t.workout_id AS "WorkoutId",
w.person_id AS "PersonId",
w.start_date AS "StartDate"
FROM
topset t
JOIN workout w ON t.workout_id = w.workout_id
JOIN person p ON w.person_id = p.person_id;
"""
workouts_data = self.execute(query, [])
person_stats = self.get_stats_from_topsets(workouts_data)
return person_stats