From 31604613520be83d6cf734441359d02545632c4f Mon Sep 17 00:00:00 2001
From: AleksanderWK <aleksawk@stud.ntnu.no>
Date: Sat, 26 Mar 2022 13:06:50 +0100
Subject: [PATCH 1/2] Refactor WorkoutSerializer class

---
 backend/secfit/workouts/serializers.py | 40 +++++++++++++++-----------
 1 file changed, 23 insertions(+), 17 deletions(-)

diff --git a/backend/secfit/workouts/serializers.py b/backend/secfit/workouts/serializers.py
index 33c5c03..0d56703 100644
--- a/backend/secfit/workouts/serializers.py
+++ b/backend/secfit/workouts/serializers.py
@@ -150,6 +150,26 @@ class WorkoutSerializer(serializers.HyperlinkedModelSerializer):
             )
             exercise_instance.save()
 
+        self.handle_exercise_instances(instance, exercise_instances_data, exercise_instances)
+
+        # Handle WorkoutFiles
+        self.handle_workout_files(instance, validated_data)
+
+        return instance
+
+    def get_owner_username(self, obj):
+        """Returns the owning user's username
+
+        Args:
+            obj (Workout): Current Workout
+
+        Returns:
+            str: Username of owner
+        """
+        return obj.owner.username
+
+    # Helper method for updating exercise instances in workouts
+    def handle_exercise_instances(self, instance, exercise_instances_data, exercise_instances):
         # 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)):
@@ -161,9 +181,9 @@ class WorkoutSerializer(serializers.HyperlinkedModelSerializer):
         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 WorkoutFiles
-
+    
+    # Helper method for updating workout files
+    def handle_workout_files(self, instance, validated_data):
         if "files" in validated_data:
             files_data = validated_data.pop("files")
             files = instance.files
@@ -184,20 +204,6 @@ class WorkoutSerializer(serializers.HyperlinkedModelSerializer):
                 for i in range(len(files_data), len(files.all())):
                     files.all()[i].delete()
 
-        return instance
-
-    def get_owner_username(self, obj):
-        """Returns the owning user's username
-
-        Args:
-            obj (Workout): Current Workout
-
-        Returns:
-            str: Username of owner
-        """
-        return obj.owner.username
-
-
 class ExerciseSerializer(serializers.HyperlinkedModelSerializer):
     """Serializer for an Exercise. Hyperlinks are used for relationships by default.
 
-- 
GitLab


From 23c2c56a32dcf567f73de64d1c81640231927e8e Mon Sep 17 00:00:00 2001
From: AleksanderWK <aleksawk@stud.ntnu.no>
Date: Sat, 26 Mar 2022 13:46:45 +0100
Subject: [PATCH 2/2] Add greater method extraction

---
 backend/secfit/workouts/serializers.py | 34 ++++++++++++--------------
 1 file changed, 16 insertions(+), 18 deletions(-)

diff --git a/backend/secfit/workouts/serializers.py b/backend/secfit/workouts/serializers.py
index 0d56703..1390bc4 100644
--- a/backend/secfit/workouts/serializers.py
+++ b/backend/secfit/workouts/serializers.py
@@ -132,24 +132,6 @@ class WorkoutSerializer(serializers.HyperlinkedModelSerializer):
         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()
-
         self.handle_exercise_instances(instance, exercise_instances_data, exercise_instances)
 
         # Handle WorkoutFiles
@@ -170,6 +152,22 @@ class WorkoutSerializer(serializers.HyperlinkedModelSerializer):
 
     # Helper method for updating exercise instances in workouts
     def handle_exercise_instances(self, instance, exercise_instances_data, exercise_instances):
+        # 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)):
-- 
GitLab