WIP
This commit is contained in:
2
.gitignore
vendored
2
.gitignore
vendored
@@ -3,7 +3,7 @@
|
|||||||
*.pot
|
*.pot
|
||||||
*.pyc
|
*.pyc
|
||||||
__pycache__
|
__pycache__
|
||||||
db.sqlite3
|
#db.sqlite3
|
||||||
media
|
media
|
||||||
|
|
||||||
# Backup files #
|
# Backup files #
|
||||||
|
|||||||
BIN
db.sqlite3
Normal file
BIN
db.sqlite3
Normal file
Binary file not shown.
BIN
db_bk.sqlite3
BIN
db_bk.sqlite3
Binary file not shown.
@@ -6,3 +6,7 @@ from .models import *
|
|||||||
@admin.register(Equipment)
|
@admin.register(Equipment)
|
||||||
class EquipmentAdmin(ImportExportModelAdmin):
|
class EquipmentAdmin(ImportExportModelAdmin):
|
||||||
list_display = ("name", "is_weight", "category",)
|
list_display = ("name", "is_weight", "category",)
|
||||||
|
|
||||||
|
@admin.register(WorkoutEquipment)
|
||||||
|
class WorkoutEquipmentAdmin(ImportExportModelAdmin):
|
||||||
|
list_display = ("equipment", "exercise",)
|
||||||
25
equipment/migrations/0002_workoutequipment.py
Normal file
25
equipment/migrations/0002_workoutequipment.py
Normal file
@@ -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')),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
]
|
||||||
@@ -1,4 +1,5 @@
|
|||||||
from django.db import models
|
from django.db import models
|
||||||
|
from exercise.models import Exercise
|
||||||
|
|
||||||
# Create your models here.
|
# Create your models here.
|
||||||
class Equipment(models.Model):
|
class Equipment(models.Model):
|
||||||
@@ -10,3 +11,20 @@ class Equipment(models.Model):
|
|||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return self.category + " : " + self.name
|
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
|
||||||
@@ -1,9 +1,22 @@
|
|||||||
from rest_framework import serializers
|
from rest_framework import serializers
|
||||||
from .models import *
|
from .models import *
|
||||||
|
from muscle.models import ExerciseMuscle
|
||||||
|
from equipment.models import WorkoutEquipment
|
||||||
|
from muscle.serializers import ExerciseMuscleSerializer
|
||||||
|
|
||||||
class ExerciseSerializer(serializers.ModelSerializer):
|
class ExerciseSerializer(serializers.ModelSerializer):
|
||||||
|
muscles = serializers.SerializerMethodField()
|
||||||
|
equipment = serializers.SerializerMethodField()
|
||||||
return_video_url = serializers.ReadOnlyField()
|
return_video_url = serializers.ReadOnlyField()
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = Exercise
|
model = Exercise
|
||||||
fields = '__all__'
|
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
|
||||||
@@ -4,7 +4,6 @@ from .serializers import *
|
|||||||
|
|
||||||
from django.shortcuts import render
|
from django.shortcuts import render
|
||||||
from rest_framework.decorators import api_view
|
from rest_framework.decorators import api_view
|
||||||
from rest_framework.decorators import api_view
|
|
||||||
from rest_framework.response import Response
|
from rest_framework.response import Response
|
||||||
from rest_framework import status
|
from rest_framework import status
|
||||||
from django.contrib.auth.models import User
|
from django.contrib.auth.models import User
|
||||||
|
|||||||
12
muscle/admin.py
Normal file
12
muscle/admin.py
Normal file
@@ -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",)
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
from django.apps import AppConfig
|
from django.apps import AppConfig
|
||||||
|
|
||||||
|
|
||||||
class MuscleGroupConfig(AppConfig):
|
class MuscleConfig(AppConfig):
|
||||||
default_auto_field = 'django.db.models.BigAutoField'
|
default_auto_field = 'django.db.models.BigAutoField'
|
||||||
name = 'muscle_group'
|
name = 'muscle'
|
||||||
23
muscle/migrations/0001_initial.py
Normal file
23
muscle/migrations/0001_initial.py
Normal file
@@ -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)),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
]
|
||||||
25
muscle/migrations/0002_exercisemuscle.py
Normal file
25
muscle/migrations/0002_exercisemuscle.py
Normal file
@@ -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')),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
]
|
||||||
@@ -2,27 +2,27 @@ from django.db import models
|
|||||||
from exercise.models import Exercise
|
from exercise.models import Exercise
|
||||||
|
|
||||||
# Create your models here.
|
# Create your models here.
|
||||||
class MuscleGroup(models.Model):
|
class Muscle(models.Model):
|
||||||
created_at = models.DateTimeField(auto_now_add=True)
|
created_at = models.DateTimeField(auto_now_add=True)
|
||||||
updated_at = models.DateTimeField(auto_now=True)
|
updated_at = models.DateTimeField(auto_now=True)
|
||||||
name = models.CharField(null=True, blank=True, max_length=64)
|
name = models.CharField(null=True, blank=True, max_length=64)
|
||||||
|
|
||||||
def __str__(self):
|
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)
|
created_at = models.DateTimeField(auto_now_add=True)
|
||||||
updated_at = models.DateTimeField(auto_now=True)
|
updated_at = models.DateTimeField(auto_now=True)
|
||||||
exercise = models.ForeignKey(
|
exercise = models.ForeignKey(
|
||||||
Exercise,
|
Exercise,
|
||||||
on_delete=models.CASCADE,
|
on_delete=models.CASCADE,
|
||||||
related_name='exercise_muscle_group_exercise'
|
related_name='exercise_muscle_exercise'
|
||||||
)
|
)
|
||||||
muscle_group = models.ForeignKey(
|
muscle = models.ForeignKey(
|
||||||
MuscleGroup,
|
Muscle,
|
||||||
on_delete=models.CASCADE,
|
on_delete=models.CASCADE,
|
||||||
related_name='exercise_muscle_group_muscle_group'
|
related_name='exercise_muscle_muscle'
|
||||||
)
|
)
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return self.exercise.name + " : " + self.muscle_group.name
|
return self.exercise.name + " : " + self.muscle.name
|
||||||
7
muscle/serializers.py
Normal file
7
muscle/serializers.py
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
from rest_framework import serializers
|
||||||
|
from .models import ExerciseMuscle
|
||||||
|
|
||||||
|
class ExerciseMuscleSerializer(serializers.ModelSerializer):
|
||||||
|
class Meta:
|
||||||
|
model = ExerciseMuscle
|
||||||
|
fields = '__all__'
|
||||||
@@ -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",)
|
|
||||||
@@ -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')),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
]
|
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
from rest_framework import serializers
|
|
||||||
from models import *
|
|
||||||
|
|
||||||
class MuscleGroup(serializers.ModelSerializer):
|
|
||||||
class Meta:
|
|
||||||
model = MuscleGroup
|
|
||||||
fields = '__all__'
|
|
||||||
0
scripts/__init__.py
Normal file
0
scripts/__init__.py
Normal file
3
scripts/admin.py
Normal file
3
scripts/admin.py
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
from django.contrib import admin
|
||||||
|
|
||||||
|
# Register your models here.
|
||||||
6
scripts/apps.py
Normal file
6
scripts/apps.py
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
from django.apps import AppConfig
|
||||||
|
|
||||||
|
|
||||||
|
class ScriptsConfig(AppConfig):
|
||||||
|
default_auto_field = 'django.db.models.BigAutoField'
|
||||||
|
name = 'scripts'
|
||||||
0
scripts/migrations/__init__.py
Normal file
0
scripts/migrations/__init__.py
Normal file
3
scripts/models.py
Normal file
3
scripts/models.py
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
from django.db import models
|
||||||
|
|
||||||
|
# Create your models here.
|
||||||
3
scripts/tests.py
Normal file
3
scripts/tests.py
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
from django.test import TestCase
|
||||||
|
|
||||||
|
# Create your tests here.
|
||||||
8
scripts/urls.py
Normal file
8
scripts/urls.py
Normal file
@@ -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'),
|
||||||
|
]
|
||||||
42
scripts/views.py
Normal file
42
scripts/views.py
Normal file
@@ -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)
|
||||||
14
todo
14
todo
@@ -1,6 +1,14 @@
|
|||||||
split equipment_required form exercises into their own model
|
<!-- split equipment_required form exercises into their own model -->
|
||||||
split muscle_groups form exercises into their own model
|
<!-- split muscle_groups form exercises into their own model -->
|
||||||
registration
|
registration
|
||||||
login
|
login
|
||||||
re-set password
|
re-set password
|
||||||
workouts grouped by creator
|
nsfw breaks
|
||||||
|
|
||||||
|
|
||||||
|
dokku - https://dokku.com
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
mabye:
|
||||||
|
workouts grouped by creator (maybe do this client side)
|
||||||
|
|||||||
@@ -45,9 +45,10 @@ INSTALLED_APPS = [
|
|||||||
|
|
||||||
'equipment',
|
'equipment',
|
||||||
'exercise',
|
'exercise',
|
||||||
'muscle_group',
|
|
||||||
'registered_user',
|
'registered_user',
|
||||||
'workout'
|
'workout',
|
||||||
|
'muscle',
|
||||||
|
'scripts'
|
||||||
]
|
]
|
||||||
|
|
||||||
MIDDLEWARE = [
|
MIDDLEWARE = [
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ urlpatterns = [
|
|||||||
|
|
||||||
path('workout/', include('workout.urls')),
|
path('workout/', include('workout.urls')),
|
||||||
path('exercise/', include('exercise.urls')),
|
path('exercise/', include('exercise.urls')),
|
||||||
|
path('scripts/', include('scripts.urls')),
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ class CompleteWorkoutSerializer(serializers.ModelSerializer):
|
|||||||
return completed_workout
|
return completed_workout
|
||||||
|
|
||||||
class WorkoutSerializer(serializers.ModelSerializer):
|
class WorkoutSerializer(serializers.ModelSerializer):
|
||||||
exercise = WorkoutExerciseSerializer(source='workout_exercise_workout', many=True)
|
# exercise = WorkoutExerciseSerializer(source='workout_exercise_workout', many=True)
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = Workout
|
model = Workout
|
||||||
|
|||||||
Reference in New Issue
Block a user