diff options
| -rw-r--r-- | kitchen/tests.py | 13 | ||||
| -rw-r--r-- | kitchen/views.py | 2 | ||||
| -rw-r--r-- | mcp_server/server.py | 15 |
3 files changed, 23 insertions, 7 deletions
diff --git a/kitchen/tests.py b/kitchen/tests.py index 9ce9098..f3f68e2 100644 --- a/kitchen/tests.py +++ b/kitchen/tests.py @@ -224,6 +224,19 @@ class BulkAddApiTests(_ApiTestCase): self.assertEqual(rows.count(), 1) self.assertEqual(rows.first().state, "in") + def test_tolerates_null_unit_and_quantity(self): + # An MCP client may send unit/quantity as null for unknown items. + r = self.client.post( + "/api/bulk-pantry-add/", + {"items": [{"ingredient_name": "pork mince", "location": "fridge", + "unit": None, "quantity": None}]}, + format="json", + ) + self.assertEqual(r.status_code, 201) + self.assertTrue( + PantryItem.objects.filter(ingredient__name="pork mince", location="fridge").exists() + ) + class WhatCanICookApiTests(_ApiTestCase): def setUp(self): diff --git a/kitchen/views.py b/kitchen/views.py index 5fdf041..882f2ef 100644 --- a/kitchen/views.py +++ b/kitchen/views.py @@ -576,7 +576,7 @@ def bulk_pantry_add(request): name = item_data.get("ingredient_name", "").strip() qty_raw = item_data.get("quantity") quantity = int(qty_raw) if qty_raw not in (None, "") else None - unit = item_data.get("unit", "items") + unit = item_data.get("unit") or "items" # tolerate null/empty location = item_data.get("location", "fridge") expiry_days = item_data.get("expiry_days") # optional override diff --git a/mcp_server/server.py b/mcp_server/server.py index cc8fe4a..dcc960b 100644 --- a/mcp_server/server.py +++ b/mcp_server/server.py @@ -73,15 +73,18 @@ def add_to_pantry(items: list[dict]) -> dict: """Add items the user bought. Each item is {name, location?, quantity?, unit?} — e.g. {"name": "pork mince", "location": "fridge"}. Existing items are restocked (set back to In) rather than duplicated.""" - payload = [ - { + payload = [] + for it in items: + entry = { "ingredient_name": it.get("name") or it.get("ingredient_name"), "location": it.get("location", "fridge"), - "quantity": it.get("quantity"), - "unit": it.get("unit"), } - for it in items - ] + # Only forward optional fields when set, so the API applies its defaults. + if it.get("quantity") is not None: + entry["quantity"] = it["quantity"] + if it.get("unit"): + entry["unit"] = it["unit"] + payload.append(entry) try: return _api.bulk_add(payload) except FoodApiError as e: |
