Files
WerkoutAPI/workout/serializers.py
Trey t 67372cc8ab WIP
2023-07-27 19:07:35 -05:00

155 lines
6.5 KiB
Python

from rest_framework import serializers
from .models import *
from exercise.serializers import ExerciseSerializer
from registered_user.serializers import GetRegisteredUserSerializer
from muscle.models import ExerciseMuscle
from equipment.models import WorkoutEquipment
from video.models import Video
from video.serializers import VideoSerializer
from superset.serializers import SupersetSerializer, SupersetExerciseSerializer
from superset.models import Superset, SupersetExercise
class WorkoutExerciseSerializer(serializers.ModelSerializer):
exercise = ExerciseSerializer(read_only=True)
duration_audio = serializers.ReadOnlyField()
weight_audio = serializers.ReadOnlyField()
class Meta:
model = WorkoutExercise
fields = ('workout', 'exercise','weight','reps','duration','duration_audio','weight_audio', 'created_at',)
class CompleteWorkoutSerializer(serializers.ModelSerializer):
class Meta:
model = CompletedWorkout
exclude = ['registered_user']
def create(self, validated_data):
registered_user_id = self.context.get("registered_user")
registered_user = RegisteredUser.objects.get(id=registered_user_id)
completed_workout = CompletedWorkout.objects.create(
registered_user=registered_user,
workout=validated_data['workout'],
difficulty=validated_data['difficulty'],
total_time=validated_data['total_time'],
workout_start_time=validated_data['workout_start_time'],
notes=validated_data['notes'],
total_calories=validated_data['total_calories']
)
completed_workout.save()
return completed_workout
class WorkoutSerializer(serializers.ModelSerializer):
# exercise = WorkoutExerciseSerializer(source='workout_exercise_workout', many=True)
registered_user = GetRegisteredUserSerializer(many=False, read_only=True)
muscles = serializers.SerializerMethodField()
equipment = serializers.SerializerMethodField()
exercise_count = serializers.SerializerMethodField()
class Meta:
model = Workout
fields = '__all__'
# depth = 1
def get_muscles(self, obj):
superset_ids = Superset.objects.filter(workout=obj).values_list('id')
exercise_ids = SupersetExercise.objects.filter(superset__id__in=superset_ids).values_list('exercise__id')
muscles_names = ExerciseMuscle.objects.filter(exercise__id__in=exercise_ids).values_list('muscle__name', flat=True)
return list(set(muscles_names))
# muscles_names = ExerciseMuscle.objects.filter(exercise__id__in=exercises).values_list('muscle__name', flat=True)
# return list(set(muscles_names))
def get_equipment(self, obj):
superset_ids = Superset.objects.filter(workout=obj).values_list('id')
exercise_ids = SupersetExercise.objects.filter(superset__id__in=superset_ids).values_list('exercise__id')
equipment_names = WorkoutEquipment.objects.filter(exercise__id__in=exercise_ids).values_list('equipment__name', flat=True)
return list(set(equipment_names))
def get_exercise_count(self, obj):
returnValue = 0
supersets = Superset.objects.filter(workout=obj)
for superset in supersets:
exercise_count = SupersetExercise.objects.filter(superset=superset).count()
returnValue += (superset.rounds * exercise_count)
return returnValue
class WorkoutDetailSerializer(serializers.ModelSerializer):
supersets = serializers.SerializerMethodField()
registered_user = serializers.SerializerMethodField()
male_videos = serializers.SerializerMethodField()
female_videos = serializers.SerializerMethodField()
both_videos = serializers.SerializerMethodField()
all_superset_exercise = serializers.SerializerMethodField()
class Meta:
model = Workout
fields = ('id', 'name', 'description', 'supersets', 'registered_user', 'male_videos', 'female_videos', 'both_videos', 'estimated_time', 'all_superset_exercise', )
depth = 1
def get_all_superset_exercise(self, obj):
all_superset_exercise = []
supersets = Superset.objects.filter(workout=obj).order_by('order')
for superset in supersets:
supersetExercises = SupersetExercise.objects.filter(superset=superset).order_by('order')
for x in range(0, superset.rounds):
all_superset_exercise += supersetExercises
data = SupersetExerciseSerializer(all_superset_exercise, many=True).data
return data
def get_supersets(self, obj):
objs = Superset.objects.filter(workout=obj).order_by('order')
data = SupersetSerializer(objs, many=True).data
return data
def get_registered_user(self, obj):
objs = RegisteredUser.objects.get(pk=obj.registered_user.pk)
data = GetRegisteredUserSerializer(objs, many=False).data
return data
def get_male_videos(self, obj):
data = Video.objects.filter(gender=1).values_list('video_file', flat=True)
return data
def get_female_videos(self, obj):
data = Video.objects.filter(gender=2).values_list('video_file', flat=True)
return data
def get_both_videos(self, obj):
data = Video.objects.filter(gender=3).values_list('video_file', flat=True)
return data
class GetCompleteWorkoutSerializer(serializers.ModelSerializer):
workout = WorkoutSerializer(many=False, read_only=True)
class Meta:
model = CompletedWorkout
exclude = ['registered_user']
class POSTCompleteWorkoutSerializer(serializers.ModelSerializer):
class Meta:
model = Workout
exclude = ['registered_user']
class PlannedWorkoutSerializer(serializers.ModelSerializer):
workout = POSTCompleteWorkoutSerializer(many=False, read_only=True)
class Meta:
model = PlannedWorkout
exclude = ['registered_user']
depth = 1
class POSTPlannedWorkoutSerializer(serializers.ModelSerializer):
class Meta:
model = PlannedWorkout
exclude = ['registered_user']
def create(self, validated_data):
print(validated_data)
registered_user_id = self.context.get("registered_user")
registered_user = RegisteredUser.objects.get(id=registered_user_id)
planned_workout = PlannedWorkout.objects.create(
registered_user=registered_user,
workout=validated_data['workout'],
on_date=validated_data['on_date']
)
planned_workout.save()
return planned_workout