From 5f4283ca3f1d4cda55690aff2cddf2de6c6c9c62 Mon Sep 17 00:00:00 2001 From: smilerz Date: Wed, 1 May 2024 12:03:10 -0500 Subject: [PATCH] update MealPlan queryset filtering to use dates instead of datetime --- cookbook/serializer.py | 2 +- cookbook/tests/api/test_api_meal_plan.py | 40 ++++++++++++------------ cookbook/views/api.py | 8 ++--- 3 files changed, 25 insertions(+), 25 deletions(-) diff --git a/cookbook/serializer.py b/cookbook/serializer.py index 704986edd..66f1d64ed 100644 --- a/cookbook/serializer.py +++ b/cookbook/serializer.py @@ -976,7 +976,7 @@ class RecipeOverviewSerializer(RecipeBaseSerializer): 'internal', 'servings', 'servings_text', 'rating', 'last_cooked', 'new', 'recent' ) # TODO having these readonly fields makes "RecipeOverview.ts" (API Client) not generate the RecipeOverviewToJSON second else block which leads to errors when using the api - # TODO find a solution (maybe trough a custom schema) to have these fields readonly (to save performance) and generate a proper client (two serializers would probably do the trick) + # TODO find a solution (custom schema?) to have these fields readonly (to save performance) and generate a proper client (two serializers would probably do the trick) # read_only_fields = ['id', 'name', 'description', 'image', 'keywords', 'working_time', # 'waiting_time', 'created_by', 'created_at', 'updated_at', # 'internal', 'servings', 'servings_text', 'rating', 'last_cooked', 'new', 'recent'] diff --git a/cookbook/tests/api/test_api_meal_plan.py b/cookbook/tests/api/test_api_meal_plan.py index f59369b8b..3f9cc1d79 100644 --- a/cookbook/tests/api/test_api_meal_plan.py +++ b/cookbook/tests/api/test_api_meal_plan.py @@ -1,5 +1,6 @@ import json -from datetime import datetime, timedelta +from datetime import timedelta +from django.utils import timezone import pytest from django.contrib import auth @@ -29,8 +30,8 @@ def obj_1(space_1, recipe_1_s1, meal_type, u1_s1): return MealPlan.objects.create(recipe=recipe_1_s1, space=space_1, meal_type=meal_type, - from_date=datetime.now(), - to_date=datetime.now(), + from_date=timezone.now(), + to_date=timezone.now(), created_by=auth.get_user(u1_s1)) @@ -39,8 +40,8 @@ def obj_2(space_1, recipe_1_s1, meal_type, u1_s1): return MealPlan.objects.create(recipe=recipe_1_s1, space=space_1, meal_type=meal_type, - from_date=datetime.now(), - to_date=datetime.now(), + from_date=timezone.now(), + to_date=timezone.now(), created_by=auth.get_user(u1_s1)) @@ -49,9 +50,8 @@ def obj_3(space_1, recipe_1_s1, meal_type, u1_s1): return MealPlan.objects.create(recipe=recipe_1_s1, space=space_1, meal_type=meal_type, - from_date=datetime.now() - - timedelta(days=30), - to_date=datetime.now() - timedelta(days=1), + from_date=timezone.now() - timedelta(days=30), + to_date=timezone.now() - timedelta(days=1), created_by=auth.get_user(u1_s1)) @@ -99,19 +99,19 @@ def test_list_filter(obj_1, u1_s1): response = json.loads( u1_s1.get( - f'{reverse(LIST_URL)}?from_date={(datetime.now() + timedelta(days=2)).strftime("%Y-%m-%d")}' + f'{reverse(LIST_URL)}?from_date={(timezone.now() + timedelta(days=2)).strftime("%Y-%m-%d")}' ).content)['results'] assert len(response) == 0 response = json.loads( u1_s1.get( - f'{reverse(LIST_URL)}?to_date={(datetime.now() - timedelta(days=2)).strftime("%Y-%m-%d")}' + f'{reverse(LIST_URL)}?to_date={(timezone.now() - timedelta(days=2)).strftime("%Y-%m-%d")}' ).content)['results'] assert len(response) == 0 response = json.loads( u1_s1.get( - f'{reverse(LIST_URL)}?from_date={(datetime.now() - timedelta(days=2)).strftime("%Y-%m-%d")}&to_date={(datetime.now() + timedelta(days=2)).strftime("%Y-%m-%d")}' + f'{reverse(LIST_URL)}?from_date={(timezone.now() - timedelta(days=2)).strftime("%Y-%m-%d")}&to_date={(timezone.now() + timedelta(days=2)).strftime("%Y-%m-%d")}' ).content)['results'] assert len(response) == 1 @@ -153,8 +153,8 @@ def test_add(arg, request, u1_s2, recipe_1_s1, meal_type): 'id': meal_type.id, 'name': meal_type.name }, - 'from_date': (datetime.now()).strftime("%Y-%m-%d"), - 'to_date': (datetime.now()).strftime("%Y-%m-%d"), + 'from_date': (timezone.now()).strftime("%Y-%m-%d"), + 'to_date': (timezone.now()).strftime("%Y-%m-%d"), 'servings': 1, 'title': 'test', 'shared': [] @@ -196,8 +196,8 @@ def test_add_with_shopping(u1_s1, meal_type): 'id': meal_type.id, 'name': meal_type.name }, - 'from_date': (datetime.now()).strftime("%Y-%m-%d"), - 'to_date': (datetime.now()).strftime("%Y-%m-%d"), + 'from_date': (timezone.now()).strftime("%Y-%m-%d"), + 'to_date': (timezone.now()).strftime("%Y-%m-%d"), 'servings': 1, 'title': 'test', 'shared': [], @@ -212,13 +212,13 @@ def test_add_with_shopping(u1_s1, meal_type): @pytest.mark.parametrize("arg", [ ['', 2], - [f'?from_date={datetime.now().strftime("%Y-%m-%d")}', 1], + [f'?from_date={timezone.now().strftime("%Y-%m-%d")}', 1], [ - f'?to_date={(datetime.now() - timedelta(days=1)).strftime("%Y-%m-%d")}', + f'?to_date={(timezone.now() - timedelta(days=1)).strftime("%Y-%m-%d")}', 1 ], [ - f'?from_date={(datetime.now() + timedelta(days=2)).strftime("%Y-%m-%d")}&to_date={(datetime.now() + timedelta(days=2)).strftime("%Y-%m-%d")}', + f'?from_date={(timezone.now() + timedelta(days=2)).strftime("%Y-%m-%d")}&to_date={(timezone.now() + timedelta(days=2)).strftime("%Y-%m-%d")}', 0 ], ]) @@ -241,5 +241,5 @@ def test_ical_event(obj_1, u1_s1): assert int(event['uid']) == obj_1.id assert event['summary'] == f'{obj_1.meal_type.name}: {obj_1.get_label()}' assert event['description'] == obj_1.note - assert event.decoded('dtstart') == datetime.now().date() - assert event.decoded('dtend') == datetime.now().date() + assert event.decoded('dtstart').date() == timezone.now().date() + assert event.decoded('dtend').date() == timezone.now().date() diff --git a/cookbook/views/api.py b/cookbook/views/api.py index 958f3044f..370cbf68e 100644 --- a/cookbook/views/api.py +++ b/cookbook/views/api.py @@ -141,8 +141,8 @@ class ExtendedRecipeMixin(): @classmethod def annotate_recipe(self, queryset=None, request=None, serializer=None, tree=False): extended = str2bool(request.query_params.get('extended', None)) - if extended: - recipe_filter = serializer.recipe_filter + recipe_filter = getattr(serializer, 'recipe_filter', None) + if extended and recipe_filter: images = serializer.images space = request.space @@ -772,11 +772,11 @@ class MealPlanViewSet(viewsets.ModelViewSet): from_date = self.request.query_params.get('from_date', None) if from_date is not None: - queryset = queryset.filter(to_date__gte=from_date) + queryset = queryset.filter(to_date__date__gte=from_date) to_date = self.request.query_params.get('to_date', None) if to_date is not None: - queryset = queryset.filter(to_date__lte=to_date) + queryset = queryset.filter(to_date__date__lte=to_date) meal_type = self.request.query_params.getlist('meal_type', []) if meal_type: