diff --git a/db.sqlite3 b/db.sqlite3 index a9c3f9c..ee12763 100644 Binary files a/db.sqlite3 and b/db.sqlite3 differ diff --git a/equipment/serializers.py b/equipment/serializers.py index caa50f5..a08767a 100644 --- a/equipment/serializers.py +++ b/equipment/serializers.py @@ -1,13 +1,18 @@ from rest_framework import serializers from .models import * -class EquipmentSerializer(serializers.ModelSerializer): +class EquipmentSerializer(serializers.ModelSerializer): class Meta: model = Equipment fields = '__all__' class WorkoutEquipmentSerializer(serializers.ModelSerializer): + name = serializers.SerializerMethodField() + class Meta: model = WorkoutEquipment - fields = '__all__' \ No newline at end of file + fields = '__all__' + + def get_name(self, obj): + return obj.equipment.name \ No newline at end of file diff --git a/exercise/serializers.py b/exercise/serializers.py index 3f09e51..20b084f 100644 --- a/exercise/serializers.py +++ b/exercise/serializers.py @@ -6,9 +6,14 @@ from muscle.serializers import ExerciseMuscleSerializer from equipment.serializers import WorkoutEquipmentSerializer class ExerciseMuscleSerializer(serializers.ModelSerializer): + name = serializers.SerializerMethodField() + class Meta: model = ExerciseMuscle fields = '__all__' + + def get_name(self, obj): + return obj.muscle.name class ExerciseSerializer(serializers.ModelSerializer): muscles = serializers.SerializerMethodField() diff --git a/superset/__init__.py b/superset/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/superset/admin.py b/superset/admin.py new file mode 100644 index 0000000..5301cae --- /dev/null +++ b/superset/admin.py @@ -0,0 +1,22 @@ +from django.contrib import admin +from import_export.admin import ImportExportModelAdmin +from .models import * + +# Register your models here. +@admin.register(SupersetExercise) +class SupersetExerciseAdmin(ImportExportModelAdmin): + search_fields = ['exercise'] + + +class SupersetExerciseInline(admin.StackedInline): + model = SupersetExercise + ordering = ("pk",) + extra = 0 + +@admin.register(Superset) +class SupersetAdmin(ImportExportModelAdmin): + list_display = ("name", "workout", "order", "rounds",) + ordering = ("order",) + inlines = [ + SupersetExerciseInline, + ] \ No newline at end of file diff --git a/superset/apps.py b/superset/apps.py new file mode 100644 index 0000000..73bf8c2 --- /dev/null +++ b/superset/apps.py @@ -0,0 +1,6 @@ +from django.apps import AppConfig + + +class SupersetConfig(AppConfig): + default_auto_field = 'django.db.models.BigAutoField' + name = 'superset' diff --git a/superset/migrations/0001_initial.py b/superset/migrations/0001_initial.py new file mode 100644 index 0000000..b549b08 --- /dev/null +++ b/superset/migrations/0001_initial.py @@ -0,0 +1,38 @@ +# Generated by Django 4.2.2 on 2023-07-17 18:54 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ('exercise', '0006_alter_exercise_name'), + ('workout', '0011_alter_completedworkout_notes'), + ] + + operations = [ + migrations.CreateModel( + name='Superset', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created_at', models.DateTimeField(auto_now_add=True)), + ('updated_at', models.DateTimeField(auto_now=True)), + ('name', models.CharField(blank=True, max_length=255, null=True)), + ('rounds', models.IntegerField(blank=True, max_length=3, null=True)), + ('workout', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='workout.workout')), + ], + ), + migrations.CreateModel( + name='SupersetExercise', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created_at', models.DateTimeField(auto_now_add=True)), + ('updated_at', models.DateTimeField(auto_now=True)), + ('exercise', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='superset_exercise_exercise', to='exercise.exercise')), + ('superset', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='superset_exercise_exercise', to='superset.superset')), + ], + ), + ] diff --git a/superset/migrations/0002_supersetexercise_duration_supersetexercise_reps_and_more.py b/superset/migrations/0002_supersetexercise_duration_supersetexercise_reps_and_more.py new file mode 100644 index 0000000..3ab743f --- /dev/null +++ b/superset/migrations/0002_supersetexercise_duration_supersetexercise_reps_and_more.py @@ -0,0 +1,28 @@ +# Generated by Django 4.2.2 on 2023-07-17 18:56 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('superset', '0001_initial'), + ] + + operations = [ + migrations.AddField( + model_name='supersetexercise', + name='duration', + field=models.IntegerField(blank=True, max_length=4, null=True), + ), + migrations.AddField( + model_name='supersetexercise', + name='reps', + field=models.IntegerField(blank=True, max_length=4, null=True), + ), + migrations.AddField( + model_name='supersetexercise', + name='weight', + field=models.IntegerField(blank=True, max_length=4, null=True), + ), + ] diff --git a/superset/migrations/0003_superset_order.py b/superset/migrations/0003_superset_order.py new file mode 100644 index 0000000..29335db --- /dev/null +++ b/superset/migrations/0003_superset_order.py @@ -0,0 +1,18 @@ +# Generated by Django 4.2.2 on 2023-07-17 18:57 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('superset', '0002_supersetexercise_duration_supersetexercise_reps_and_more'), + ] + + operations = [ + migrations.AddField( + model_name='superset', + name='order', + field=models.IntegerField(blank=True, max_length=3, null=True), + ), + ] diff --git a/superset/migrations/0004_alter_superset_order_alter_superset_rounds.py b/superset/migrations/0004_alter_superset_order_alter_superset_rounds.py new file mode 100644 index 0000000..b6640f1 --- /dev/null +++ b/superset/migrations/0004_alter_superset_order_alter_superset_rounds.py @@ -0,0 +1,25 @@ +# Generated by Django 4.2.2 on 2023-07-17 18:57 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('superset', '0003_superset_order'), + ] + + operations = [ + migrations.AlterField( + model_name='superset', + name='order', + field=models.IntegerField(default=1, max_length=3), + preserve_default=False, + ), + migrations.AlterField( + model_name='superset', + name='rounds', + field=models.IntegerField(default=1, max_length=3), + preserve_default=False, + ), + ] diff --git a/superset/migrations/0005_supersetexercise_order.py b/superset/migrations/0005_supersetexercise_order.py new file mode 100644 index 0000000..78a5679 --- /dev/null +++ b/superset/migrations/0005_supersetexercise_order.py @@ -0,0 +1,19 @@ +# Generated by Django 4.2.2 on 2023-07-17 19:03 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('superset', '0004_alter_superset_order_alter_superset_rounds'), + ] + + operations = [ + migrations.AddField( + model_name='supersetexercise', + name='order', + field=models.IntegerField(default=1, max_length=3), + preserve_default=False, + ), + ] diff --git a/superset/migrations/__init__.py b/superset/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/superset/models.py b/superset/models.py new file mode 100644 index 0000000..9412a48 --- /dev/null +++ b/superset/models.py @@ -0,0 +1,41 @@ +from django.db import models +from workout.models import Workout +from exercise.models import Exercise + +# Create your models here. +class Superset(models.Model): + created_at = models.DateTimeField(auto_now_add=True) + updated_at = models.DateTimeField(auto_now=True) + name = models.CharField(max_length=255, blank=True, null=True) + + workout = models.ForeignKey( + Workout, + on_delete=models.CASCADE + ) + + rounds = models.IntegerField(max_length=3, blank=False, null=False) + order = models.IntegerField(max_length=3, blank=False, null=False) + + def __str__(self): + return self.name #+ " : " + self.description + " | by: " + self.registered_user.nick_name + +class SupersetExercise(models.Model): + created_at = models.DateTimeField(auto_now_add=True) + updated_at = models.DateTimeField(auto_now=True) + + exercise = models.ForeignKey( + Exercise, + on_delete=models.CASCADE, + related_name='superset_exercise_exercise' + ) + + superset = models.ForeignKey( + Superset, + on_delete=models.CASCADE, + related_name='superset_exercise_exercise' + ) + + weight = models.IntegerField(null=True, blank=True, max_length=4) + reps = models.IntegerField(null=True, blank=True, max_length=4) + duration = models.IntegerField(null=True, blank=True, max_length=4) + order = models.IntegerField(max_length=3, blank=False, null=False) \ No newline at end of file diff --git a/superset/serializers.py b/superset/serializers.py new file mode 100644 index 0000000..d301d7b --- /dev/null +++ b/superset/serializers.py @@ -0,0 +1,27 @@ +from rest_framework import serializers +from .models import * +from exercise.models import Exercise +from exercise.serializers import ExerciseSerializer + +class SupersetExerciseSerializer(serializers.ModelSerializer): + exercise = serializers.SerializerMethodField() + + class Meta: + model = SupersetExercise + fields = '__all__' + + def get_exercise(self, obj): + data = ExerciseSerializer(obj.exercise, many=False).data + return data + +class SupersetSerializer(serializers.ModelSerializer): + exercises = serializers.SerializerMethodField() + + class Meta: + model = Superset + fields = '__all__' + + def get_exercises(self, obj): + objs = SupersetExercise.objects.filter(superset=obj).order_by('order') + data = SupersetExerciseSerializer(objs, many=True).data + return data diff --git a/superset/tests.py b/superset/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/superset/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/superset/views.py b/superset/views.py new file mode 100644 index 0000000..91ea44a --- /dev/null +++ b/superset/views.py @@ -0,0 +1,3 @@ +from django.shortcuts import render + +# Create your views here. diff --git a/werkout_api/settings.py b/werkout_api/settings.py index e121700..c0eb1e7 100644 --- a/werkout_api/settings.py +++ b/werkout_api/settings.py @@ -40,7 +40,8 @@ INSTALLED_APPS = [ 'workout', 'muscle', 'scripts', - 'video' + 'video', + 'superset' ] MIDDLEWARE = [ diff --git a/workout/serializers.py b/workout/serializers.py index ba89425..490740a 100644 --- a/workout/serializers.py +++ b/workout/serializers.py @@ -6,6 +6,8 @@ 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 +from superset.models import Superset, SupersetExercise class WorkoutExerciseSerializer(serializers.ModelSerializer): exercise = ExerciseSerializer(read_only=True) @@ -49,20 +51,30 @@ class WorkoutSerializer(serializers.ModelSerializer): # depth = 1 def get_muscles(self, obj): - exercises = WorkoutExercise.objects.filter(workout=obj).values_list('exercise__id') - muscles_names = ExerciseMuscle.objects.filter(exercise__id__in=exercises).values_list('muscle__name', flat=True) + 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): - exercises = WorkoutExercise.objects.filter(workout=obj).values_list('exercise__id') - equipment_names = WorkoutEquipment.objects.filter(exercise__id__in=exercises).values_list('equipment__name', flat=True) + 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): - return WorkoutExercise.objects.filter(workout=obj).count() + 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): - exercises = serializers.SerializerMethodField() + supersets = serializers.SerializerMethodField() registered_user = serializers.SerializerMethodField() male_videos = serializers.SerializerMethodField() female_videos = serializers.SerializerMethodField() @@ -70,12 +82,12 @@ class WorkoutDetailSerializer(serializers.ModelSerializer): class Meta: model = Workout - fields = ('id', 'name', 'description', 'exercises', 'registered_user', 'male_videos', 'female_videos', 'both_videos') + fields = ('id', 'name', 'description', 'supersets', 'registered_user', 'male_videos', 'female_videos', 'both_videos') depth = 1 - def get_exercises(self, obj): - objs = WorkoutExercise.objects.filter(workout=obj).order_by('created_at') - data = WorkoutExerciseSerializer(objs, many=True).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):