init commit
init commit
This commit is contained in:
0
workout/__init__.py
Normal file
0
workout/__init__.py
Normal file
25
workout/admin.py
Normal file
25
workout/admin.py
Normal file
@@ -0,0 +1,25 @@
|
||||
from django.contrib import admin
|
||||
from .models import *
|
||||
from exercise.models import Exercise
|
||||
|
||||
# Register your models here.
|
||||
class WorkoutExerciseInline(admin.StackedInline):
|
||||
model = WorkoutExercise
|
||||
ordering = ("pk",)
|
||||
extra = 0
|
||||
|
||||
@admin.register(Workout)
|
||||
class WorkoutAdmin(admin.ModelAdmin):
|
||||
list_display = ("name", "description", "user", "created_at", "updated_at")
|
||||
inlines = [
|
||||
WorkoutExerciseInline,
|
||||
]
|
||||
|
||||
@admin.register(WorkoutExercise)
|
||||
class WorkoutExerciseAdmin(admin.ModelAdmin):
|
||||
list_display = ("workout", "exercise", "weight", "reps", "created_at", "updated_at")
|
||||
|
||||
@admin.register(CompletedWorkout)
|
||||
class CompletedWorkoutAdmin(admin.ModelAdmin):
|
||||
list_display = ("registered_user", "workout", "difficulty", "created_at",)
|
||||
|
||||
6
workout/apps.py
Normal file
6
workout/apps.py
Normal file
@@ -0,0 +1,6 @@
|
||||
from django.apps import AppConfig
|
||||
|
||||
|
||||
class WorkoutConfig(AppConfig):
|
||||
default_auto_field = 'django.db.models.BigAutoField'
|
||||
name = 'workout'
|
||||
51
workout/migrations/0001_initial.py
Normal file
51
workout/migrations/0001_initial.py
Normal file
@@ -0,0 +1,51 @@
|
||||
# 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 = [
|
||||
('registered_user', '0002_remove_registereduser_phone_number'),
|
||||
('exercise', '0001_initial'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.CreateModel(
|
||||
name='Workout',
|
||||
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)),
|
||||
('description', models.CharField(blank=True, max_length=255, null=True)),
|
||||
('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='registered_user.registereduser')),
|
||||
],
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='WorkoutExercise',
|
||||
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)),
|
||||
('weight', models.IntegerField(blank=True, max_length=4, null=True)),
|
||||
('reps', models.IntegerField(blank=True, max_length=4, null=True)),
|
||||
('exercise', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='workout_exercise_exercise', to='exercise.exercise')),
|
||||
('workout', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='workout_exercise_workout', to='workout.workout')),
|
||||
],
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='CompletedWorkout',
|
||||
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)),
|
||||
('difficulty', models.PositiveSmallIntegerField(choices=[(1, 'easy'), (2, 'moderate'), (3, 'average'), (4, 'hard'), (5, 'death')])),
|
||||
('registered_user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='completed_workout_user', to='registered_user.registereduser')),
|
||||
('workout', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='completed_workout_workout', to='workout.workout')),
|
||||
],
|
||||
),
|
||||
]
|
||||
0
workout/migrations/__init__.py
Normal file
0
workout/migrations/__init__.py
Normal file
64
workout/models.py
Normal file
64
workout/models.py
Normal file
@@ -0,0 +1,64 @@
|
||||
from django.db import models
|
||||
from exercise.models import *
|
||||
from registered_user.models import RegisteredUser
|
||||
|
||||
WORKOUT_LEVEL = (
|
||||
(1, "easy"),
|
||||
(2, "moderate"),
|
||||
(3, "average"),
|
||||
(4, "hard"),
|
||||
(5, "death"),
|
||||
)
|
||||
|
||||
# Create your models here.
|
||||
class Workout(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=255)
|
||||
description = models.CharField(null=True, blank=True, max_length=255)
|
||||
user = models.ForeignKey(
|
||||
RegisteredUser,
|
||||
on_delete=models.CASCADE
|
||||
)
|
||||
|
||||
def __str__(self):
|
||||
return self.name + " : " + self.description + " | by: " + self.user.nick_name
|
||||
|
||||
class WorkoutExercise(models.Model):
|
||||
created_at = models.DateTimeField(auto_now_add=True)
|
||||
updated_at = models.DateTimeField(auto_now=True)
|
||||
workout = models.ForeignKey(
|
||||
Workout,
|
||||
on_delete=models.CASCADE,
|
||||
related_name='workout_exercise_workout'
|
||||
)
|
||||
exercise = models.ForeignKey(
|
||||
Exercise,
|
||||
on_delete=models.CASCADE,
|
||||
related_name='workout_exercise_exercise'
|
||||
)
|
||||
weight = models.IntegerField(null=True, blank=True, max_length=4)
|
||||
reps = models.IntegerField(null=True, blank=True, max_length=4)
|
||||
|
||||
def __str__(self):
|
||||
return self.workout.name + " : " + self.exercise.name
|
||||
|
||||
class CompletedWorkout(models.Model):
|
||||
created_at = models.DateTimeField(auto_now_add=True)
|
||||
updated_at = models.DateTimeField(auto_now=True)
|
||||
registered_user = models.ForeignKey(
|
||||
RegisteredUser,
|
||||
on_delete=models.CASCADE,
|
||||
related_name='completed_workout_user'
|
||||
)
|
||||
workout = models.ForeignKey(
|
||||
Workout,
|
||||
on_delete=models.CASCADE,
|
||||
related_name='completed_workout_workout'
|
||||
)
|
||||
difficulty = models.PositiveSmallIntegerField(
|
||||
choices=WORKOUT_LEVEL
|
||||
)
|
||||
|
||||
def __str__(self):
|
||||
return self.registered_user.first_name + " : " + self.registered_user.last_name + " : " + self.workout.name + " : " + str(self.difficulty)
|
||||
45
workout/serializers.py
Normal file
45
workout/serializers.py
Normal file
@@ -0,0 +1,45 @@
|
||||
from rest_framework import serializers
|
||||
from .models import *
|
||||
# from module.serializers import SlimModuleSerializer
|
||||
|
||||
class WorkoutExerciseSerializer(serializers.ModelSerializer):
|
||||
# module = SlimModuleSerializer(read_only=True)
|
||||
|
||||
class Meta:
|
||||
model = WorkoutExercise
|
||||
fields = ('workout', 'module','weight','reps')
|
||||
|
||||
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']
|
||||
)
|
||||
completed_workout.save()
|
||||
return completed_workout
|
||||
|
||||
class WorkoutSerializer(serializers.ModelSerializer):
|
||||
exercise = WorkoutExerciseSerializer(source='workout_exercise_workout', many=True)
|
||||
|
||||
class Meta:
|
||||
model = Workout
|
||||
fields = '__all__'
|
||||
|
||||
class WorkoutDetailSerializer(serializers.ModelSerializer):
|
||||
class Meta:
|
||||
model = Workout
|
||||
fields = '__all__'
|
||||
|
||||
class GetCompleteWorkoutSerializer(serializers.ModelSerializer):
|
||||
workout = WorkoutSerializer(many=False, read_only=True)
|
||||
|
||||
class Meta:
|
||||
model = CompletedWorkout
|
||||
exclude = ['registered_user']
|
||||
3
workout/tests.py
Normal file
3
workout/tests.py
Normal file
@@ -0,0 +1,3 @@
|
||||
from django.test import TestCase
|
||||
|
||||
# Create your tests here.
|
||||
10
workout/urls.py
Normal file
10
workout/urls.py
Normal file
@@ -0,0 +1,10 @@
|
||||
from django.urls import path
|
||||
from . import views
|
||||
|
||||
|
||||
urlpatterns = [
|
||||
path('all/', views.all_workouts, name='all workouts'),
|
||||
path('<workout_id>/details/', views.workout_details, name='single workout details'),
|
||||
path('complete/', views.complete_workout, name='user complete workout'),
|
||||
path('completed/', views.workouts_completed_by_logged_in_user, name='user completed workouts')
|
||||
]
|
||||
50
workout/views.py
Normal file
50
workout/views.py
Normal file
@@ -0,0 +1,50 @@
|
||||
from .models import *
|
||||
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
|
||||
from django.contrib.auth import authenticate
|
||||
from rest_framework.authentication import TokenAuthentication
|
||||
from rest_framework.permissions import IsAuthenticated
|
||||
from rest_framework.decorators import authentication_classes
|
||||
from rest_framework.decorators import permission_classes
|
||||
import json
|
||||
|
||||
|
||||
@api_view(['GET'])
|
||||
def all_workouts(request):
|
||||
users = Workout.objects.all()
|
||||
serializer = WorkoutSerializer(users, many=True)
|
||||
return Response(data=serializer.data, status=status.HTTP_200_OK)
|
||||
|
||||
|
||||
@api_view(['GET'])
|
||||
def workout_details(request, workout_id):
|
||||
users = Workout.objects.get(pk=workout_id)
|
||||
serializer = WorkoutDetailSerializer(users, many=False)
|
||||
return Response(data=serializer.data, status=status.HTTP_200_OK)
|
||||
|
||||
@api_view(['POST'])
|
||||
@authentication_classes([TokenAuthentication])
|
||||
@permission_classes([IsAuthenticated])
|
||||
def complete_workout(request):
|
||||
registered_user = RegisteredUser.objects.get(user=request.user)
|
||||
serializer = CompleteWorkoutSerializer(data=request.data, context = {"registered_user":registered_user.pk})
|
||||
|
||||
if serializer.is_valid():
|
||||
serializer.save()
|
||||
return Response(serializer.data, status=status.HTTP_201_CREATED)
|
||||
return Response(serializer.errors, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
|
||||
|
||||
@api_view(['GET'])
|
||||
@authentication_classes([TokenAuthentication])
|
||||
@permission_classes([IsAuthenticated])
|
||||
def workouts_completed_by_logged_in_user(request):
|
||||
registered_user = RegisteredUser.objects.get(user=request.user)
|
||||
workouts = CompletedWorkout.objects.filter(registered_user=registered_user)
|
||||
serializer = GetCompleteWorkoutSerializer(workouts, many=True)
|
||||
return Response(serializer.data, status=status.HTTP_201_CREATED)
|
||||
Reference in New Issue
Block a user