Skip to content
Snippets Groups Projects
Commit bca1aee9 authored by hollum's avatar hollum
Browse files

added possibility to add goals to backend

parent ebe12aee
No related branches found
No related tags found
No related merge requests found
Pipeline #157987 passed
...@@ -92,6 +92,28 @@ class Exercise(models.Model): ...@@ -92,6 +92,28 @@ class Exercise(models.Model):
def __str__(self): def __str__(self):
return self.name return self.name
class Goal(models.Model):
"""Django model for an exercise type that users can create.
Each exercise instance must have an exercise type, e.g., Pushups, Crunches, or Lunges.
Attributes:
name: Name of the exercise type
description: Description of the exercise type
duration: Duration of one unit of the exercise
calories: Calories spent per minute
muscleGroup: What major muscle group is used in the exercise
unit: Name of the unit for the exercise type (e.g., reps, seconds)
"""
name = models.CharField(max_length=100)
description = models.TextField()
date = models.DateTimeField()
exercise = models.TextField()
def __str__(self):
return self.name
class ExerciseInstance(models.Model): class ExerciseInstance(models.Model):
"""Django model for an instance of an exercise. """Django model for an instance of an exercise.
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
""" """
from rest_framework import serializers from rest_framework import serializers
from rest_framework.serializers import HyperlinkedRelatedField from rest_framework.serializers import HyperlinkedRelatedField
from workouts.models import Workout, Exercise, ExerciseInstance, WorkoutFile, RememberMe from workouts.models import Workout, Exercise, ExerciseInstance, Goal, WorkoutFile, RememberMe
class ExerciseInstanceSerializer(serializers.HyperlinkedModelSerializer): class ExerciseInstanceSerializer(serializers.HyperlinkedModelSerializer):
...@@ -215,6 +215,21 @@ class ExerciseSerializer(serializers.HyperlinkedModelSerializer): ...@@ -215,6 +215,21 @@ class ExerciseSerializer(serializers.HyperlinkedModelSerializer):
model = Exercise model = Exercise
fields = ["url", "id", "name", "description", "duration", "calories", "muscleGroup", "unit", "instances"] fields = ["url", "id", "name", "description", "duration", "calories", "muscleGroup", "unit", "instances"]
class GoalSerializer(serializers.HyperlinkedModelSerializer):
"""Serializer for an Exercise. Hyperlinks are used for relationships by default.
Serialized fields: url, id, name, description, duration, calories, muscle group, unit, instances
Attributes:
instances: Associated exercise instances with this Exercise type. Hyperlinks.
"""
class Meta:
model = Goal
fields = ["id", "name", "description", "date", "exercise"]
class RememberMeSerializer(serializers.HyperlinkedModelSerializer): class RememberMeSerializer(serializers.HyperlinkedModelSerializer):
"""Serializer for an RememberMe. Hyperlinks are used for relationships by default. """Serializer for an RememberMe. Hyperlinks are used for relationships by default.
......
...@@ -16,6 +16,7 @@ urlpatterns = format_suffix_patterns( ...@@ -16,6 +16,7 @@ urlpatterns = format_suffix_patterns(
views.WorkoutDetail.as_view(), views.WorkoutDetail.as_view(),
name="workout-detail", name="workout-detail",
), ),
path("api/goal/", views.GoalList.as_view(), name="goal-list"),
path("api/exercises/", views.ExerciseList.as_view(), name="exercise-list"), path("api/exercises/", views.ExerciseList.as_view(), name="exercise-list"),
path( path(
"api/exercises/<int:pk>/", "api/exercises/<int:pk>/",
......
...@@ -22,8 +22,8 @@ from workouts.permissions import ( ...@@ -22,8 +22,8 @@ from workouts.permissions import (
IsWorkoutPublic, IsWorkoutPublic,
) )
from workouts.mixins import CreateListModelMixin from workouts.mixins import CreateListModelMixin
from workouts.models import Workout, Exercise, ExerciseInstance, WorkoutFile from workouts.models import Workout, Exercise, ExerciseInstance, Goal, WorkoutFile
from workouts.serializers import WorkoutSerializer, ExerciseSerializer from workouts.serializers import WorkoutSerializer, ExerciseSerializer, GoalSerializer
from workouts.serializers import RememberMeSerializer from workouts.serializers import RememberMeSerializer
from workouts.serializers import ExerciseInstanceSerializer, WorkoutFileSerializer from workouts.serializers import ExerciseInstanceSerializer, WorkoutFileSerializer
from django.core.exceptions import PermissionDenied from django.core.exceptions import PermissionDenied
...@@ -41,6 +41,7 @@ def api_root(request, format=None): ...@@ -41,6 +41,7 @@ def api_root(request, format=None):
{ {
"users": reverse("user-list", request=request, format=format), "users": reverse("user-list", request=request, format=format),
"workouts": reverse("workout-list", request=request, format=format), "workouts": reverse("workout-list", request=request, format=format),
"goals": reverse("goal-list", request=request, format=format),
"exercises": reverse("exercise-list", request=request, format=format), "exercises": reverse("exercise-list", request=request, format=format),
"exercise-instances": reverse( "exercise-instances": reverse(
"exercise-instance-list", request=request, format=format "exercise-instance-list", request=request, format=format
...@@ -221,6 +222,53 @@ class ExerciseDetail( ...@@ -221,6 +222,53 @@ class ExerciseDetail(
def delete(self, request, *args, **kwargs): def delete(self, request, *args, **kwargs):
return self.destroy(request, *args, **kwargs) return self.destroy(request, *args, **kwargs)
class GoalList(
mixins.ListModelMixin, mixins.CreateModelMixin, generics.GenericAPIView
):
"""Class defining the web response for the creation of an Exercise, or
a list of Exercises.
HTTP methods: GET, POST
"""
queryset = Goal.objects.all()
serializer_class = GoalSerializer
permission_classes = [permissions.IsAuthenticated]
def get(self, request, *args, **kwargs):
return self.list(request, *args, **kwargs)
def post(self, request, *args, **kwargs):
return self.create(request, *args, **kwargs)
class GoalDetail(
mixins.RetrieveModelMixin,
mixins.UpdateModelMixin,
mixins.DestroyModelMixin,
generics.GenericAPIView,
):
"""Class defining the web response for the details of an individual Exercise.
HTTP methods: GET, PUT, PATCH, DELETE
"""
queryset = Goal.objects.all()
serializer_class = GoalSerializer
permission_classes = [permissions.IsAuthenticated]
def get(self, request, *args, **kwargs):
return self.retrieve(request, *args, **kwargs)
def put(self, request, *args, **kwargs):
return self.update(request, *args, **kwargs)
def patch(self, request, *args, **kwargs):
return self.partial_update(request, *args, **kwargs)
def delete(self, request, *args, **kwargs):
return self.destroy(request, *args, **kwargs)
class ExerciseInstanceList( class ExerciseInstanceList(
mixins.ListModelMixin, mixins.ListModelMixin,
......
...@@ -37,7 +37,7 @@ ...@@ -37,7 +37,7 @@
<div class="col-lg-6"></div> <div class="col-lg-6"></div>
<div class="col-lg-6"> <div class="col-lg-6">
<label for="inputMuscles" class="form-label">Connect to exercise</label> <label for="inputMuscles" class="form-label">Connect to exercise</label>
<select class="form-select" id="exercise-content" name="muscleGroup" disabled="true"> <select class="form-select" id="exercise-content" name="exercise" disabled="true">
</select> </select>
</div> </div>
<div class="col-lg-6"></div> <div class="col-lg-6"></div>
......
...@@ -63,25 +63,26 @@ function handleCancelButtonDuringCreate() { ...@@ -63,25 +63,26 @@ function handleCancelButtonDuringCreate() {
} }
async function createExercise() { async function createExercise() {
document.querySelector("select").removeAttribute("disabled")
let form = document.querySelector("#form-exercise"); let form = document.querySelector("#form-exercise");
let formData = new FormData(form); let formData = new FormData(form);
let body = {"name": formData.get("name"), let body = {"name": formData.get("name"),
"description": formData.get("description"), "description": formData.get("description"),
"duration": formData.get("duration"), "date": formData.get("date"),
"calories": formData.get("calories"), "exercise": formData.get("exercise")};
"muscleGroup": formData.get("muscleGroup"),
"unit": formData.get("unit")};
let response = await sendRequest("POST", `${HOST}/api/exercises/`, body); console.log("HEELO", body)
let response = await sendRequest("POST", `${HOST}/api/goal/`, body);
if (response.ok) {
window.location.replace("goals.html");
} else {
let data = await response.json();
let alert = createAlert("Could not create new goal!", data);
document.body.prepend(alert);
}
if (response.ok) {
window.location.replace("exercises.html");
} else {
let data = await response.json();
let alert = createAlert("Could not create new exercise!", data);
document.body.prepend(alert);
}
} }
function handleEditExerciseButtonClick() { function handleEditExerciseButtonClick() {
......
...@@ -31,11 +31,26 @@ function createExercise() { ...@@ -31,11 +31,26 @@ function createExercise() {
window.location.replace("goal.html"); window.location.replace("goal.html");
} }
async function init() {
let response = await sendRequest("GET", `${HOST}/api/goal/`);
if (response.ok) {
let data = await response.json();
data.results.map((goal) => {console.log(goal)});
}else{
console.log("ERROR")
}
return response;
}
window.addEventListener("DOMContentLoaded", async () => { window.addEventListener("DOMContentLoaded", async () => {
let createButton = document.querySelector("#btn-create-goal"); let createButton = document.querySelector("#btn-create-goal");
createButton.addEventListener("click", createExercise); createButton.addEventListener("click", createExercise);
let response = await fetchExerciseTypes(); let response = await fetchExerciseTypes();
await init();
if (!response.ok) { if (!response.ok) {
let data = await response.json(); let data = await response.json();
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment