diff --git a/cookbook/serializer.py b/cookbook/serializer.py index 9daca509f..e6af4e00f 100644 --- a/cookbook/serializer.py +++ b/cookbook/serializer.py @@ -140,7 +140,7 @@ class UnitSerializer(UniqueFieldsMixin, serializers.ModelSerializer): read_only_fields = ('id',) -class SupermarketCategorySerializer(UniqueFieldsMixin, serializers.ModelSerializer): +class SupermarketCategorySerializer(UniqueFieldsMixin, WritableNestedModelSerializer): def create(self, validated_data): # since multi select tags dont have id's @@ -156,7 +156,7 @@ class SupermarketCategorySerializer(UniqueFieldsMixin, serializers.ModelSerializ fields = ('id', 'name') -class FoodSerializer(UniqueFieldsMixin, serializers.ModelSerializer): +class FoodSerializer(UniqueFieldsMixin, WritableNestedModelSerializer): supermarket_category = SupermarketCategorySerializer(read_only=True) def create(self, validated_data): @@ -171,7 +171,6 @@ class FoodSerializer(UniqueFieldsMixin, serializers.ModelSerializer): class Meta: model = Food fields = ('id', 'name', 'recipe', 'ignore_shopping', 'supermarket_category') - read_only_fields = ('id',) class IngredientSerializer(WritableNestedModelSerializer): @@ -326,8 +325,8 @@ class ShoppingListRecipeSerializer(serializers.ModelSerializer): class ShoppingListEntrySerializer(WritableNestedModelSerializer): - food = FoodSerializer(allow_null=True, read_only=True) - unit = UnitSerializer(allow_null=True, read_only=True) + food = FoodSerializer(allow_null=True) + unit = UnitSerializer(allow_null=True) amount = CustomDecimalField() class Meta: @@ -335,7 +334,6 @@ class ShoppingListEntrySerializer(WritableNestedModelSerializer): fields = ( 'id', 'list_recipe', 'food', 'unit', 'amount', 'order', 'checked' ) - read_only_fields = ('id',) class ShoppingListEntryCheckedSerializer(serializers.ModelSerializer): diff --git a/cookbook/templates/shopping_list.html b/cookbook/templates/shopping_list.html index ed42cf4f7..1254122ec 100644 --- a/cookbook/templates/shopping_list.html +++ b/cookbook/templates/shopping_list.html @@ -361,8 +361,9 @@ this.shopping_list.entries.forEach(element => { let item = {} Object.assign(item, element); - if (entries.filter(item => (item.food.id === element.food.id) && (item.unit.id === element.unit.id)).length > 0) { - let entry = entries.filter(item => item.food.id === element.food.id)[0] + + let entry = this.findMergeEntry(entries, item) + if (entry !== undefined) { entry.amount += item.amount * this.servings_cache[item.list_recipe] entry.entries.push(item.id) } else { @@ -373,7 +374,6 @@ item.entries = [element.id] entries.push(item) } - }); return entries @@ -416,6 +416,17 @@ this.searchUsers('') }, methods: { + findMergeEntry: function (entries, entry) { + return entries.find(item => { + if (entry.food.id === item.food.id) { + if (entry.unit === null && item.unit === null) { + return true + } else if (entry.unit.id === item.unit.id) { + return true + } + } + }) + }, updateOnlineStatus(e) { const { type @@ -612,7 +623,7 @@ this.$http.get('{% url 'api:recipe-detail' 123456 %}'.replace('123456', recipe.id)).then((response) => { for (let s of response.data.steps) { for (let i of s.ingredients) { - if (!i.is_header && i.food !== null) { + if (!i.is_header && i.food !== null && i.food.ignore_shopping === false) { this.shopping_list.entries.push({ 'list_recipe': slr.id, 'food': i.food,