diff --git a/backend/secfit/workouts/models.py b/backend/secfit/workouts/models.py index 484a8b7ab5d708a7ccaec5a702289b69cb40973c..c4b708d9ed0f3576a01878ba1674c82f646ca25e 100644 --- a/backend/secfit/workouts/models.py +++ b/backend/secfit/workouts/models.py @@ -48,20 +48,25 @@ class Workout(models.Model): ) # Visibility levels - PUBLIC = "PU" # Visible to all authenticated users - COACH = "CO" # Visible only to owner and their coach - PRIVATE = "PR" # Visible only to owner + # Visible to all authenticated users + PUBLIC = "PU" + # Visible only to owner and their coach + COACH = "CO" + # Visible only to owner + PRIVATE = "PR" + # Choices for visibility level VISIBILITY_CHOICES = [ (PUBLIC, "Public"), (COACH, "Coach"), (PRIVATE, "Private"), - ] # Choices for visibility level + ] visibility = models.CharField( max_length=2, choices=VISIBILITY_CHOICES, default=COACH ) class Meta: + """Orders the object by date descendingly""" ordering = ["-date"] def __str__(self): diff --git a/backend/secfit/workouts/serializers.py b/backend/secfit/workouts/serializers.py index 6abbe31ffd71c5e9cbba140e34a03176b127a4bf..bc8c34e561b1734507bc75f4c47d8d320116af13 100644 --- a/backend/secfit/workouts/serializers.py +++ b/backend/secfit/workouts/serializers.py @@ -19,6 +19,7 @@ class ExerciseInstanceSerializer(serializers.HyperlinkedModelSerializer): ) class Meta: + """serialized fields for the model ExerciseInstance""" model = ExerciseInstance fields = ["url", "id", "exercise", "sets", "number", "workout"] @@ -39,6 +40,7 @@ class WorkoutFileSerializer(serializers.HyperlinkedModelSerializer): ) class Meta: + """serialized fields for the model WorkoutFile""" model = WorkoutFile fields = ["url", "id", "owner", "file", "workout"] @@ -66,6 +68,7 @@ class WorkoutSerializer(serializers.HyperlinkedModelSerializer): files = WorkoutFileSerializer(many=True, required=False) class Meta: + """serialized fields for the Workout. Owner is read only and cant be modified""" model = Workout fields = [ "url", @@ -101,10 +104,12 @@ class WorkoutSerializer(serializers.HyperlinkedModelSerializer): workout = Workout.objects.create(**validated_data) for exercise_instance_data in exercise_instances_data: - ExerciseInstance.objects.create(workout=workout, **exercise_instance_data) + ExerciseInstance.objects.create( + workout=workout, **exercise_instance_data) for file_data in files_data: WorkoutFile.objects.create( - workout=workout, owner=workout.owner, file=file_data.get("file") + workout=workout, owner=workout.owner, file=file_data.get( + "file") ) return workout @@ -127,7 +132,8 @@ class WorkoutSerializer(serializers.HyperlinkedModelSerializer): instance.name = validated_data.get("name", instance.name) instance.notes = validated_data.get("notes", instance.notes) - instance.visibility = validated_data.get("visibility", instance.visibility) + instance.visibility = validated_data.get( + "visibility", instance.visibility) instance.date = validated_data.get("date", instance.date) instance.save() @@ -212,8 +218,18 @@ class ExerciseSerializer(serializers.HyperlinkedModelSerializer): ) class Meta: + """serialized fields for the 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 RememberMeSerializer(serializers.HyperlinkedModelSerializer): @@ -226,5 +242,6 @@ class RememberMeSerializer(serializers.HyperlinkedModelSerializer): """ class Meta: + """serialized fields for the model RememberMe""" model = RememberMe fields = ["remember_me"] diff --git a/backend/secfit/workouts/views.py b/backend/secfit/workouts/views.py index efddf40454376b23d233f9fe2cecaf9da43fddb8..e2752f993c94b6ea6db0a2ce164e68310ad29f02 100644 --- a/backend/secfit/workouts/views.py +++ b/backend/secfit/workouts/views.py @@ -31,12 +31,14 @@ from rest_framework_simplejwt.tokens import RefreshToken from rest_framework.response import Response import json from collections import namedtuple -import base64, pickle +import base64 +import pickle from django.core.signing import Signer @api_view(["GET"]) def api_root(request, format=None): + """The API root view""" return Response( { "users": reverse("user-list", request=request, format=format), @@ -54,13 +56,16 @@ def api_root(request, format=None): ) -# Allow users to save a persistent session in their browser class RememberMe( mixins.ListModelMixin, mixins.CreateModelMixin, mixins.DestroyModelMixin, generics.GenericAPIView, ): + """Allow users to save a persistent session in their browser. + + HTTP methods: GET, POST + """ serializer_class = RememberMeSerializer @@ -68,7 +73,7 @@ class RememberMe( if request.user.is_authenticated == False: raise PermissionDenied else: - return Response({"remember_me": self.rememberme()}) + return Response({"remember_me": self.remember_me()}) def post(self, request): cookieObject = namedtuple("Cookies", request.COOKIES.keys())( @@ -91,7 +96,7 @@ class RememberMe( if sign == self.sign_user(user): return user - def rememberme(self): + def remember_me(self): creds = [self.request.user, self.sign_user(str(self.request.user))] return base64.b64encode(pickle.dumps(creds)) @@ -111,13 +116,15 @@ class WorkoutList( """ serializer_class = WorkoutSerializer + # User must be authenticated to create/view workouts permission_classes = [ permissions.IsAuthenticated - ] # User must be authenticated to create/view workouts + ] + # For parsing JSON and Multi-part requests parser_classes = [ MultipartJsonParser, JSONParser, - ] # For parsing JSON and Multi-part requests + ] filter_backends = [filters.OrderingFilter] ordering_fields = ["name", "date", "owner__username"] @@ -131,18 +138,18 @@ class WorkoutList( serializer.save(owner=self.request.user) def get_queryset(self): - qs = Workout.objects.none() + queryset = Workout.objects.none() if self.request.user: # A workout should be visible to the requesting user if any of the following hold: # - The workout has public visibility # - The owner of the workout is the requesting user # - The workout has coach visibility and the requesting user is the owner's coach - qs = Workout.objects.filter( + queryset = Workout.objects.filter( Q(visibility="PU") | (Q(visibility="CO") & Q(owner__coach=self.request.user)) ).distinct() - return qs + return queryset class WorkoutDetail( @@ -228,7 +235,10 @@ class ExerciseInstanceList( CreateListModelMixin, generics.GenericAPIView, ): - """Class defining the web response for the creation""" + """Class defining the web response for the creation + + HTTP methods: GET, POST + """ serializer_class = ExerciseInstanceSerializer permission_classes = [permissions.IsAuthenticated & IsOwnerOfWorkout] @@ -259,6 +269,12 @@ class ExerciseInstanceDetail( mixins.DestroyModelMixin, generics.GenericAPIView, ): + """Class defining the web response for the modification, deletion and getting + exercise instance details. + + HTTP methods: GET, PUT, PATCH, DELETE + """ + serializer_class = ExerciseInstanceSerializer permission_classes = [ permissions.IsAuthenticated @@ -287,6 +303,10 @@ class WorkoutFileList( CreateListModelMixin, generics.GenericAPIView, ): + """Class defining the web response for the getting and creating list for workout files. + + HTTP methods: GET, POST + """ queryset = WorkoutFile.objects.all() serializer_class = WorkoutFileSerializer @@ -323,6 +343,10 @@ class WorkoutFileDetail( mixins.DestroyModelMixin, generics.GenericAPIView, ): + """Class defining the web response for the getting deleting workout file details. + + HTTP methods: GET, POST + """ queryset = WorkoutFile.objects.all() serializer_class = WorkoutFileSerializer