summaryrefslogtreecommitdiff
path: root/app
diff options
context:
space:
mode:
authorstilbruch <stilbruch@protonmail.com>2022-04-24 19:27:41 -0500
committerstilbruch <stilbruch@protonmail.com>2022-04-24 19:27:41 -0500
commit0dd74e2b672053e3296bc814a36988ba8463854f (patch)
treeccd0c41d15324513f419fa2b157d65268b6b63b2 /app
parent586285028845c8ed9a2e859f1266c233b8278311 (diff)
downloadStrengthy-0dd74e2b672053e3296bc814a36988ba8463854f.tar.xz
Strengthy-0dd74e2b672053e3296bc814a36988ba8463854f.zip
Workout records are now written to the database
Diffstat (limited to 'app')
-rw-r--r--app/forms/workout.py7
-rw-r--r--app/routes/workout.py42
-rw-r--r--app/static/js/create.js3
-rw-r--r--app/tables/workout.py49
-rw-r--r--app/templates/workout/create.html2
-rw-r--r--app/templates/workout/record.html14
6 files changed, 90 insertions, 27 deletions
diff --git a/app/forms/workout.py b/app/forms/workout.py
index cf9f635..5537114 100644
--- a/app/forms/workout.py
+++ b/app/forms/workout.py
@@ -7,7 +7,7 @@ from wtforms import (
SelectField,
StringField,
)
-from wtforms.validators import DataRequired, Email
+from wtforms.validators import DataRequired, Email, Optional
# /workout/create
class ExerciseCreateForm(Form):
@@ -28,11 +28,12 @@ class WorkoutCreateForm(FlaskForm):
# /workout/record
class SetForm(Form):
- lbs = IntegerField("lbs")
- reps = IntegerField("reps")
+ lbs = IntegerField("lbs", [Optional()])
+ units = IntegerField("units", [Optional()])
class ExerciseRecordForm(Form):
+ id = HiddenField("id", [DataRequired()])
sets = FieldList(FormField(SetForm))
diff --git a/app/routes/workout.py b/app/routes/workout.py
index ffdacb9..0c6116c 100644
--- a/app/routes/workout.py
+++ b/app/routes/workout.py
@@ -1,8 +1,9 @@
from app import app, db
+from datetime import datetime
from flask import render_template, redirect, request, url_for, flash
from flask_login import current_user, login_required
from forms import WorkoutCreateForm, WorkoutRecordForm
-from tables import Exercise, User, Workout
+from tables import Exercise, User, Workout, WorkoutRecord, SetRecord
@app.route("/workout/create", methods=["GET", "POST"])
@@ -25,6 +26,9 @@ def workout_create():
return redirect(url_for("home"))
else:
flash("Workout with this name already exists", "danger")
+ else:
+ print(form)
+ print(form.errors)
return render_template("workout/create.html", form=form)
@@ -53,7 +57,7 @@ def workout_edit():
workout_id=workout.id, id=int(entry.data["id"])
).first()
- if not exercise: # NOTE error?
+ if not exercise:
continue
# Update exercise
@@ -62,8 +66,6 @@ def workout_edit():
exercise.units = entry.data["units"]
exercise.type = entry.data["type"]
- print(exercise)
-
# Write changes to database
db.session.commit()
return redirect(url_for("home"))
@@ -96,10 +98,36 @@ def workout_record():
return redirect(url_for("home"))
if form.validate_on_submit():
- # Form has been submitted and is valid FIXME
- print(form)
+ # Form has been submitted and is valid
+ workout_record = WorkoutRecord(workout, datetime.now())
+
+ # Interate over form exercise entries
+ for ee in form.exercises.entries:
+ id = ee.data["id"]
+
+ # And over that exercise's sets
+ for se in ee.sets.entries:
+ lbs = se.data["lbs"]
+ units = se.data["units"]
+
+ if lbs and units:
+ # Add the set to the workout record
+ workout_record.sets.append(
+ SetRecord(lbs=lbs, reps=units, exercise_id=id)
+ )
+
+ db.session.add(workout_record)
+ db.session.commit()
+
+ return redirect(url_for("home"))
+ else:
+ # Populate form with data
+ for exercise in workout.exercises:
+ form.exercises.append_entry(
+ {"id": exercise.id, "sets": [{}] * exercise.sets}
+ )
- return render_template("workout/record.html", workout=workout, form=form)
+ return render_template("workout/record.html", workout=workout, form=form)
@app.route("/workout/select", methods=["GET"])
diff --git a/app/static/js/create.js b/app/static/js/create.js
index 832bbe2..cb22ad8 100644
--- a/app/static/js/create.js
+++ b/app/static/js/create.js
@@ -1,9 +1,8 @@
var rowsDiv = document.getElementById("rows");
var rowId = rowsDiv.children.length;
-
function handleAdd() {
- newRow = rowsDiv.children[0].cloneNode(true);
+ newRow = rowsDiv.children[1].cloneNode(true);
exerciseNameInput = newRow.children[0].children[0].children[0].children[0];
exerciseNameInput.value = '';
diff --git a/app/tables/workout.py b/app/tables/workout.py
index f9c2f93..cc8478e 100644
--- a/app/tables/workout.py
+++ b/app/tables/workout.py
@@ -5,12 +5,15 @@ import enum
# Represents an individual exercise
class Exercise(db.Model):
__tablename__ = "exercises"
+
+ # fields
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(100), nullable=False)
sets = db.Column(db.Integer)
units = db.Column(db.Integer)
type = db.Column(db.Enum("reps", "time"), nullable=False)
- # Workout Relationship
+
+ # foreign keys
workout_id = db.Column(db.Integer, db.ForeignKey("workouts.id"))
def __init__(self, name, sets, units, type):
@@ -26,17 +29,23 @@ class Exercise(db.Model):
# Represents a singular workout
class Workout(db.Model):
__tablename__ = "workouts"
+
+ # fields
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(100), nullable=False)
+
# foreign keys
user_id = db.Column(db.Integer, db.ForeignKey("users.id"))
+
# relationships
exercises = db.relationship("Exercise", backref="workout", lazy="dynamic")
+ records = db.relationship("WorkoutRecord", backref="workout", lazy="dynamic")
def __init__(self, user, name, exercises):
self.name = name
self.user_id = user.id
+ # populate exercises
for exercise in exercises:
self.exercises.append(
Exercise(
@@ -51,9 +60,35 @@ class Workout(db.Model):
return f"<Workout {self.name}>"
-# Connects workouts to it's exercises
-# class WorkoutExercise(db.Model):
-# __table__ = 'workout_exercises'
-# id = db.Column(db.Integer, primary_key=True)
-# workout_id = db.Column(db.Integer, db.ForeignKey('workouts.id'))
-# exercise_id = db.Column(db.Integer, db.ForeignKey('exercises.id'))
+# Represents the recording of a single set within a workout recording
+class SetRecord(db.Model):
+ __tablename__ = "set_records"
+ id = db.Column(db.Integer, primary_key=True)
+ lbs = db.Column(db.Integer)
+ reps = db.Column(db.Integer)
+
+ # foreign keys
+ workout_record_id = db.Column(db.Integer, db.ForeignKey("workout_records.id"))
+ exercise_id = db.Column(db.Integer, db.ForeignKey("exercises.id"), nullable=False)
+
+ # relationships
+ exercise = db.relationship("Exercise")
+
+
+# Represents a recording of a workout
+class WorkoutRecord(db.Model):
+ __tablename__ = "workout_records"
+
+ # fields
+ id = db.Column(db.Integer, primary_key=True)
+ finished = db.Column(db.DateTime)
+
+ # foreign keys
+ workout_id = db.Column(db.Integer, db.ForeignKey("workouts.id"))
+
+ # relationships
+ sets = db.relationship("SetRecord", backref="workout_record", lazy="dynamic")
+
+ def __init__(self, workout, finished):
+ self.workout = workout
+ self.finished = finished
diff --git a/app/templates/workout/create.html b/app/templates/workout/create.html
index 333aca6..a84b457 100644
--- a/app/templates/workout/create.html
+++ b/app/templates/workout/create.html
@@ -64,7 +64,7 @@
</div>
<div class="field is-horizontal is-grouped is-grouped-right">
- <p id="add" class="button is-primary">
+ <p id="add" class="button is-primary" onclick="handleAdd()">
<span class="icon is-small">
<i class="fa fa-plus"></i>
</span>
diff --git a/app/templates/workout/record.html b/app/templates/workout/record.html
index d7e29f8..aa58ff4 100644
--- a/app/templates/workout/record.html
+++ b/app/templates/workout/record.html
@@ -3,10 +3,10 @@
{% block title %}Record {{ workout.name }}{% endblock %}
{% block form %}
-{% for exercise in workout.exercises %}
-{% set outer_loop = loop %}
+{% for exercise in form.exercises.entries %}
<div>
- <h1 id="{{ exercise.name }}" class="title is-4 has-text-black">{{ exercise.name }}</h1>
+ {{ exercise['id'] }}
+ <h1 class="title is-4 has-text-black">{{ workout.exercises[loop.index0].name }}</h1>
<table class="table is-fullwidth is-hoverable">
<thead>
<th>Set</th>
@@ -15,11 +15,11 @@
<th>Done</th>
</thead>
<tbody>
- {% for i in range(exercise.sets) %}
+ {% for set in exercise.sets.entries %}
<tr>
- <th>{{ i + 1 }}</th>
- <td><input class="input" name="exercises-{{ outer_loop.index0 }}-sets-{{ i }}-lbs" type="number"></td>
- <td><input class="input" name="exercises-{{ outer_loop.index0 }}-sets-{{ i }}-reps" type="number"></td>
+ <th>{{ loop.index }}</th>
+ <td>{{ set['lbs'](class_='input') }}</td>
+ <td>{{ set['units'](class_='input') }}</td>
<td>
<a class="button" onClick="onClickSetCheck(this)">
<span class="icon is-small">