Add options to choose type of bike, and also persist distance, power, calories, speed to db

This commit is contained in:
Peter Stockings
2023-03-14 10:19:37 +11:00
parent f1c89e967a
commit faf9b82137
5 changed files with 141 additions and 38 deletions

53
app.py
View File

@@ -28,7 +28,17 @@ class User(db.Model):
__tablename__ = 'users'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(255), nullable=False)
bike_id = db.Column(db.Integer, db.ForeignKey(
'bikes.id', ondelete='CASCADE'), nullable=False)
workouts = db.relationship('Workout', backref='user', lazy=True)
bike = db.relationship('Bike', backref='user', lazy=True)
class Bike(db.Model):
__tablename__ = 'bikes'
id = db.Column(db.Integer, primary_key=True)
display_name = db.Column(db.String(255), nullable=False)
code_name = db.Column(db.String(255), nullable=False)
class Workout(db.Model):
@@ -48,10 +58,13 @@ class CadenceReading(db.Model):
'workouts.id', ondelete='CASCADE'), nullable=False)
created_at = db.Column(db.DateTime, nullable=False)
rpm = db.Column(db.Integer, nullable=False)
distance = db.Column(db.Numeric, nullable=False)
speed = db.Column(db.Numeric, nullable=False)
calories = db.Column(db.Numeric, nullable=False)
power = db.Column(db.Integer, nullable=False)
@app.route('/', methods=['GET'])
def get_workouts():
def render_users_and_workouts():
users = User.query.all()
users_data = []
for user in users:
@@ -59,11 +72,17 @@ def get_workouts():
user_data = {
'id': user.id,
'name': user.name,
'bike_id': user.bike_id,
'workouts_count': len(workouts),
'workouts': workouts
}
users_data.append(user_data)
return render_template('users_and_workouts.html', users=users_data)
return render_template('users_and_workouts.html', users=users_data, bikes=Bike.query.all())
@app.route('/', methods=['GET'])
def get_workouts():
return render_users_and_workouts()
@app.route("/user/<int:user_id>/new_workout")
@@ -85,14 +104,14 @@ def users():
# create a new user
data = request.form
name = data['name']
bike_id = data['bike_id']
# create a new user and add it to the database
new_user = User(name=name)
new_user = User(name=name, bike_id=bike_id)
db.session.add(new_user)
db.session.commit()
users = User.query.all()
return render_template('users.html', users=users)
return render_users_and_workouts()
@app.route('/user/<int:user_id>', methods=['DELETE'])
@@ -101,8 +120,7 @@ def delete_user(user_id):
if user:
db.session.delete(user)
db.session.commit()
users = User.query.all()
return render_template('users.html', users=users)
return render_users_and_workouts()
else:
return jsonify({'error': 'User not found.'}), 404
@@ -115,7 +133,7 @@ def workouts(user_id):
elif request.method == 'POST':
data = request.json
rpm_readings = data['workout']
data = data['workout']
# create a new workout
workout = Workout(user_id=user_id)
@@ -123,9 +141,9 @@ def workouts(user_id):
db.session.commit()
# add cadence readings to the workout
for reading in rpm_readings:
for d in data:
cadence_reading = CadenceReading(
workout_id=workout.id, created_at=reading['timestamp'], rpm=reading['rpm'])
workout_id=workout.id, created_at=d['timestamp'], rpm=d['rpm'], distance=d['distance'], speed=d['speed'], calories=d['calories'], power=d['power'])
db.session.add(cadence_reading)
db.session.commit()
@@ -186,6 +204,19 @@ def workouts_for_user(user_id):
return render_template('workouts_list.html', workouts=workouts_data)
@app.route('/user/<int:user_id>/bike', methods=['GET'])
def update_users_bike(user_id):
bike_id = request.args.get('bike_id')
user = User.query.get(user_id)
bike = Bike.query.get(bike_id)
if user and bike:
user.bike_id = bike_id
db.session.commit()
return render_users_and_workouts()
else:
return jsonify({'error': 'User or bike not found.'}), 404
def get_workouts_for_user(user_id):
workouts_data = []
workouts = Workout.query.filter_by(user_id=user_id).order_by(