Skip to content

Commit 6ffd928

Browse files
Doug Borgclaude
andcommitted
fix(client): handle null ingredient_expected_date in ManufacturingOrderRecipeRow
Same issue as sales_order_delivery_deadline - the Katana API returns null for ingredient_expected_date when the ingredient doesn't have an expected availability date, but the field was not marked as nullable. Fixed in three schemas: - ManufacturingOrderRecipeRow - UpdateManufacturingOrderRecipeRowRequest - ManufacturingOrderRecipeRowListResponse (nested definition) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
1 parent c89b8f4 commit 6ffd928

4 files changed

Lines changed: 92 additions & 32 deletions

File tree

docs/katana-openapi.yaml

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3028,7 +3028,9 @@ components:
30283028
type: string
30293029
description: Availability status of the ingredient
30303030
ingredient_expected_date:
3031-
type: string
3031+
type:
3032+
- string
3033+
- "null"
30323034
format: date-time
30333035
description: Expected date when ingredient will be available
30343036
batch_transactions:
@@ -3082,7 +3084,9 @@ components:
30823084
type: string
30833085
description: Current availability status of the ingredient
30843086
ingredient_expected_date:
3085-
type: string
3087+
type:
3088+
- string
3089+
- "null"
30863090
format: date-time
30873091
description: Updated expected date when ingredient will be available
30883092
batch_transactions:
@@ -3140,7 +3144,9 @@ components:
31403144
type: string
31413145
description: Current availability status of this ingredient
31423146
ingredient_expected_date:
3143-
type: string
3147+
type:
3148+
- string
3149+
- "null"
31443150
format: date-time
31453151
description: Expected date when ingredient will be available if currently unavailable
31463152
batch_transactions:

katana_public_api_client/models/create_manufacturing_order_recipe_row_request.py

Lines changed: 28 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
import datetime
44
from collections.abc import Mapping
5-
from typing import TYPE_CHECKING, Any, TypeVar
5+
from typing import TYPE_CHECKING, Any, TypeVar, cast
66

