diff --git a/app.py b/app.py index fb2af18..b7ffcfe 100644 --- a/app.py +++ b/app.py @@ -167,7 +167,9 @@ def get_calendar(person_id): @ validate_workout def get_workout_modal(person_id, workout_id): workout = db.get_workout(person_id, workout_id) - return render_template('partials/workout_modal.html', workout=workout) + (person_tags, workout_tags, selected_workout_tag_ids) = db.get_workout_tags( + person_id, workout_id) + return render_template('partials/workout_modal.html', workout=workout, person_tags=person_tags, workout_tags=workout_tags, selected_workout_tag_ids=selected_workout_tag_ids) @ app.route("/person//workout", methods=['POST']) @@ -384,6 +386,20 @@ def get_workout_note(person_id, workout_id): return render_template('partials/workout_note.html', person_id=person_id, workout_id=workout_id, note=workout['Note']) +@ app.route("/person//workout//tag/add", methods=['POST']) +def add_tag_to_workout(person_id, workout_id): + tags_id = [int(i) for i in request.form.getlist('tag_id')] + workout_tags = db.add_tag_for_workout(workout_id, tags_id) + return render_template('partials/workout_tags_list.html', workout_tags=workout_tags) + + +@ app.route("/person//workout//tag/new", methods=['POST']) +def create_new_tag_for_workout(person_id, workout_id): + tag_name = request.form.get('tag_name') + workout_tags = db.create_tag_for_workout(person_id, workout_id, tag_name) + return render_template('partials/workout_tags_list.html', workout_tags=workout_tags) + + @app.teardown_appcontext def closeConnection(exception): db.close_connection() diff --git a/db.py b/db.py index 734b8b4..29623a1 100644 --- a/db.py +++ b/db.py @@ -347,3 +347,95 @@ class DataBase(): def update_workout_note_for_person(self, person_id, workout_id, note): self.execute('UPDATE workout SET note=%s WHERE person_id=%s AND workout_id=%s', [ note, person_id, workout_id], commit=True) + + def add_tag_for_workout(self, workout_id, tags_id): + # First, delete tags that are not in the new selection + self.execute( + """ + DELETE FROM workout_tag + WHERE workout_id = %s AND tag_id NOT IN %s + """, + [workout_id, tuple(tags_id)], commit=True + ) + + # Then, attempt to insert the new tags + for tag_id in tags_id: + self.execute( + """ + INSERT INTO workout_tag (workout_id, tag_id) + VALUES (%s, %s) + ON CONFLICT (workout_id, tag_id) DO NOTHING + """, + [workout_id, tag_id], commit=True + ) + + # Now fetch updated list of workout tags + workout_tags = self.execute(""" + SELECT + T.tag_id AS "tag_id", + T.person_id AS "person_id", + T.name AS "tag_name", + T.filter AS "tag_filter" + FROM Workout_Tag WT + LEFT JOIN Tag T ON WT.tag_id=T.tag_id + WHERE WT.workout_id=%s""", [workout_id]) + + return workout_tags + + def create_tag_for_workout(self, person_id, workout_id, tag_name): + workout_exercises = self.execute(""" + SELECT + E.exercise_id AS "exercise_id", + E.name AS "exercise_name" + FROM Workout W + LEFT JOIN TopSet T ON W.workout_id=T.workout_id + LEFT JOIN Exercise E ON T.exercise_id=E.exercise_id + WHERE W.workout_id=%s""", [workout_id]) + + tag_filter = "?" + \ + "&".join( + f"exercise_id={e['exercise_id']}" for e in workout_exercises) + + # create tag for person + row = self.execute('INSERT INTO Tag (person_id, name, filter) VALUES (%s, %s, %s) RETURNING tag_id AS "tag_id"', [ + person_id, tag_name, tag_filter], commit=True, one=True) + + # add tag to workout + self.execute('INSERT INTO Workout_Tag (workout_id, tag_id) VALUES (%s, %s)', [ + workout_id, row['tag_id']], commit=True) + + # Now fetch updated list of workout tags + workout_tags = self.execute(""" + SELECT + T.tag_id AS "tag_id", + T.person_id AS "person_id", + T.name AS "tag_name", + T.filter AS "tag_filter" + FROM Workout_Tag WT + LEFT JOIN Tag T ON WT.tag_id=T.tag_id + WHERE WT.workout_id=%s""", [workout_id]) + + return workout_tags + + def get_workout_tags(self, person_id, workout_id): + person_tags = self.execute(""" + SELECT + T.tag_id AS "tag_id", + T.name AS "tag_name", + T.filter AS "tag_filter" + FROM Tag T + WHERE T.person_id=%s""", [person_id]) + + workout_tags = self.execute(""" + SELECT + T.tag_id AS "tag_id", + T.person_id AS "person_id", + T.name AS "tag_name", + T.filter AS "tag_filter" + FROM Workout_Tag WT + LEFT JOIN Tag T ON WT.tag_id=T.tag_id + WHERE WT.workout_id=%s""", [workout_id]) + + selected_workout_tag_ids = [wt['tag_id'] for wt in workout_tags] + + return (person_tags, workout_tags, selected_workout_tag_ids) diff --git a/templates/partials/workout_modal.html b/templates/partials/workout_modal.html index 7587c31..e155755 100644 --- a/templates/partials/workout_modal.html +++ b/templates/partials/workout_modal.html @@ -16,109 +16,10 @@

{{ workout['PersonName'] }}

-
-
- Push - - Accessories - -
- - - - - - -
- + {{ render_partial('partials/workout_tags.html', person_id=workout['PersonId'], + workout_id=workout['WorkoutId'], + person_tags=person_tags, workout_tags=workout_tags, + selected_workout_tag_ids=selected_workout_tag_ids) }}
diff --git a/templates/partials/workout_tags.html b/templates/partials/workout_tags.html new file mode 100644 index 0000000..88dd3e1 --- /dev/null +++ b/templates/partials/workout_tags.html @@ -0,0 +1,80 @@ +
+
+ {{ render_partial('partials/workout_tags_list.html', workout_tags=workout_tags) + }} +
+ + + + + + +
+ \ No newline at end of file diff --git a/templates/partials/workout_tags_list.html b/templates/partials/workout_tags_list.html new file mode 100644 index 0000000..8e3c24c --- /dev/null +++ b/templates/partials/workout_tags_list.html @@ -0,0 +1,8 @@ +{% for tag in workout_tags %} +{{ + tag.tag_name }} + +{% endfor%} \ No newline at end of file