summaryrefslogtreecommitdiff
path: root/kitchen/serializers.py
diff options
context:
space:
mode:
authorCaine <caine@jihakuz.xyz>2026-04-02 17:51:12 +0100
committerCaine <caine@jihakuz.xyz>2026-04-02 17:51:12 +0100
commit946c7de20cab78a47edbeae8fa65fe86a51511dd (patch)
tree5e8c76be65259062a36eef736f1fcfd8ffd72580 /kitchen/serializers.py
parent27f91fb877f4502804c932a28546ab6c745cc103 (diff)
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.
Diffstat (limited to 'kitchen/serializers.py')
-rw-r--r--kitchen/serializers.py41
1 files changed, 41 insertions, 0 deletions
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 ---