diff --git a/equipment/views.py b/equipment/views.py index 4a19ac7..c1d667d 100644 --- a/equipment/views.py +++ b/equipment/views.py @@ -12,10 +12,17 @@ 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 +from django.core.cache import cache # Create your views here. @api_view(['GET']) def all_equipment(request): + if 'all_equipment' in cache: + data = cache.get('all_equipment') + return Response(data=data, status=status.HTTP_200_OK) + users = Equipment.objects.all() serializer = EquipmentSerializer(users, many=True) - return Response(data=serializer.data, status=status.HTTP_200_OK) \ No newline at end of file + data = serializer.data + cache.set('all_equipment', data) + return Response(data=data, status=status.HTTP_200_OK) \ No newline at end of file diff --git a/exercise/migrations/0008_exercise_video_override.py b/exercise/migrations/0008_exercise_video_override.py new file mode 100644 index 0000000..8962442 --- /dev/null +++ b/exercise/migrations/0008_exercise_video_override.py @@ -0,0 +1,18 @@ +# Generated by Django 4.2.2 on 2023-07-26 22:47 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('exercise', '0007_exercise_estimated_rep_duration'), + ] + + operations = [ + migrations.AddField( + model_name='exercise', + name='video_override', + field=models.CharField(blank=True, max_length=255, null=True), + ), + ] diff --git a/exercise/models.py b/exercise/models.py index 5fd7562..0f53837 100644 --- a/exercise/models.py +++ b/exercise/models.py @@ -22,6 +22,7 @@ class Exercise(models.Model): muscle_groups = models.CharField(null=True, blank=True, max_length=255) synonyms = models.CharField(null=True, blank=True, max_length=255) estimated_rep_duration = models.FloatField(null=True, blank=True, max_length=255) + video_override = models.CharField(null=True, blank=True, max_length=255) class Meta: ordering = ('name',) @@ -30,7 +31,10 @@ class Exercise(models.Model): return self.name + " --------- " + self.description def video_url(self): - return "exercise_videos/" + self.name.replace(" ", "_") + ".mp4" + if self.video_override is not None and len(self.video_override) > 0: + return "exercise_videos/" + self.video_override + else: + return "exercise_videos/" + self.name.replace(" ", "_") + ".mp4" def audio_url(self): return "exercise_audio/" + self.name.replace(" ", "_") + ".m4a" \ No newline at end of file diff --git a/exercise/views.py b/exercise/views.py index 3b36c2a..bf65a03 100644 --- a/exercise/views.py +++ b/exercise/views.py @@ -12,10 +12,17 @@ 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 +from django.core.cache import cache # Create your views here. @api_view(['GET']) def all_exercises(request): + if 'all_exercises' in cache: + data = cache.get('all_exercises') + return Response(data=data, status=status.HTTP_200_OK) + users = Exercise.objects.all() serializer = ExerciseSerializer(users, many=True) - return Response(data=serializer.data, status=status.HTTP_200_OK) \ No newline at end of file + data = serializer.data + cache.set('all_exercises', data) + return Response(data=data, status=status.HTTP_200_OK) \ No newline at end of file diff --git a/muscle/views.py b/muscle/views.py index ff9f9db..821a35a 100644 --- a/muscle/views.py +++ b/muscle/views.py @@ -12,10 +12,17 @@ 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 +from django.core.cache import cache # Create your views here. @api_view(['GET']) def all_muscles(request): + if 'all_muscles' in cache: + data = cache.get('all_muscles') + return Response(data=data, status=status.HTTP_200_OK) + users = Muscle.objects.all() serializer = MuscleSerializer(users, many=True) - return Response(data=serializer.data, status=status.HTTP_200_OK) \ No newline at end of file + data = serializer.data + cache.set('all_muscles', data) + return Response(data=data, status=status.HTTP_200_OK) \ No newline at end of file diff --git a/requirements.txt b/requirements.txt index 8957b6e..cd17741 100644 --- a/requirements.txt +++ b/requirements.txt @@ -13,6 +13,7 @@ Django==4.2.2 django-debug-toolbar==4.1.0 django-import-export==3.2.0 django-push-notifications==3.0.0 +django-redis==5.3.0 djangorestframework==3.14.0 et-xmlfile==1.1.0 gevent==22.10.1 diff --git a/werkout_api/settings.py b/werkout_api/settings.py index c0eb1e7..7b9010e 100644 --- a/werkout_api/settings.py +++ b/werkout_api/settings.py @@ -58,6 +58,16 @@ MIDDLEWARE = [ ROOT_URLCONF = 'werkout_api.urls' +CACHES = { + "default": { + "BACKEND": "django_redis.cache.RedisCache", + "LOCATION": "redis://redis:6379/", + "OPTIONS": { + "CLIENT_CLASS": "django_redis.client.DefaultClient" + }, + } +} + TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', diff --git a/workout/serializers.py b/workout/serializers.py index 4438bc0..772f2dd 100644 --- a/workout/serializers.py +++ b/workout/serializers.py @@ -6,7 +6,7 @@ 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.serializers import SupersetSerializer, SupersetExerciseSerializer from superset.models import Superset, SupersetExercise class WorkoutExerciseSerializer(serializers.ModelSerializer): @@ -79,12 +79,23 @@ class WorkoutDetailSerializer(serializers.ModelSerializer): 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', ) + 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 diff --git a/workout/views.py b/workout/views.py index fba9cef..e7cd1c0 100644 --- a/workout/views.py +++ b/workout/views.py @@ -16,13 +16,20 @@ from django.shortcuts import get_object_or_404 from datetime import datetime import json import os +from django.core.cache import cache @api_view(['GET']) def all_workouts(request): + if 'all_workouts' in cache: + data = cache.get('all_workouts') + return Response(data=data, status=status.HTTP_200_OK) + users = Workout.objects.all() serializer = WorkoutSerializer(users, many=True) - return Response(data=serializer.data, status=status.HTTP_200_OK) + data = serializer.data + cache.set('all_workouts', data) + return Response(data=data, status=status.HTTP_200_OK) @api_view(['GET']) @@ -121,6 +128,8 @@ def add_workout(request): workout.estimated_time = workout_total_time workout.save() + cache.delete('all_workouts') + return Response(serializer.data, status=status.HTTP_201_CREATED) return Response(serializer.errors, status=status.HTTP_500_INTERNAL_SERVER_ERROR) @@ -229,5 +238,7 @@ def add_from_files(request): workout_obj.estimated_time = workout_total_time workout_obj.save() - + + cache.delete('all_workouts') + return Response(status=status.HTTP_200_OK) \ No newline at end of file