Refactor render user and workouts function

This commit is contained in:
Peter Stockings
2023-10-19 21:12:00 +11:00
parent b60f1a2445
commit 76eb290865

103
app.py
View File

@@ -313,66 +313,11 @@ def render_users_and_workouts():
'bike_id': user.bike_id,
'workouts_count': 0,
'workouts': [],
'workout_counts_by_week': 0,
'duration_by_week': 0
'daily_duration_sparkline': '',
'calendar_month': generate_calendar_monthly_view([], datetime.now().date())
}
users_data.append(user_data)
continue
workout_counts_by_week = []
duration_by_week = []
# get start date from last workout
start_date = workouts[-1]['start_time_date'].date()
# get end date from first workout
end_date = workouts[0]['start_time_date'].date()
# get difference in days between start and end date
num_days = (end_date - start_date).days + 1
# calculate number of weeks between start and end date
num_weeks = (end_date - start_date).days // 7 + 1
for i in range(num_weeks):
# Calculate the start and end of the current week
start = start_date + timedelta(days=7*i)
end = start + timedelta(days=6)
# Get the workouts for the current week
weekly_workouts = [w for w in workouts if start <=
w['start_time_date'].date() <= end]
# Calculate the workout counts and duration for the current week
workout_counts_by_week.append(len(weekly_workouts))
if weekly_workouts:
duration_by_week.append(
int(sum([int(w['duration_minutes']) for w in weekly_workouts]))/len(weekly_workouts))
workout_counts_sparkline = sparklines.sparklines(
workout_counts_by_week)
duration_sparkline = sparklines.sparklines(
[int(w['duration_minutes']) for w in workouts])[0]
# REFACTOR
def date_range(start_date, end_date):
delta = end_date - start_date
return [(start_date + timedelta(days=i)) for i in range(delta.days + 1)]
dates = date_range(start_date, end_date)
daily_duration = []
for date in dates:
# check if workout exists for date
workout = [w for w in workouts if w['start_time_date'].date()
== date]
if workout:
daily_duration.append(int(workout[0]['duration_minutes']))
else:
daily_duration.append(0)
# Reverse the daily duration list so that the most recent day is on the right
daily_duration.reverse()
daily_duration_sparkline = sparklines.sparklines(
daily_duration)[0]
# REFACTOR BOUNDARY
user_data = {
'id': user.id,
@@ -380,12 +325,7 @@ def render_users_and_workouts():
'bike_id': user.bike_id,
'workouts_count': len(workouts),
'workouts': workouts,
'workout_counts_by_week': workout_counts_by_week,
'duration_by_week': duration_by_week,
'num_days': num_days,
'workout_counts_sparkline': workout_counts_sparkline,
'duration_sparkline': duration_sparkline,
'daily_duration_sparkline': daily_duration_sparkline,
'daily_duration_sparkline': generate_daily_duration_sparkline(workouts),
'calendar_month': generate_calendar_monthly_view(workouts, datetime.now().date())
}
users_data.append(user_data)
@@ -560,6 +500,43 @@ def generate_calendar_monthly_view(workouts, selected_date):
return calendar_month
def date_range(start_date, end_date):
"""Return a list of dates between the given start and end dates (inclusive)."""
delta = end_date - start_date
return [(start_date + timedelta(days=i)) for i in range(delta.days + 1)]
def generate_daily_duration_sparkline(workouts):
"""
Generate a sparkline string representation of daily workout durations.
Parameters:
- workouts (list of dict): Each dict should contain 'start_time_date' and 'duration_minutes' keys.
Returns:
- str: Sparkline representation of daily durations.
"""
if not workouts:
return ''
# Determine date range based on workouts data
start_date = workouts[-1]['start_time_date'].date()
end_date = workouts[0]['start_time_date'].date()
dates_in_range = date_range(start_date, end_date)
# Build a mapping of dates to their respective durations for easier lookup
workouts_by_date = {w['start_time_date'].date(): int(
w['duration_minutes']) for w in workouts}
daily_durations = [workouts_by_date.get(
date, 0) for date in dates_in_range]
# Reverse the list to make the most recent day appear on the right
daily_durations.reverse()
return sparklines.sparklines(daily_durations)[0]
def toDate(dateString):
return datetime.strptime(dateString, "%Y-%m-%d").date()