diff --git a/.gitignore b/.gitignore index ca6c010..b459d1b 100644 --- a/.gitignore +++ b/.gitignore @@ -3,7 +3,7 @@ *.pot *.pyc __pycache__ -db.sqlite3 +#db.sqlite3 media # Backup files # diff --git a/db.sqlite3 b/db.sqlite3 new file mode 100644 index 0000000..409b80b Binary files /dev/null and b/db.sqlite3 differ diff --git a/db_bk.sqlite3 b/db_bk.sqlite3 deleted file mode 100644 index ffa51d8..0000000 Binary files a/db_bk.sqlite3 and /dev/null differ diff --git a/equipment/admin.py b/equipment/admin.py index eff59a6..973248f 100644 --- a/equipment/admin.py +++ b/equipment/admin.py @@ -5,4 +5,8 @@ from .models import * # Register your models here. @admin.register(Equipment) class EquipmentAdmin(ImportExportModelAdmin): - list_display = ("name", "is_weight", "category",) \ No newline at end of file + list_display = ("name", "is_weight", "category",) + +@admin.register(WorkoutEquipment) +class WorkoutEquipmentAdmin(ImportExportModelAdmin): + list_display = ("equipment", "exercise",) \ No newline at end of file diff --git a/equipment/migrations/0002_workoutequipment.py b/equipment/migrations/0002_workoutequipment.py new file mode 100644 index 0000000..995e8ff --- /dev/null +++ b/equipment/migrations/0002_workoutequipment.py @@ -0,0 +1,25 @@ +# Generated by Django 4.2.2 on 2023-06-13 02:07 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('exercise', '0002_alter_exercise_options'), + ('equipment', '0001_initial'), + ] + + operations = [ + migrations.CreateModel( + name='WorkoutEquipment', + 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)), + ('equipment', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='workout_exercise_workout', to='equipment.equipment')), + ('exercise', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='workout_exercise_workout', to='exercise.exercise')), + ], + ), + ] diff --git a/equipment/models.py b/equipment/models.py index b3ff340..739d585 100644 --- a/equipment/models.py +++ b/equipment/models.py @@ -1,4 +1,5 @@ from django.db import models +from exercise.models import Exercise # Create your models here. class Equipment(models.Model): @@ -9,4 +10,21 @@ class Equipment(models.Model): name = models.CharField(null=True, blank=True, max_length=64) def __str__(self): - return self.category + " : " + self.name \ No newline at end of file + return self.category + " : " + self.name + +class WorkoutEquipment(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='workout_exercise_workout' + ) + equipment = models.ForeignKey( + Equipment, + on_delete=models.CASCADE, + related_name='workout_exercise_workout' + ) + + def __str__(self): + return self.exercise.name + " : " + self.equipment.name \ No newline at end of file diff --git a/exercise/serializers.py b/exercise/serializers.py index 1ea9665..ff5c66e 100644 --- a/exercise/serializers.py +++ b/exercise/serializers.py @@ -1,9 +1,22 @@ from rest_framework import serializers from .models import * +from muscle.models import ExerciseMuscle +from equipment.models import WorkoutEquipment +from muscle.serializers import ExerciseMuscleSerializer class ExerciseSerializer(serializers.ModelSerializer): + muscles = serializers.SerializerMethodField() + equipment = serializers.SerializerMethodField() return_video_url = serializers.ReadOnlyField() class Meta: model = Exercise - fields = '__all__' \ No newline at end of file + fields = '__all__' + + def get_muscles(self, obj): + objs = ExerciseMuscle.objects.filter(exercise=obj).values_list('muscle__name', flat=True) + return objs + + def get_equipment(self, obj): + objs = WorkoutEquipment.objects.filter(exercise=obj).values_list('equipment__name', flat=True) + return objs \ No newline at end of file diff --git a/exercise/views.py b/exercise/views.py index 2a8591c..3b36c2a 100644 --- a/exercise/views.py +++ b/exercise/views.py @@ -4,7 +4,6 @@ from .serializers import * from django.shortcuts import render from rest_framework.decorators import api_view -from rest_framework.decorators import api_view from rest_framework.response import Response from rest_framework import status from django.contrib.auth.models import User diff --git a/muscle_group/__init__.py b/muscle/__init__.py similarity index 100% rename from muscle_group/__init__.py rename to muscle/__init__.py diff --git a/muscle/admin.py b/muscle/admin.py new file mode 100644 index 0000000..4df1f47 --- /dev/null +++ b/muscle/admin.py @@ -0,0 +1,12 @@ +from django.contrib import admin +from import_export.admin import ImportExportModelAdmin +from .models import * + +# Register your models here. +@admin.register(Muscle) +class MuscleAdmin(ImportExportModelAdmin): + list_display = ("name",) + +@admin.register(ExerciseMuscle) +class ExerciseMuscleAdmin(ImportExportModelAdmin): + list_display = ("exercise", "muscle",) diff --git a/muscle_group/apps.py b/muscle/apps.py similarity index 60% rename from muscle_group/apps.py rename to muscle/apps.py index 0a2ab98..6f254ee 100644 --- a/muscle_group/apps.py +++ b/muscle/apps.py @@ -1,6 +1,6 @@ from django.apps import AppConfig -class MuscleGroupConfig(AppConfig): +class MuscleConfig(AppConfig): default_auto_field = 'django.db.models.BigAutoField' - name = 'muscle_group' + name = 'muscle' diff --git a/muscle/migrations/0001_initial.py b/muscle/migrations/0001_initial.py new file mode 100644 index 0000000..993ebc5 --- /dev/null +++ b/muscle/migrations/0001_initial.py @@ -0,0 +1,23 @@ +# Generated by Django 4.2.2 on 2023-06-13 01:51 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='Muscle', + 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=64, null=True)), + ], + ), + ] diff --git a/muscle/migrations/0002_exercisemuscle.py b/muscle/migrations/0002_exercisemuscle.py new file mode 100644 index 0000000..a454d42 --- /dev/null +++ b/muscle/migrations/0002_exercisemuscle.py @@ -0,0 +1,25 @@ +# Generated by Django 4.2.2 on 2023-06-13 02:37 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('exercise', '0002_alter_exercise_options'), + ('muscle', '0001_initial'), + ] + + operations = [ + migrations.CreateModel( + name='ExerciseMuscle', + 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='exercise_muscle_exercise', to='exercise.exercise')), + ('muscle', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='exercise_muscle_muscle', to='muscle.muscle')), + ], + ), + ] diff --git a/muscle_group/migrations/__init__.py b/muscle/migrations/__init__.py similarity index 100% rename from muscle_group/migrations/__init__.py rename to muscle/migrations/__init__.py diff --git a/muscle_group/models.py b/muscle/models.py similarity index 62% rename from muscle_group/models.py rename to muscle/models.py index fc520f0..ae0d29c 100644 --- a/muscle_group/models.py +++ b/muscle/models.py @@ -2,27 +2,27 @@ from django.db import models from exercise.models import Exercise # Create your models here. -class MuscleGroup(models.Model): +class Muscle(models.Model): created_at = models.DateTimeField(auto_now_add=True) updated_at = models.DateTimeField(auto_now=True) name = models.CharField(null=True, blank=True, max_length=64) - + def __str__(self): - return self.name.name + return self.name -class ExerciseMuscleGroup(models.Model): +class ExerciseMuscle(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='exercise_muscle_group_exercise' + related_name='exercise_muscle_exercise' ) - muscle_group = models.ForeignKey( - MuscleGroup, + muscle = models.ForeignKey( + Muscle, on_delete=models.CASCADE, - related_name='exercise_muscle_group_muscle_group' + related_name='exercise_muscle_muscle' ) def __str__(self): - return self.exercise.name + " : " + self.muscle_group.name \ No newline at end of file + return self.exercise.name + " : " + self.muscle.name \ No newline at end of file diff --git a/muscle/serializers.py b/muscle/serializers.py new file mode 100644 index 0000000..c0eb672 --- /dev/null +++ b/muscle/serializers.py @@ -0,0 +1,7 @@ +from rest_framework import serializers +from .models import ExerciseMuscle + +class ExerciseMuscleSerializer(serializers.ModelSerializer): + class Meta: + model = ExerciseMuscle + fields = '__all__' \ No newline at end of file diff --git a/muscle_group/tests.py b/muscle/tests.py similarity index 100% rename from muscle_group/tests.py rename to muscle/tests.py diff --git a/muscle_group/views.py b/muscle/views.py similarity index 100% rename from muscle_group/views.py rename to muscle/views.py diff --git a/muscle_group/admin.py b/muscle_group/admin.py deleted file mode 100644 index ddedd25..0000000 --- a/muscle_group/admin.py +++ /dev/null @@ -1,11 +0,0 @@ -from django.contrib import admin -from .models import * - -# Register your models here. -@admin.register(MuscleGroup) -class MuscleGroupAdmin(admin.ModelAdmin): - list_display = ("name",) - -@admin.register(ExerciseMuscleGroup) -class ExerciseMuscleGroupAdmin(admin.ModelAdmin): - list_display = ("exercise", "muscle_group",) \ No newline at end of file diff --git a/muscle_group/migrations/0001_initial.py b/muscle_group/migrations/0001_initial.py deleted file mode 100644 index 812874f..0000000 --- a/muscle_group/migrations/0001_initial.py +++ /dev/null @@ -1,35 +0,0 @@ -# Generated by Django 4.2.2 on 2023-06-11 22:00 - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - initial = True - - dependencies = [ - ('exercise', '0001_initial'), - ] - - operations = [ - migrations.CreateModel( - name='MuscleGroup', - 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=64, null=True)), - ], - ), - migrations.CreateModel( - name='ExerciseMuscleGroup', - 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='exercise_muscle_group_exercise', to='exercise.exercise')), - ('muscle_group', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='exercise_muscle_group_muscle_group', to='muscle_group.musclegroup')), - ], - ), - ] diff --git a/muscle_group/serializers.py b/muscle_group/serializers.py deleted file mode 100644 index 901b499..0000000 --- a/muscle_group/serializers.py +++ /dev/null @@ -1,7 +0,0 @@ -from rest_framework import serializers -from models import * - -class MuscleGroup(serializers.ModelSerializer): - class Meta: - model = MuscleGroup - fields = '__all__' diff --git a/scripts/__init__.py b/scripts/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/scripts/admin.py b/scripts/admin.py new file mode 100644 index 0000000..8c38f3f --- /dev/null +++ b/scripts/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/scripts/apps.py b/scripts/apps.py new file mode 100644 index 0000000..1a6a946 --- /dev/null +++ b/scripts/apps.py @@ -0,0 +1,6 @@ +from django.apps import AppConfig + + +class ScriptsConfig(AppConfig): + default_auto_field = 'django.db.models.BigAutoField' + name = 'scripts' diff --git a/scripts/migrations/__init__.py b/scripts/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/scripts/models.py b/scripts/models.py new file mode 100644 index 0000000..71a8362 --- /dev/null +++ b/scripts/models.py @@ -0,0 +1,3 @@ +from django.db import models + +# Create your models here. diff --git a/scripts/tests.py b/scripts/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/scripts/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/scripts/urls.py b/scripts/urls.py new file mode 100644 index 0000000..2d833e1 --- /dev/null +++ b/scripts/urls.py @@ -0,0 +1,8 @@ +from django.urls import path +from . import views + + +urlpatterns = [ + # path('sync_equipment/', views.sync_equipment, name='sync_equipment'), + path('sync_muscle_groups/', views.sync_equipment, name='sync_equipment'), +] \ No newline at end of file diff --git a/scripts/views.py b/scripts/views.py new file mode 100644 index 0000000..d5cda45 --- /dev/null +++ b/scripts/views.py @@ -0,0 +1,42 @@ +from django.shortcuts import render +from exercise.models import Exercise +from muscle.models import Muscle, ExerciseMuscle +from equipment.models import Equipment, WorkoutEquipment +from rest_framework.decorators import api_view +from rest_framework.response import Response +from rest_framework import status + +# Create your views here. +@api_view(['GET']) +def sync_equipment(request): + all_exercise = Exercise.objects.all() + for exercise in all_exercise: + all_equipment = exercise.equipment_required.split(',') + for equipment in all_equipment: + if len(equipment) > 0: + try: + equipment_obj = Equipment.objects.get(name=equipment) + WorkoutEquipment.objects.create(exercise=exercise, equipment=equipment_obj).save() + except Equipment.DoesNotExist: + pass + + + return Response(status=status.HTTP_200_OK) + +@api_view(['GET']) +def sync_equipment(request): + all_exercise = Exercise.objects.all() + for exercise in all_exercise: + all_muscle_groups = exercise.muscle_groups.split(',') + for muscle_group in all_muscle_groups: + if len(muscle_group) > 0: + try: + print(muscle_group) + muscle_obj = Muscle.objects.get(name=muscle_group) + print(muscle_obj) + ExerciseMuscle.objects.create(exercise=exercise, muscle=muscle_obj).save() + except MuscleGroup.DoesNotExist: + pass + + + return Response(status=status.HTTP_200_OK) \ No newline at end of file diff --git a/todo b/todo index 3f5e711..68512c4 100644 --- a/todo +++ b/todo @@ -1,6 +1,14 @@ -split equipment_required form exercises into their own model -split muscle_groups form exercises into their own model + + registration login re-set password -workouts grouped by creator +nsfw breaks + + +dokku - https://dokku.com + + + +mabye: +workouts grouped by creator (maybe do this client side) diff --git a/werkout_api/settings.py b/werkout_api/settings.py index 4d8f2b9..0bca293 100644 --- a/werkout_api/settings.py +++ b/werkout_api/settings.py @@ -45,9 +45,10 @@ INSTALLED_APPS = [ 'equipment', 'exercise', - 'muscle_group', 'registered_user', - 'workout' + 'workout', + 'muscle', + 'scripts' ] MIDDLEWARE = [ diff --git a/werkout_api/urls.py b/werkout_api/urls.py index a4927ae..9fed433 100644 --- a/werkout_api/urls.py +++ b/werkout_api/urls.py @@ -8,6 +8,7 @@ urlpatterns = [ path('workout/', include('workout.urls')), path('exercise/', include('exercise.urls')), + path('scripts/', include('scripts.urls')), ] diff --git a/workout/serializers.py b/workout/serializers.py index 6addd4e..fe0fa92 100644 --- a/workout/serializers.py +++ b/workout/serializers.py @@ -27,7 +27,7 @@ class CompleteWorkoutSerializer(serializers.ModelSerializer): return completed_workout class WorkoutSerializer(serializers.ModelSerializer): - exercise = WorkoutExerciseSerializer(source='workout_exercise_workout', many=True) + # exercise = WorkoutExerciseSerializer(source='workout_exercise_workout', many=True) class Meta: model = Workout