When a day with a workout is selected a workout overview is rendered

This commit is contained in:
Peter Stockings
2023-10-13 22:15:37 +11:00
parent 9b0d37fa6a
commit 797fc19a75
4 changed files with 187 additions and 45 deletions

101
app.py
View File

@@ -293,6 +293,14 @@ def workout_list(user_id):
return render_template('partials/workouts_list_fragment.html', workouts=workouts, user_id=user_id, workouts_all_loaded=True)
@ app.route("/user/<int:user_id>/workout/<int:workout_id>/calendar_view", methods=['GET'])
def calendar_workout_view(user_id, workout_id):
workout = Workout.query.filter_by(user_id=user_id, id=workout_id).first()
user = User.query.get(user_id)
workout_view_data = get_workout_view_data(workout, user)
return render_template('partials/selected_workout_view.html', workout=workout_view_data, user_id=user_id)
def render_users_and_workouts():
users = User.query.all()
users_data = []
@@ -369,52 +377,59 @@ def get_workouts_for_user(user_id, max_date=None):
Workout.created_at.desc()).all()
for workout in workouts:
duration = timedelta(
seconds=int(workout.duration)) if workout.duration else timedelta(seconds=0)
average_rpm = workout.average_rpm if workout.average_rpm else 0
min_rpm = workout.min_rpm if workout.min_rpm else 0
max_rpm = workout.max_rpm if workout.max_rpm else 0
calories = workout.calories if workout.calories else 0
distance = workout.distance if workout.distance else 0
average_bpm = workout.average_bpm if workout.average_bpm else 0
min_bpm = workout.min_bpm if workout.min_bpm else 0
max_bpm = workout.max_bpm if workout.max_bpm else 0
is_heart_rate_available = workout.is_heart_rate_available
is_cadence_available = workout.is_cadence_available
start_time = workout.started_at
selected_graph_types = ['speed']
if is_heart_rate_available:
selected_graph_types.append('heart_rate')
if is_cadence_available or is_heart_rate_available:
workouts_data.append({
'id': workout.id,
'user_id': user_id,
'user_name': user.name,
'start_time': format_date_with_ordinal(start_time, '%#H:%M %B %dth %Y'),
'start_time_date': start_time,
'start_time_ago': humanize.naturaltime(start_time),
'duration': humanize.naturaldelta(duration),
'duration_minutes': duration.total_seconds() / 60,
'average_rpm': int(average_rpm),
'min_rpm': int(min_rpm),
'max_rpm': int(max_rpm),
'calories': int(calories),
'distance': int(distance),
'bike_display_name': workout.bike.display_name,
'selected_graph_types': selected_graph_types,
'is_heart_rate_available': is_heart_rate_available,
'is_cadence_available': is_cadence_available,
'average_bpm': int(average_bpm),
'min_bpm': int(min_bpm),
'max_bpm': int(max_bpm),
})
workout_data = get_workout_view_data(workout, user)
if workout_data:
workouts_data.append(workout_data)
return workouts_data
def get_workout_view_data(workout, user):
duration = timedelta(
seconds=int(workout.duration)) if workout.duration else timedelta(seconds=0)
average_rpm = workout.average_rpm if workout.average_rpm else 0
min_rpm = workout.min_rpm if workout.min_rpm else 0
max_rpm = workout.max_rpm if workout.max_rpm else 0
calories = workout.calories if workout.calories else 0
distance = workout.distance if workout.distance else 0
average_bpm = workout.average_bpm if workout.average_bpm else 0
min_bpm = workout.min_bpm if workout.min_bpm else 0
max_bpm = workout.max_bpm if workout.max_bpm else 0
is_heart_rate_available = workout.is_heart_rate_available
is_cadence_available = workout.is_cadence_available
start_time = workout.started_at
selected_graph_types = ['speed']
if is_heart_rate_available:
selected_graph_types.append('heart_rate')
if is_cadence_available or is_heart_rate_available:
return {
'id': workout.id,
'user_id': user.id,
'user_name': user.name,
'start_time': format_date_with_ordinal(start_time, '%#H:%M %B %dth %Y'),
'start_time_date': start_time,
'start_time_ago': humanize.naturaltime(start_time),
'duration': humanize.naturaldelta(duration),
'duration_minutes': duration.total_seconds() / 60,
'average_rpm': int(average_rpm),
'min_rpm': int(min_rpm),
'max_rpm': int(max_rpm),
'calories': int(calories),
'distance': int(distance),
'bike_display_name': workout.bike.display_name,
'selected_graph_types': selected_graph_types,
'is_heart_rate_available': is_heart_rate_available,
'is_cadence_available': is_cadence_available,
'average_bpm': int(average_bpm),
'min_bpm': int(min_bpm),
'max_bpm': int(max_bpm),
}
else:
return None
def create_graph(x_values, y_values, y_label, filename, x_label='Time'):
fig, ax = plt.subplots()
ax.plot(x_values, y_values)
@@ -471,7 +486,7 @@ def generate_calendar_monthly_view(workouts, selected_date):
timedelta(days=start[first_day_of_month.weekday()])
end = dict([(6, 6), (0, 5), (1, 4),
(2, 3), (3, 2), (4, 1), (5, 0)])
(2, 3), (3, 2), (4, 1), (5, 0)])
end_date = last_day_of_month + \
timedelta(days=end[last_day_of_month.weekday()])