When a new workout is created, calculate and persist distance, calories, average, min, max rpm|bpm etc (Need to test this)

This commit is contained in:
Peter Stockings
2023-07-29 20:39:34 +10:00
parent 2e37b1e22a
commit 27d3fbf681
2 changed files with 45 additions and 7 deletions

50
app.py
View File

@@ -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

View File

@@ -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 = [];