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:
85
features/stats.py
Normal file
85
features/stats.py
Normal 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
|
||||
Reference in New Issue
Block a user