From 27d3fbf68172d70cfc1884b305ad851c1d4c6d8d Mon Sep 17 00:00:00 2001 From: Peter Stockings Date: Sat, 29 Jul 2023 20:39:34 +1000 Subject: [PATCH] When a new workout is created, calculate and persist distance, calories, average, min, max rpm|bpm etc (Need to test this) --- app.py | 50 +++++++++++++++++++++++++++++++++----- templates/new_workout.html | 2 +- 2 files changed, 45 insertions(+), 7 deletions(-) diff --git a/app.py b/app.py index c07bfa8..ddc36a1 100644 --- a/app.py +++ b/app.py @@ -141,8 +141,8 @@ def workouts(user_id): app.logger.info(f'Creating workout for user {user.name} ({user.id})') data = request.json - workout_data = data['workout'] or [] - heart_rate = data['heart_rate'] or [] + cadence_readings = data['cadence_readings'] or [] + heart_rate_readings = data['heart_rate_readings'] or [] # create a new workout workout = Workout(user_id=user_id, bike_id=user.bike_id) @@ -150,19 +150,57 @@ def workouts(user_id): db.session.commit() app.logger.info( - f'Workout({workout.id}) created for user {user.name} ({user.id}) with {len(workout_data)} cadence readings and {len(heart_rate)} heart rate readings') + f'Workout({workout.id}) created for user {user.name} ({user.id}) with {len(cadence_readings)} cadence readings and {len(heart_rate_readings)} heart rate readings') # add cadence readings to the workout - for w in workout_data: + for c in cadence_readings: cadence_reading = CadenceReading( - workout_id=workout.id, created_at=w['timestamp'], rpm=w['rpm'], distance=w['distance'], speed=w['speed'], calories=w['calories'], power=w['power']) + workout_id=workout.id, created_at=c['timestamp'], rpm=c['rpm'], distance=c['distance'], speed=c['speed'], calories=c['calories'], power=c['power']) db.session.add(cadence_reading) - for h in heart_rate: + for h in heart_rate_readings: heart_rate_reading = HeartRateReading( workout_id=workout.id, created_at=h['timestamp'], bpm=h['bpm']) db.session.add(heart_rate_reading) + if cadence_readings: + start_time = min( + reading.created_at for reading in cadence_readings) + end_time = max( + reading.created_at for reading in cadence_readings) + duration = end_time - start_time + duration = duration.total_seconds() + average_rpm = sum( + reading.rpm for reading in cadence_readings) / len(cadence_readings) + min_rpm = min( + reading.rpm for reading in cadence_readings) + max_rpm = max( + reading.rpm for reading in cadence_readings) + calories = cadence_readings[-1].calories + distance = cadence_readings[-1].distance + + workout.is_cadence_available = True + workout.started_at = start_time + workout.duration = duration + workout.average_rpm = average_rpm + workout.min_rpm = min_rpm + workout.max_rpm = max_rpm + workout.calories = calories + workout.distance = distance + + if heart_rate_readings: + average_bpm = sum(heartrate.bpm for heartrate in heart_rate_readings) / \ + len(heart_rate_readings) + min_bpm = min( + heartrate.bpm for heartrate in heart_rate_readings) + max_bpm = max( + heartrate.bpm for heartrate in heart_rate_readings) + + workout.is_heart_rate_available = True + workout.average_bpm = average_bpm + workout.min_bpm = min_bpm + workout.max_bpm = max_bpm + db.session.commit() return jsonify({'message': 'Workout created successfully.'}), 201 diff --git a/templates/new_workout.html b/templates/new_workout.html index a82e3c1..5705039 100644 --- a/templates/new_workout.html +++ b/templates/new_workout.html @@ -221,7 +221,7 @@ Accept: "application/json", "Content-Type": "application/json", }, - body: JSON.stringify({ workout: workoutData, heart_rate: heartRateData }), + body: JSON.stringify({ cadence_readings: workoutData, heart_rate_readings: heartRateData }), }).then(res => res.json()) .then(res => { workoutData = [];