From 946c7de20cab78a47edbeae8fa65fe86a51511dd Mon Sep 17 00:00:00 2001 From: Caine Date: Thu, 2 Apr 2026 17:51:12 +0100 Subject: Add create-meta-recipe endpoint with nested slots/options/bases - POST /api/create-meta-recipe/ creates full meta-recipe in one call - PUT /api/create-meta-recipe/ updates existing (requires id) - Auto-resolves ingredients by name/alias, creates new if not found - Returns full nested response with _created_ingredients list - New writable serializers: MetaRecipeWriteSerializer, SlotWriteSerializer, etc. --- kitchen/serializers.py | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) (limited to 'kitchen/serializers.py') diff --git a/kitchen/serializers.py b/kitchen/serializers.py index 43eb9a7..0de5220 100644 --- a/kitchen/serializers.py +++ b/kitchen/serializers.py @@ -75,6 +75,47 @@ class MetaRecipeSerializer(serializers.ModelSerializer): fields = "__all__" +# --- Writable nested meta-recipe --- + + +class SlotOptionWriteSerializer(serializers.Serializer): + ingredient_name = serializers.CharField() + ingredient_id = serializers.IntegerField(required=False) + quantity_per_serving = serializers.DecimalField(max_digits=8, decimal_places=2) + unit = serializers.CharField() + notes = serializers.CharField(required=False, default="", allow_blank=True) + # For auto-creating ingredients + default_unit = serializers.CharField(required=False) + tags = serializers.ListField(child=serializers.CharField(), required=False, default=list) + shelf_life_days = serializers.IntegerField(required=False, allow_null=True, default=None) + + +class SlotWriteSerializer(serializers.Serializer): + name = serializers.CharField() + required = serializers.BooleanField(default=True) + max_choices = serializers.IntegerField(default=1) + options = SlotOptionWriteSerializer(many=True) + + +class BaseIngredientWriteSerializer(serializers.Serializer): + ingredient_name = serializers.CharField() + ingredient_id = serializers.IntegerField(required=False) + quantity_per_serving = serializers.DecimalField(max_digits=8, decimal_places=2) + unit = serializers.CharField() + + +class MetaRecipeWriteSerializer(serializers.Serializer): + name = serializers.CharField() + method = serializers.CharField() + prep_time_mins = serializers.IntegerField(required=False, allow_null=True, default=None) + cook_time_mins = serializers.IntegerField(required=False, allow_null=True, default=None) + default_servings = serializers.IntegerField(default=2) + gear_needed = serializers.CharField(required=False, default="", allow_blank=True) + tags = serializers.ListField(child=serializers.CharField(), required=False, default=list) + slots = SlotWriteSerializer(many=True, required=False, default=list) + base_ingredients = BaseIngredientWriteSerializer(many=True, required=False, default=list) + + # --- Fixed Recipe nested serializers --- -- cgit v1.2.3