diff options
| -rw-r--r-- | app/forms/workout.py | 7 | ||||
| -rw-r--r-- | app/routes/workout.py | 42 | ||||
| -rw-r--r-- | app/static/js/create.js | 3 | ||||
| -rw-r--r-- | app/tables/workout.py | 49 | ||||
| -rw-r--r-- | app/templates/workout/create.html | 2 | ||||
| -rw-r--r-- | app/templates/workout/record.html | 14 |
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"> |
