diff --git a/wger/nutrition/api/views.py b/wger/nutrition/api/views.py index b48992a5..7234d205 100644 --- a/wger/nutrition/api/views.py +++ b/wger/nutrition/api/views.py @@ -15,7 +15,7 @@ # You should have received a copy of the GNU Affero General Public License # along with Workout Manager. If not, see . -from rest_framework import viewsets +from rest_framework import viewsets, status from rest_framework.decorators import detail_route from rest_framework.decorators import api_view from rest_framework.response import Response @@ -223,6 +223,20 @@ def perform_create(self, serializer): ''' serializer.save(order=1) + def create(self, request): + plan_id = request.data.get('plan', '') + try: + NutritionPlan.objects.get(id=plan_id) + serializer = self.serializer_class( + data=request.data, context={'request': request} + ) + serializer.is_valid(raise_exception=True) + except NutritionPlan.DoesNotExist: + return Response({"error": "NutritionPlan with provided id not found"}, + status=status.HTTP_404_NOT_FOUND) + serializer.save(order=1) + return Response(serializer.data, status=status.HTTP_201_CREATED) + def get_owner_objects(self): ''' Return objects to check for ownership permission @@ -256,12 +270,26 @@ def get_queryset(self): ''' return MealItem.objects.filter(meal__plan__user=self.request.user) - def perform_create(self, serializer): + def perform_create(self, serializer, **kwargs): ''' Set the order ''' serializer.save(order=1) + def create(self, request): + meal_id = request.data.get('meal', '') + try: + Meal.objects.get(id=meal_id) + serializer = self.serializer_class( + data=request.data, context={'request': request} + ) + serializer.is_valid(raise_exception=True) + except Meal.DoesNotExist: + return Response({"error": "Meal with provided id not found"}, + status=status.HTTP_404_NOT_FOUND) + serializer.save(order=1) + return Response(serializer.data, status=status.HTTP_201_CREATED) + def get_owner_objects(self): ''' Return objects to check for ownership permission diff --git a/wger/nutrition/migrations/0002_mealitem_time.py b/wger/nutrition/migrations/0002_mealitem_time.py new file mode 100644 index 00000000..a16b7e73 --- /dev/null +++ b/wger/nutrition/migrations/0002_mealitem_time.py @@ -0,0 +1,19 @@ +# Generated by Django 2.2.1 on 2019-06-06 12:39 + +from django.db import migrations +import wger.utils.fields + + +class Migration(migrations.Migration): + + dependencies = [ + ('nutrition', '0001_initial'), + ] + + operations = [ + migrations.AddField( + model_name='mealitem', + name='time', + field=wger.utils.fields.Html5TimeField(blank=True, null=True, verbose_name='Time (approx)'), + ), + ] diff --git a/wger/nutrition/models.py b/wger/nutrition/models.py index 919f4137..06be3320 100644 --- a/wger/nutrition/models.py +++ b/wger/nutrition/models.py @@ -597,6 +597,9 @@ class MealItem(models.Model): verbose_name=_('Amount'), validators=[MinValueValidator(1), MaxValueValidator(1000)]) + time = Html5TimeField(null=True, + blank=True, + verbose_name=_('Time (approx)')) def __str__(self): ''' diff --git a/wger/nutrition/tests/test_meal.py b/wger/nutrition/tests/test_meal.py index 789a8df2..87b06af9 100644 --- a/wger/nutrition/tests/test_meal.py +++ b/wger/nutrition/tests/test_meal.py @@ -132,3 +132,25 @@ class MealApiTestCase(api_base_test.ApiBaseResourceTestCase): data = {'time': datetime.time(9, 2), 'plan': 4, 'order': 1} + + +class MealApiEdgeTestCase(WorkoutManagerTestCase): + def create_nutritionplan(self): + self.client.post('/api/v2/nutritionplan/') + + def test_create_meal_plan_does_not_exist(self): + self.user_login("test") + create_meal = self.client.post('/api/v2/meal/', { + "plan": 800 + }, format='json') + self.assertEqual(create_meal.status_code, 404) + + def test_create_meal_time_not_provided(self): + self.user_login("test") + self.create_nutritionplan() + create_meal = self.client.post( + '/api/v2/meal/', { + "plan": 1 + }, format='json' + ) + self.assertEqual(create_meal.status_code, 201) diff --git a/wger/nutrition/tests/test_meal_item.py b/wger/nutrition/tests/test_meal_item.py index 70330829..dda132f9 100644 --- a/wger/nutrition/tests/test_meal_item.py +++ b/wger/nutrition/tests/test_meal_item.py @@ -16,9 +16,11 @@ from django.urls import reverse from wger.core.tests import api_base_test +from wger.core.tests.base_testcase import WorkoutManagerTestCase from wger.core.tests.base_testcase import WorkoutManagerAddTestCase from wger.core.tests.base_testcase import WorkoutManagerEditTestCase from wger.nutrition.models import MealItem +import json class EditMealItemUnitTestCase(WorkoutManagerEditTestCase): @@ -80,3 +82,45 @@ class MealItemApiTestCase(api_base_test.ApiBaseResourceTestCase): data = {'meal': 2, 'amount': 100, 'ingredient': 1} + + +class MealItemApiEdgeTestCase(WorkoutManagerTestCase): + def create_meal(self): + response = self.client.post('/api/v2/meal/', { + "plan": 1 + }) + return json.loads(response.content)["id"] + + def test_create_mealitem_meal_does_not_exist(self): + self.user_login("test") + create_mealitem = self.client.post('/api/v2/mealitem/', { + "amount": 800, + "ingredient": 34, + "meal": 190, + "time": "23:00:00" + }, format='json') + self.assertEqual(create_mealitem.status_code, 404) + + def test_create_mealitem_ingredient_not_provided(self): + self.user_login("test") + self.create_meal() + create_mealitem = self.client.post( + '/api/v2/mealitem/', { + "amount": 800, + "meal": 1, + "time": "23:00:00" + }, format='json' + ) + self.assertEqual(create_mealitem.status_code, 400) + + def test_create_mealitem_amount_not_provided(self): + self.user_login("test") + self.create_meal() + create_mealitem = self.client.post( + '/api/v2/mealitem/', { + "ingredient": 34, + "meal": 1, + "time": "23:00:00" + }, format='json' + ) + self.assertEqual(create_mealitem.status_code, 400)