77
from attrs import (
88
define as _attrs_define,
@@ -38,7 +38,7 @@ class CreateManufacturingOrderRecipeRowRequest:
3838
notes: str | Unset = UNSET
3939
total_actual_quantity: float | Unset = UNSET
4040
ingredient_availability: str | Unset = UNSET
41-
ingredient_expected_date: datetime.datetime | Unset = UNSET
41+
ingredient_expected_date: datetime.datetime | None | Unset = UNSET
4242
batch_transactions: (
4343
list[CreateManufacturingOrderRecipeRowRequestBatchTransactionsItem] | Unset
4444
) = UNSET
@@ -58,9 +58,13 @@ def to_dict(self) -> dict[str, Any]:
5858

5959
ingredient_availability = self.ingredient_availability
6060

61-
ingredient_expected_date: str | Unset = UNSET
62-
if not isinstance(self.ingredient_expected_date, Unset):
61+
ingredient_expected_date: None | str | Unset
62+
if isinstance(self.ingredient_expected_date, Unset):
63+
ingredient_expected_date = UNSET
64+
elif isinstance(self.ingredient_expected_date, datetime.datetime):
6365
ingredient_expected_date = self.ingredient_expected_date.isoformat()
66+
else:
67+
ingredient_expected_date = self.ingredient_expected_date
6468

6569
batch_transactions: list[dict[str, Any]] | Unset = UNSET
6670
if not isinstance(self.batch_transactions, Unset):
@@ -114,12 +118,26 @@ def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T:
114118

115119
ingredient_availability = d.pop("ingredient_availability", UNSET)
116120

117-
_ingredient_expected_date = d.pop("ingredient_expected_date", UNSET)
118-
ingredient_expected_date: datetime.datetime | Unset
119-
if isinstance(_ingredient_expected_date, Unset):
120-
ingredient_expected_date = UNSET
121-
else:
122-
ingredient_expected_date = isoparse(_ingredient_expected_date)
121+
def _parse_ingredient_expected_date(
122+
data: object,
123+
) -> datetime.datetime | None | Unset:
124+
if data is None:
125+
return data
126+
if isinstance(data, Unset):
127+
return data
128+
try:
129+
if not isinstance(data, str):
130+
raise TypeError()
131+
ingredient_expected_date_type_0 = isoparse(data)
132+
133+
return ingredient_expected_date_type_0
134+
except (TypeError, ValueError, AttributeError, KeyError):
135+
pass
136+
return cast(datetime.datetime | None | Unset, data)
137+
138+
ingredient_expected_date = _parse_ingredient_expected_date(
139+
d.pop("ingredient_expected_date", UNSET)
140+
)
123141

124142
_batch_transactions = d.pop("batch_transactions", UNSET)
125143
batch_transactions: (

katana_public_api_client/models/manufacturing_order_recipe_row.py

Lines changed: 27 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ class ManufacturingOrderRecipeRow:
4343
planned_quantity_per_unit: float | Unset = UNSET
4444
total_actual_quantity: float | Unset = UNSET
4545
ingredient_availability: str | Unset = UNSET
46-
ingredient_expected_date: datetime.datetime | Unset = UNSET
46+
ingredient_expected_date: datetime.datetime | None | Unset = UNSET
4747
batch_transactions: (
4848
list[ManufacturingOrderRecipeRowBatchTransactionsItem] | Unset
4949
) = UNSET
@@ -81,9 +81,13 @@ def to_dict(self) -> dict[str, Any]:
8181

8282
ingredient_availability = self.ingredient_availability
8383

84-
ingredient_expected_date: str | Unset = UNSET
85-
if not isinstance(self.ingredient_expected_date, Unset):
84+
ingredient_expected_date: None | str | Unset
85+
if isinstance(self.ingredient_expected_date, Unset):
86+
ingredient_expected_date = UNSET
87+
elif isinstance(self.ingredient_expected_date, datetime.datetime):
8688
ingredient_expected_date = self.ingredient_expected_date.isoformat()
89+
else:
90+
ingredient_expected_date = self.ingredient_expected_date
8791

8892
batch_transactions: list[dict[str, Any]] | Unset = UNSET
8993
if not isinstance(self.batch_transactions, Unset):
@@ -180,12 +184,26 @@ def _parse_deleted_at(data: object) -> datetime.datetime | None | Unset:
180184

181185
ingredient_availability = d.pop("ingredient_availability", UNSET)
182186

183-
_ingredient_expected_date = d.pop("ingredient_expected_date", UNSET)
184-
ingredient_expected_date: datetime.datetime | Unset
185-
if isinstance(_ingredient_expected_date, Unset):
186-
ingredient_expected_date = UNSET
187-
else:
188-
ingredient_expected_date = isoparse(_ingredient_expected_date)
187+
def _parse_ingredient_expected_date(
188+
data: object,
189+
) -> datetime.datetime | None | Unset:
190+
if data is None:
191+
return data
192+
if isinstance(data, Unset):
193+
return data
194+
try:
195+
if not isinstance(data, str):
196+
raise TypeError()
197+
ingredient_expected_date_type_0 = isoparse(data)
198+
199+
return ingredient_expected_date_type_0
200+
except (TypeError, ValueError, AttributeError, KeyError):
201+
pass
202+
return cast(datetime.datetime | None | Unset, data)
203+
204+
ingredient_expected_date = _parse_ingredient_expected_date(
205+
d.pop("ingredient_expected_date", UNSET)
206+
)
189207

190208
_batch_transactions = d.pop("batch_transactions", UNSET)
191209
batch_transactions: (

katana_public_api_client/models/update_manufacturing_order_recipe_row_request.py

Lines changed: 28 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
import datetime
44
from collections.abc import Mapping
5-
from typing import TYPE_CHECKING, Any, TypeVar
5+
from typing import TYPE_CHECKING, Any, TypeVar, cast
66

77
from attrs import (
88
define as _attrs_define,
@@ -36,7 +36,7 @@ class UpdateManufacturingOrderRecipeRowRequest:
3636
planned_quantity_per_unit: float | Unset = UNSET
3737
total_actual_quantity: float | Unset = UNSET
3838
ingredient_availability: str | Unset = UNSET
39-
ingredient_expected_date: datetime.datetime | Unset = UNSET
39+
ingredient_expected_date: datetime.datetime | None | Unset = UNSET
4040
batch_transactions: (
4141
list[UpdateManufacturingOrderRecipeRowRequestBatchTransactionsItem] | Unset
4242
) = UNSET
@@ -52,9 +52,13 @@ def to_dict(self) -> dict[str, Any]:
5252

5353
ingredient_availability = self.ingredient_availability
5454

55-
ingredient_expected_date: str | Unset = UNSET
56-
if not isinstance(self.ingredient_expected_date, Unset):
55+
ingredient_expected_date: None | str | Unset
56+
if isinstance(self.ingredient_expected_date, Unset):
57+
ingredient_expected_date = UNSET
58+
elif isinstance(self.ingredient_expected_date, datetime.datetime):
5759
ingredient_expected_date = self.ingredient_expected_date.isoformat()
60+
else:
61+
ingredient_expected_date = self.ingredient_expected_date
5862

5963
batch_transactions: list[dict[str, Any]] | Unset = UNSET
6064
if not isinstance(self.batch_transactions, Unset):
@@ -100,12 +104,26 @@ def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T:
100104

101105
ingredient_availability = d.pop("ingredient_availability", UNSET)
102106

103-
_ingredient_expected_date = d.pop("ingredient_expected_date", UNSET)
104-
ingredient_expected_date: datetime.datetime | Unset
105-
if isinstance(_ingredient_expected_date, Unset):
106-
ingredient_expected_date = UNSET
107-
else:
108-
ingredient_expected_date = isoparse(_ingredient_expected_date)
107+
def _parse_ingredient_expected_date(
108+
data: object,
109+
) -> datetime.datetime | None | Unset:
110+
if data is None:
111+
return data
112+
if isinstance(data, Unset):
113+
return data
114+
try:
115+
if not isinstance(data, str):
116+
raise TypeError()
117+
ingredient_expected_date_type_0 = isoparse(data)
118+
119+
return ingredient_expected_date_type_0
120+
except (TypeError, ValueError, AttributeError, KeyError):
121+
pass
122+
return cast(datetime.datetime | None | Unset, data)
123+
124+
ingredient_expected_date = _parse_ingredient_expected_date(
125+
d.pop("ingredient_expected_date", UNSET)
126+
)
109127

110128
_batch_transactions = d.pop("batch_transactions", UNSET)
111129
batch_transactions: (

0 commit comments

Comments
 (0)