Created auto meal plan api endpoint.
This commit is contained in:
@ -1,3 +1,4 @@
|
|||||||
|
import random
|
||||||
import traceback
|
import traceback
|
||||||
import uuid
|
import uuid
|
||||||
from datetime import datetime, timedelta
|
from datetime import datetime, timedelta
|
||||||
@ -979,6 +980,16 @@ class MealPlanSerializer(SpacedModelSerializer, WritableNestedModelSerializer):
|
|||||||
read_only_fields = ('created_by',)
|
read_only_fields = ('created_by',)
|
||||||
|
|
||||||
|
|
||||||
|
class AutoMealPlanSerializer(serializers.Serializer):
|
||||||
|
|
||||||
|
start_date = serializers.DateField()
|
||||||
|
end_date = serializers.DateField()
|
||||||
|
meal_type_id = serializers.IntegerField()
|
||||||
|
keywords = KeywordSerializer(many=True)
|
||||||
|
servings = CustomDecimalField()
|
||||||
|
shared = UserSerializer(many=True, required=False, allow_null=True)
|
||||||
|
|
||||||
|
|
||||||
class ShoppingListRecipeSerializer(serializers.ModelSerializer):
|
class ShoppingListRecipeSerializer(serializers.ModelSerializer):
|
||||||
name = serializers.SerializerMethodField('get_name') # should this be done at the front end?
|
name = serializers.SerializerMethodField('get_name') # should this be done at the front end?
|
||||||
recipe_name = serializers.ReadOnlyField(source='recipe.name')
|
recipe_name = serializers.ReadOnlyField(source='recipe.name')
|
||||||
|
@ -36,6 +36,7 @@ router.register(r'ingredient', api.IngredientViewSet)
|
|||||||
router.register(r'invite-link', api.InviteLinkViewSet)
|
router.register(r'invite-link', api.InviteLinkViewSet)
|
||||||
router.register(r'keyword', api.KeywordViewSet)
|
router.register(r'keyword', api.KeywordViewSet)
|
||||||
router.register(r'meal-plan', api.MealPlanViewSet)
|
router.register(r'meal-plan', api.MealPlanViewSet)
|
||||||
|
router.register(r'auto-plan', api.AutoPlanViewSet, basename='auto-plan')
|
||||||
router.register(r'meal-type', api.MealTypeViewSet)
|
router.register(r'meal-type', api.MealTypeViewSet)
|
||||||
router.register(r'recipe', api.RecipeViewSet)
|
router.register(r'recipe', api.RecipeViewSet)
|
||||||
router.register(r'recipe-book', api.RecipeBookViewSet)
|
router.register(r'recipe-book', api.RecipeBookViewSet)
|
||||||
|
@ -1,7 +1,9 @@
|
|||||||
|
import datetime
|
||||||
import io
|
import io
|
||||||
import json
|
import json
|
||||||
import mimetypes
|
import mimetypes
|
||||||
import pathlib
|
import pathlib
|
||||||
|
import random
|
||||||
import re
|
import re
|
||||||
import threading
|
import threading
|
||||||
import traceback
|
import traceback
|
||||||
@ -25,6 +27,7 @@ from django.core.files import File
|
|||||||
from django.db.models import Case, Count, Exists, OuterRef, ProtectedError, Q, Subquery, Value, When, Avg, Max
|
from django.db.models import Case, Count, Exists, OuterRef, ProtectedError, Q, Subquery, Value, When, Avg, Max
|
||||||
from django.db.models.fields.related import ForeignObjectRel
|
from django.db.models.fields.related import ForeignObjectRel
|
||||||
from django.db.models.functions import Coalesce, Lower
|
from django.db.models.functions import Coalesce, Lower
|
||||||
|
from django.db.models.signals import post_save
|
||||||
from django.http import FileResponse, HttpResponse, JsonResponse
|
from django.http import FileResponse, HttpResponse, JsonResponse
|
||||||
from django.shortcuts import get_object_or_404, redirect
|
from django.shortcuts import get_object_or_404, redirect
|
||||||
from django.urls import reverse
|
from django.urls import reverse
|
||||||
@ -94,7 +97,8 @@ from cookbook.serializer import (AutomationSerializer, BookmarkletImportListSeri
|
|||||||
SyncLogSerializer, SyncSerializer, UnitSerializer,
|
SyncLogSerializer, SyncSerializer, UnitSerializer,
|
||||||
UserFileSerializer, UserSerializer, UserPreferenceSerializer,
|
UserFileSerializer, UserSerializer, UserPreferenceSerializer,
|
||||||
UserSpaceSerializer, ViewLogSerializer, AccessTokenSerializer, FoodSimpleSerializer,
|
UserSpaceSerializer, ViewLogSerializer, AccessTokenSerializer, FoodSimpleSerializer,
|
||||||
RecipeExportSerializer, UnitConversionSerializer, PropertyTypeSerializer, PropertySerializer)
|
RecipeExportSerializer, UnitConversionSerializer, PropertyTypeSerializer,
|
||||||
|
PropertySerializer, AutoMealPlanSerializer)
|
||||||
from cookbook.views.import_export import get_integration
|
from cookbook.views.import_export import get_integration
|
||||||
from recipes import settings
|
from recipes import settings
|
||||||
|
|
||||||
@ -661,6 +665,57 @@ class MealPlanViewSet(viewsets.ModelViewSet):
|
|||||||
return queryset
|
return queryset
|
||||||
|
|
||||||
|
|
||||||
|
class AutoPlanViewSet(viewsets.ViewSet):
|
||||||
|
def create(self, request):
|
||||||
|
serializer = AutoMealPlanSerializer(data=request.data)
|
||||||
|
|
||||||
|
if serializer.is_valid():
|
||||||
|
keywords = serializer.validated_data['keywords']
|
||||||
|
start_date = serializer.validated_data['start_date']
|
||||||
|
end_date = serializer.validated_data['end_date']
|
||||||
|
meal_type = MealType.objects.get(pk=serializer.validated_data['meal_type_id'])
|
||||||
|
servings = serializer.validated_data['servings']
|
||||||
|
|
||||||
|
days = (end_date - start_date).days + 1
|
||||||
|
recipes = Recipe.objects.all()
|
||||||
|
meal_plans = list()
|
||||||
|
|
||||||
|
for keyword in keywords:
|
||||||
|
recipes = recipes.filter(keywords__name=keyword['name'])
|
||||||
|
|
||||||
|
recipes = recipes.order_by('?')[:days]
|
||||||
|
recipes = list(recipes)
|
||||||
|
|
||||||
|
for i in range(0, days):
|
||||||
|
day = start_date + datetime.timedelta(i)
|
||||||
|
recipe = random.choice(recipes)
|
||||||
|
args = {'recipe': recipe, 'servings': servings, 'title': recipe.name,
|
||||||
|
'created_by': request.user,
|
||||||
|
'meal_type': meal_type,
|
||||||
|
'note': '', 'date': day, 'space': request.space}
|
||||||
|
|
||||||
|
m = MealPlan(**args)
|
||||||
|
meal_plans.append(m)
|
||||||
|
|
||||||
|
MealPlan.objects.bulk_create(meal_plans)
|
||||||
|
for m in meal_plans:
|
||||||
|
if request.data.get('addshopping', False) and request.data.get('recipe', None):
|
||||||
|
SLR = RecipeShoppingEditor(user=request.user, space=request.space)
|
||||||
|
SLR.create(mealplan=m, servings=servings)
|
||||||
|
|
||||||
|
else:
|
||||||
|
post_save.send(
|
||||||
|
sender=m.__class__,
|
||||||
|
instance=m,
|
||||||
|
created=True,
|
||||||
|
update_fields=None,
|
||||||
|
)
|
||||||
|
|
||||||
|
return Response(serializer.data)
|
||||||
|
|
||||||
|
return Response(serializer.errors, 400)
|
||||||
|
|
||||||
|
|
||||||
class MealTypeViewSet(viewsets.ModelViewSet):
|
class MealTypeViewSet(viewsets.ModelViewSet):
|
||||||
"""
|
"""
|
||||||
returns list of meal types created by the
|
returns list of meal types created by the
|
||||||
|
Reference in New Issue
Block a user