From 487bf469795d70fb2bfdbee882d00f0c5e726a9a Mon Sep 17 00:00:00 2001 From: Caine Date: Thu, 2 Apr 2026 16:32:00 +0100 Subject: Add DRF serializers, viewsets, what-can-i-cook endpoint, log-cook with pantry deduction --- kitchen/serializers.py | 114 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 114 insertions(+) create mode 100644 kitchen/serializers.py (limited to 'kitchen/serializers.py') diff --git a/kitchen/serializers.py b/kitchen/serializers.py new file mode 100644 index 0000000..43eb9a7 --- /dev/null +++ b/kitchen/serializers.py @@ -0,0 +1,114 @@ +from rest_framework import serializers +from .models import ( + Tag, + Ingredient, + PantryItem, + MetaRecipe, + Slot, + SlotOption, + MetaRecipeBase, + Recipe, + RecipeIngredient, + CookLog, + ShoppingListItem, +) + + +class TagSerializer(serializers.ModelSerializer): + class Meta: + model = Tag + fields = "__all__" + + +class IngredientSerializer(serializers.ModelSerializer): + tags = TagSerializer(many=True, read_only=True) + tag_ids = serializers.PrimaryKeyRelatedField( + queryset=Tag.objects.all(), many=True, write_only=True, source="tags", required=False + ) + + class Meta: + model = Ingredient + fields = "__all__" + + +class PantryItemSerializer(serializers.ModelSerializer): + ingredient_name = serializers.CharField(source="ingredient.name", read_only=True) + + class Meta: + model = PantryItem + fields = "__all__" + + +# --- Meta-Recipe nested serializers --- + + +class SlotOptionSerializer(serializers.ModelSerializer): + ingredient_name = serializers.CharField(source="ingredient.name", read_only=True) + + class Meta: + model = SlotOption + fields = "__all__" + + +class SlotSerializer(serializers.ModelSerializer): + options = SlotOptionSerializer(many=True, read_only=True) + + class Meta: + model = Slot + fields = "__all__" + + +class MetaRecipeBaseSerializer(serializers.ModelSerializer): + ingredient_name = serializers.CharField(source="ingredient.name", read_only=True) + + class Meta: + model = MetaRecipeBase + fields = "__all__" + + +class MetaRecipeSerializer(serializers.ModelSerializer): + slots = SlotSerializer(many=True, read_only=True) + base_ingredients = MetaRecipeBaseSerializer(many=True, read_only=True) + + class Meta: + model = MetaRecipe + fields = "__all__" + + +# --- Fixed Recipe nested serializers --- + + +class RecipeIngredientSerializer(serializers.ModelSerializer): + ingredient_name = serializers.CharField(source="ingredient.name", read_only=True) + + class Meta: + model = RecipeIngredient + fields = "__all__" + + +class RecipeSerializer(serializers.ModelSerializer): + ingredients = RecipeIngredientSerializer(many=True, read_only=True) + + class Meta: + model = Recipe + fields = "__all__" + + +# --- Cook Log & Shopping --- + + +class CookLogSerializer(serializers.ModelSerializer): + meta_recipe_name = serializers.CharField(source="meta_recipe.name", read_only=True, default=None) + recipe_name = serializers.CharField(source="recipe.name", read_only=True, default=None) + + class Meta: + model = CookLog + fields = "__all__" + + +class ShoppingListItemSerializer(serializers.ModelSerializer): + ingredient_name = serializers.CharField(source="ingredient.name", read_only=True, default=None) + + class Meta: + model = ShoppingListItem + fields = "__all__" -- cgit v1.2.3