From c7de57945f664fe00c6af5027031a2b157fc2553 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vegard=20Sporst=C3=B8l?= <vegarms@stud.ntnu.no> Date: Thu, 4 Mar 2021 13:50:46 +0100 Subject: [PATCH] Categorize exercises --- backend/secfit/seed.json | 3 + .../workouts/migrations/0001_initial.py | 1 + backend/secfit/workouts/models.py | 2 + backend/secfit/workouts/serializers.py | 4 +- frontend/www/exercise.html | 108 +++++++----------- frontend/www/scripts/exercise.js | 10 +- 6 files changed, 61 insertions(+), 67 deletions(-) diff --git a/backend/secfit/seed.json b/backend/secfit/seed.json index 32c1366..a81bea2 100644 --- a/backend/secfit/seed.json +++ b/backend/secfit/seed.json @@ -5,6 +5,7 @@ "fields": { "name": "Push-up", "description": "A push-up (or press-up in British English) is a common calisthenics exercise beginning from the prone position.", + "category": "Strength", "unit": "reps" } }, @@ -14,6 +15,7 @@ "fields": { "name": "Crunch", "description": "The crunch is one of the most popular abdominal exercises.", + "category": "Strength", "unit": "reps" } }, @@ -23,6 +25,7 @@ "fields": { "name": "Plank", "description": "The plank is an isometric core strength exercise that involves maintaining a position similar to a push-up for the maximum possible time.", + "category": "Strength", "unit": "seconds" } } diff --git a/backend/secfit/workouts/migrations/0001_initial.py b/backend/secfit/workouts/migrations/0001_initial.py index e78f67f..cf5e9cb 100644 --- a/backend/secfit/workouts/migrations/0001_initial.py +++ b/backend/secfit/workouts/migrations/0001_initial.py @@ -29,6 +29,7 @@ class Migration(migrations.Migration): ), ("name", models.CharField(max_length=100)), ("description", models.TextField()), + ("category", models.CharField(max_length=50)), ("unit", models.CharField(max_length=50)), ], ), diff --git a/backend/secfit/workouts/models.py b/backend/secfit/workouts/models.py index 5e3c6d1..335adbd 100644 --- a/backend/secfit/workouts/models.py +++ b/backend/secfit/workouts/models.py @@ -76,11 +76,13 @@ class Exercise(models.Model): Attributes: name: Name of the exercise type description: Description of the exercise type + category: What category the exercise fits in (e.g., endurance, strenght, balance, felxibility or other) unit: Name of the unit for the exercise type (e.g., reps, seconds) """ name = models.CharField(max_length=100) description = models.TextField() + category = models.CharField(max_length=50) unit = models.CharField(max_length=50) def __str__(self): diff --git a/backend/secfit/workouts/serializers.py b/backend/secfit/workouts/serializers.py index a966ed3..42c3440 100644 --- a/backend/secfit/workouts/serializers.py +++ b/backend/secfit/workouts/serializers.py @@ -201,7 +201,7 @@ class WorkoutSerializer(serializers.HyperlinkedModelSerializer): class ExerciseSerializer(serializers.HyperlinkedModelSerializer): """Serializer for an Exercise. Hyperlinks are used for relationships by default. - Serialized fields: url, id, name, description, unit, instances + Serialized fields: url, id, name, description, category, unit, instances Attributes: instances: Associated exercise instances with this Exercise type. Hyperlinks. @@ -213,7 +213,7 @@ class ExerciseSerializer(serializers.HyperlinkedModelSerializer): class Meta: model = Exercise - fields = ["url", "id", "name", "description", "unit", "instances"] + fields = ["url", "id", "name", "description", "category", "unit", "instances"] class RememberMeSerializer(serializers.HyperlinkedModelSerializer): diff --git a/frontend/www/exercise.html b/frontend/www/exercise.html index c2c15b4..160af60 100644 --- a/frontend/www/exercise.html +++ b/frontend/www/exercise.html @@ -21,70 +21,50 @@ <body> <navbar-el></navbar-el> - <div class="container"> - <div class="row"> - <div class="col-lg"> - <h3 class="mt-3">View/Edit Exercise</h3> - </div> - </div> - <form class="row g-3" id="form-exercise"> - <div class="col-lg-6 "> - <label for="inputName" class="form-label">Name</label> - <input - type="text" - class="form-control" - id="inputName" - name="name" - readonly - /> - </div> - <div class="col-lg-6"></div> - <div class="col-lg-6"> - <label for="inputDescription" class="form-label">Description</label> - <textarea - class="form-control" - id="inputDescription" - name="description" - readonly - ></textarea> - </div> - <div class="col-lg-6"></div> - <div class="col-lg-6"> - <label for="inputUnit" class="form-label">Unit</label> - <input - type="text" - class="form-control" - id="inputUnit" - name="unit" - readonly - /> - </div> - <div class="col-lg-6"></div> - <div class="col-lg-6"> - <input - type="button" - class="btn btn-primary hide" - id="btn-ok-exercise" - value=" OK " - /> - <input - type="button" - class="btn btn-primary" - id="btn-edit-exercise" - value=" Edit " - /> - <input - type="button" - class="btn btn-secondary hide" - id="btn-cancel-exercise" - value="Cancel" - /> - <input - type="button" - class="btn btn-danger float-end hide" - id="btn-delete-exercise" - value="Delete" - /> + <div class="container"> + <div class="row"> + <div class="col-lg"> + <h3 class="mt-3">View/Edit Exercise</h3> + </div> + </div> + <form class="row g-3" id="form-exercise"> + <div class="col-lg-6 "> + <label for="inputName" class="form-label">Name</label> + <input type="text" class="form-control" id="inputName" name="name" readonly> + </div> + <div class="col-lg-6"></div> + <div class="col-lg-6"> + <label for="inputDescription" class="form-label">Description</label> + <textarea class="form-control" id="inputDescription" name="description" readonly></textarea> + </div> + <div class="col-lg-6"></div> + <div class="col-lg-6"> + <label for="inputCategory" class="form-label">Category</label> + <select id="inputCategory" class="form-select" name="category" disabled> + <option value="None"></option> + <option value="Endurance">Endurance</option> + <option value="Strength">Strength</option> + <option value="Balance">Balance</option> + <option value="Flexibility">Flexibility</option> + <option value="Other">Other</option> + </select> + </div> + <div class="col-lg-6"></div> + <div class="col-lg-6"> + <label for="inputUnit" class="form-label">Unit</label> + <input type="text" class="form-control" id="inputUnit" name="unit" readonly> + </div> + <div class="col-lg-6"></div> + <div class="col-lg-6"> + <input type="button" class="btn btn-primary hide" id="btn-ok-exercise" value=" OK "> + <input type="button" class="btn btn-primary" id="btn-edit-exercise" value=" Edit "> + <input type="button" class="btn btn-secondary hide" id="btn-cancel-exercise" value="Cancel"> + <input type="button" class="btn btn-danger float-end hide" id="btn-delete-exercise" value="Delete"> + </div> + <div class="col-lg-6"> + + </div> + </form> </div> <div class="col-lg-6"></div> </form> diff --git a/frontend/www/scripts/exercise.js b/frontend/www/scripts/exercise.js index aa99f0e..e48585e 100644 --- a/frontend/www/scripts/exercise.js +++ b/frontend/www/scripts/exercise.js @@ -17,10 +17,12 @@ function handleCancelButtonDuringEdit() { let form = document.querySelector("#form-exercise"); if (oldFormData.has("name")) form.name.value = oldFormData.get("name"); if (oldFormData.has("description")) form.description.value = oldFormData.get("description"); + if (oldFormData.has("category")) form.category.value = oldFormData.get("category"); if (oldFormData.has("unit")) form.unit.value = oldFormData.get("unit"); oldFormData.delete("name"); oldFormData.delete("description"); + oldFormData.delete("category"); oldFormData.delete("unit"); } @@ -34,6 +36,7 @@ async function createExercise() { let formData = new FormData(form); let body = {"name": formData.get("name"), "description": formData.get("description"), + "category": formData.get("category"), "unit": formData.get("unit")}; let response = await sendRequest("POST", `${HOST}/api/exercises/`, body); @@ -90,6 +93,9 @@ async function retrieveExercise(id) { let newVal = exerciseData[key]; input.value = newVal; } + console.log("This is all the data: " + exerciseData) + let element = document.getElementById('inputCategory'); + element.value = exerciseData.category; } } @@ -97,7 +103,8 @@ async function updateExercise(id) { let form = document.querySelector("#form-exercise"); let formData = new FormData(form); let body = {"name": formData.get("name"), - "description": formData.get("description"), + "description": formData.get("description"), + "category": formData.get("category"), "unit": formData.get("unit")}; let response = await sendRequest("PUT", `${HOST}/api/exercises/${id}/`, body); @@ -118,6 +125,7 @@ async function updateExercise(id) { oldFormData.delete("name"); oldFormData.delete("description"); + oldFormData.delete("category"); oldFormData.delete("unit"); } } -- GitLab