diff --git a/app.py b/app.py index aa3e318..b5d3491 100644 --- a/app.py +++ b/app.py @@ -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()