diff --git a/backend/secfit/workouts/serializers.py b/backend/secfit/workouts/serializers.py index bc8c34e561b1734507bc75f4c47d8d320116af13..14ccaf6f29ca2b71452a97d283ebaa8e7e755ba0 100644 --- a/backend/secfit/workouts/serializers.py +++ b/backend/secfit/workouts/serializers.py @@ -127,8 +127,6 @@ class WorkoutSerializer(serializers.HyperlinkedModelSerializer): Returns: Workout: Updated Workout instance """ - exercise_instances_data = validated_data.pop("exercise_instances") - exercise_instances = instance.exercise_instances instance.name = validated_data.get("name", instance.name) instance.notes = validated_data.get("notes", instance.notes) @@ -137,58 +135,9 @@ class WorkoutSerializer(serializers.HyperlinkedModelSerializer): instance.date = validated_data.get("date", instance.date) instance.save() - # Handle ExerciseInstances - - # This updates existing exercise instances without adding or deleting object. - # zip() will yield n 2-tuples, where n is - # min(len(exercise_instance), len(exercise_instance_data)) - for exercise_instance, exercise_instance_data in zip( - exercise_instances.all(), exercise_instances_data - ): - exercise_instance.exercise = exercise_instance_data.get( - "exercise", exercise_instance.exercise - ) - exercise_instance.number = exercise_instance_data.get( - "number", exercise_instance.number - ) - exercise_instance.sets = exercise_instance_data.get( - "sets", exercise_instance.sets - ) - exercise_instance.save() - - # If new exercise instances have been added to the workout, then create them - if len(exercise_instances_data) > len(exercise_instances.all()): - for i in range(len(exercise_instances.all()), len(exercise_instances_data)): - exercise_instance_data = exercise_instances_data[i] - ExerciseInstance.objects.create( - workout=instance, **exercise_instance_data - ) - # Else if exercise instances have been removed from the workout, then delete them - elif len(exercise_instances_data) < len(exercise_instances.all()): - for i in range(len(exercise_instances_data), len(exercise_instances.all())): - exercise_instances.all()[i].delete() + handle_exercise_instance(validated_data, instance) - # Handle WorkoutFiles - - if "files" in validated_data: - files_data = validated_data.pop("files") - files = instance.files - - for file, file_data in zip(files.all(), files_data): - file.file = file_data.get("file", file.file) - - # If new files have been added, creating new WorkoutFiles - if len(files_data) > len(files.all()): - for i in range(len(files.all()), len(files_data)): - WorkoutFile.objects.create( - workout=instance, - owner=instance.owner, - file=files_data[i].get("file"), - ) - # Else if files have been removed, delete WorkoutFiles - elif len(files_data) < len(files.all()): - for i in range(len(files_data), len(files.all())): - files.all()[i].delete() + handle_workout_files(validated_data, instance) return instance @@ -204,6 +153,64 @@ class WorkoutSerializer(serializers.HyperlinkedModelSerializer): return obj.owner.username +def handle_exercise_instance(validated_data, instance): + """This updates existing exercise instances without adding or deleting object. + zip() will yield n 2-tuples, where n is + min(len(exercise_instance), len(exercise_instance_data)) + """ + exercise_instances_data = validated_data.pop("exercise_instances") + exercise_instances = instance.exercise_instances + + for exercise_instance, exercise_instance_data in zip( + exercise_instances.all(), exercise_instances_data + ): + exercise_instance.exercise = exercise_instance_data.get( + "exercise", exercise_instance.exercise + ) + exercise_instance.number = exercise_instance_data.get( + "number", exercise_instance.number + ) + exercise_instance.sets = exercise_instance_data.get( + "sets", exercise_instance.sets + ) + exercise_instance.save() + + # If new exercise instances have been added to the workout, then create them + if len(exercise_instances_data) > len(exercise_instances.all()): + for i in range(len(exercise_instances.all()), len(exercise_instances_data)): + exercise_instance_data = exercise_instances_data[i] + ExerciseInstance.objects.create( + workout=instance, **exercise_instance_data + ) + # Else if exercise instances have been removed from the workout, then delete them + elif len(exercise_instances_data) < len(exercise_instances.all()): + for i in range(len(exercise_instances_data), len(exercise_instances.all())): + exercise_instances.all()[i].delete() + + +def handle_workout_files(validated_data, instance): + """Handles the updating of exercises in a workout instance.""" + if "files" in validated_data: + files_data = validated_data.pop("files") + files = instance.files + + for file, file_data in zip(files.all(), files_data): + file.file = file_data.get("file", file.file) + + # If new files have been added, creating new WorkoutFiles + if len(files_data) > len(files.all()): + for i in range(len(files.all()), len(files_data)): + WorkoutFile.objects.create( + workout=instance, + owner=instance.owner, + file=files_data[i].get("file"), + ) + # Else if files have been removed, delete WorkoutFiles + elif len(files_data) < len(files.all()): + for i in range(len(files_data), len(files.all())): + files.all()[i].delete() + + class ExerciseSerializer(serializers.HyperlinkedModelSerializer): """Serializer for an Exercise. Hyperlinks are used for relationships by default. diff --git a/backend/secfit/workouts/views.py b/backend/secfit/workouts/views.py index 3c708523e49ad2e32fc3de01c0eea13b99d57e9d..2212458d90d12340df4de314ec7767597ba2cdef 100644 --- a/backend/secfit/workouts/views.py +++ b/backend/secfit/workouts/views.py @@ -73,10 +73,10 @@ class RememberMe( return Response({"remember_me": self.remember_me()}) def post(self, request): - cookieObject = namedtuple("Cookies", request.COOKIES.keys())( + cookie_object = namedtuple("Cookies", request.COOKIES.keys())( *request.COOKIES.values() ) - user = self.get_user(cookieObject) + user = self.get_user(cookie_object) refresh = RefreshToken.for_user(user) return Response( { @@ -85,8 +85,8 @@ class RememberMe( } ) - def get_user(self, cookieObject): - decode = base64.b64decode(cookieObject.remember_me) + def get_user(self, cookie_object): + decode = base64.b64decode(cookie_object.remember_me) user, sign = pickle.loads(decode) # Validate signature @@ -300,7 +300,7 @@ class WorkoutFileList( CreateListModelMixin, generics.GenericAPIView, ): - """Class defining the web response for the getting and creating list for workout files. + """Class defining the web response for the getting and creating list for workout files. HTTP methods: GET, POST """ @@ -340,7 +340,7 @@ class WorkoutFileDetail( mixins.DestroyModelMixin, generics.GenericAPIView, ): - """Class defining the web response for the getting deleting workout file details. + """Class defining the web response for the getting deleting workout file details. HTTP methods: GET, POST """