ordercloud-python 2026.4.1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (114) hide show
  1. ordercloud/__init__.py +37 -0
  2. ordercloud/auth.py +136 -0
  3. ordercloud/client.py +211 -0
  4. ordercloud/config.py +42 -0
  5. ordercloud/errors.py +47 -0
  6. ordercloud/http.py +218 -0
  7. ordercloud/middleware.py +66 -0
  8. ordercloud/models/__init__.py +271 -0
  9. ordercloud/models/address.py +47 -0
  10. ordercloud/models/api_client.py +116 -0
  11. ordercloud/models/approval.py +73 -0
  12. ordercloud/models/assignments.py +402 -0
  13. ordercloud/models/auth_models.py +114 -0
  14. ordercloud/models/bundle.py +31 -0
  15. ordercloud/models/buyer.py +271 -0
  16. ordercloud/models/catalog.py +33 -0
  17. ordercloud/models/category.py +35 -0
  18. ordercloud/models/cost_center.py +27 -0
  19. ordercloud/models/credit_card.py +35 -0
  20. ordercloud/models/delivery.py +277 -0
  21. ordercloud/models/discount.py +63 -0
  22. ordercloud/models/integration.py +76 -0
  23. ordercloud/models/inventory_record.py +53 -0
  24. ordercloud/models/line_item.py +95 -0
  25. ordercloud/models/line_item_types.py +89 -0
  26. ordercloud/models/message_sender.py +80 -0
  27. ordercloud/models/misc.py +280 -0
  28. ordercloud/models/open_id_connect.py +47 -0
  29. ordercloud/models/order.py +477 -0
  30. ordercloud/models/order_return.py +92 -0
  31. ordercloud/models/payment.py +77 -0
  32. ordercloud/models/price_schedule.py +76 -0
  33. ordercloud/models/product.py +227 -0
  34. ordercloud/models/product_collection.py +186 -0
  35. ordercloud/models/promotion.py +297 -0
  36. ordercloud/models/security.py +89 -0
  37. ordercloud/models/shared.py +131 -0
  38. ordercloud/models/shipment.py +150 -0
  39. ordercloud/models/spec.py +67 -0
  40. ordercloud/models/spending_account.py +33 -0
  41. ordercloud/models/subscription.py +125 -0
  42. ordercloud/models/supplier.py +43 -0
  43. ordercloud/models/sync.py +172 -0
  44. ordercloud/models/user.py +207 -0
  45. ordercloud/models/user_group.py +27 -0
  46. ordercloud/models/webhook.py +58 -0
  47. ordercloud/py.typed +0 -0
  48. ordercloud/resources/__init__.py +65 -0
  49. ordercloud/resources/addresses.py +228 -0
  50. ordercloud/resources/admin_addresses.py +128 -0
  51. ordercloud/resources/admin_user_groups.py +185 -0
  52. ordercloud/resources/admin_users.py +150 -0
  53. ordercloud/resources/api_clients.py +308 -0
  54. ordercloud/resources/approval_rules.py +144 -0
  55. ordercloud/resources/base.py +145 -0
  56. ordercloud/resources/bundle_line_items.py +59 -0
  57. ordercloud/resources/bundle_subscription_items.py +54 -0
  58. ordercloud/resources/bundles.py +278 -0
  59. ordercloud/resources/buyer_groups.py +128 -0
  60. ordercloud/resources/buyers.py +164 -0
  61. ordercloud/resources/cart.py +613 -0
  62. ordercloud/resources/catalogs.py +311 -0
  63. ordercloud/resources/categories.py +392 -0
  64. ordercloud/resources/cost_centers.py +222 -0
  65. ordercloud/resources/credit_cards.py +227 -0
  66. ordercloud/resources/delivery_configurations.py +132 -0
  67. ordercloud/resources/discounts.py +201 -0
  68. ordercloud/resources/entity_syncs.py +534 -0
  69. ordercloud/resources/error_configs.py +71 -0
  70. ordercloud/resources/forgotten_credentials.py +74 -0
  71. ordercloud/resources/group_orders.py +28 -0
  72. ordercloud/resources/impersonation_configs.py +132 -0
  73. ordercloud/resources/incrementors.py +128 -0
  74. ordercloud/resources/integration_events.py +203 -0
  75. ordercloud/resources/inventory_integrations.py +65 -0
  76. ordercloud/resources/inventory_records.py +484 -0
  77. ordercloud/resources/line_items.py +262 -0
  78. ordercloud/resources/locales.py +203 -0
  79. ordercloud/resources/me.py +1882 -0
  80. ordercloud/resources/message_senders.py +261 -0
  81. ordercloud/resources/open_id_connects.py +128 -0
  82. ordercloud/resources/order_returns.py +306 -0
  83. ordercloud/resources/order_syncs.py +65 -0
  84. ordercloud/resources/orders.py +689 -0
  85. ordercloud/resources/payments.py +176 -0
  86. ordercloud/resources/price_schedules.py +164 -0
  87. ordercloud/resources/product_collections.py +116 -0
  88. ordercloud/resources/product_facets.py +128 -0
  89. ordercloud/resources/product_syncs.py +76 -0
  90. ordercloud/resources/products.py +454 -0
  91. ordercloud/resources/promotion_integrations.py +65 -0
  92. ordercloud/resources/promotions.py +203 -0
  93. ordercloud/resources/security_profiles.py +222 -0
  94. ordercloud/resources/seller_approval_rules.py +128 -0
  95. ordercloud/resources/shipments.py +256 -0
  96. ordercloud/resources/specs.py +313 -0
  97. ordercloud/resources/spending_accounts.py +227 -0
  98. ordercloud/resources/subscription_integrations.py +65 -0
  99. ordercloud/resources/subscription_items.py +146 -0
  100. ordercloud/resources/subscriptions.py +128 -0
  101. ordercloud/resources/supplier_addresses.py +144 -0
  102. ordercloud/resources/supplier_user_groups.py +210 -0
  103. ordercloud/resources/supplier_users.py +170 -0
  104. ordercloud/resources/suppliers.py +190 -0
  105. ordercloud/resources/tracking_events.py +130 -0
  106. ordercloud/resources/user_groups.py +210 -0
  107. ordercloud/resources/users.py +254 -0
  108. ordercloud/resources/webhooks.py +128 -0
  109. ordercloud/resources/xp_indices.py +77 -0
  110. ordercloud/sync_client.py +170 -0
  111. ordercloud_python-2026.4.1.dist-info/METADATA +552 -0
  112. ordercloud_python-2026.4.1.dist-info/RECORD +114 -0
  113. ordercloud_python-2026.4.1.dist-info/WHEEL +4 -0
  114. ordercloud_python-2026.4.1.dist-info/licenses/LICENSE +21 -0
@@ -0,0 +1,613 @@
1
+ # GENERATED by tools/codegen — DO NOT EDIT
2
+ # Source: ordercloud-openapi-v3.json
3
+ """OrderCloud Cart API resource."""
4
+
5
+ from __future__ import annotations
6
+ from typing import Any, Optional, Union
7
+
8
+ from ..models.address import Address
9
+ from ..models.line_item import BundleItems, LineItem
10
+ from ..models.order import Order, OrderPromotion, OrderShipMethodSelection, OrderWorksheet
11
+ from ..models.payment import Payment, PaymentTransaction
12
+ from ..models.promotion import EligiblePromotion, RefreshPromosResponse
13
+ from ..models.shared import ListPage
14
+ from .base import BaseResource
15
+
16
+ __all__ = ["CartResource"]
17
+
18
+
19
+ class CartResource(BaseResource):
20
+ """Operations on OrderCloud Cart."""
21
+
22
+ async def get(
23
+ self,
24
+ ) -> Order:
25
+ """Retrieve a cart
26
+
27
+ Returns:
28
+ The Order object.
29
+ """
30
+ resp = await self._http.get("/cart")
31
+ return Order(**resp.json())
32
+
33
+ async def save(
34
+ self,
35
+ order: Union[Order, dict[str, Any]],
36
+ ) -> Order:
37
+ """Create or update a cart
38
+
39
+ Args:
40
+ order: A ``Order`` model or dict.
41
+
42
+ Returns:
43
+ The Order object.
44
+ """
45
+ resp = await self._http.put(
46
+ "/cart",
47
+ json=self._serialize(order),
48
+ )
49
+ return Order(**resp.json())
50
+
51
+ async def delete(
52
+ self,
53
+ ) -> None:
54
+ """Delete a cart"""
55
+ await self._http.delete("/cart")
56
+
57
+ async def patch(
58
+ self,
59
+ partial: dict[str, Any],
60
+ ) -> Order:
61
+ """Partially update a cart
62
+
63
+ Args:
64
+ partial: A dict of fields to update.
65
+
66
+ Returns:
67
+ The Order object.
68
+ """
69
+ resp = await self._http.patch("/cart", json=partial)
70
+ return Order(**resp.json())
71
+
72
+ async def set_active_cart(
73
+ self,
74
+ order_id: str,
75
+ ) -> None:
76
+ """Set an active cart
77
+
78
+ Args:
79
+ order_id: ID of the order.
80
+ """
81
+ await self._http.put(f"/cart/{order_id}")
82
+
83
+ async def apply_promotions(
84
+ self,
85
+ ) -> Order:
86
+ """Auto-apply promotions to the cart
87
+
88
+ Returns:
89
+ The Order object.
90
+ """
91
+ resp = await self._http.post("/cart/applypromotions")
92
+ return Order(**resp.json())
93
+
94
+ async def set_billing_address(
95
+ self,
96
+ address: Union[Address, dict[str, Any]],
97
+ ) -> Order:
98
+ """Set a billing address
99
+
100
+ Args:
101
+ address: A ``Address`` model or dict. Required fields: Street1, City, Country.
102
+
103
+ Returns:
104
+ The Order object.
105
+ """
106
+ resp = await self._http.put(
107
+ "/cart/billto",
108
+ json=self._serialize(address),
109
+ )
110
+ return Order(**resp.json())
111
+
112
+ async def patch_billing_address(
113
+ self,
114
+ partial: dict[str, Any],
115
+ ) -> Order:
116
+ """Partially update a cart billing address
117
+
118
+ Args:
119
+ partial: A dict of fields to update.
120
+
121
+ Returns:
122
+ The Order object.
123
+ """
124
+ resp = await self._http.patch("/cart/billto", json=partial)
125
+ return Order(**resp.json())
126
+
127
+ async def create_bundle_item(
128
+ self,
129
+ bundle_id: str,
130
+ bundle_items: Union[BundleItems, dict[str, Any]],
131
+ ) -> LineItem:
132
+ """Create a cart bundle item
133
+
134
+ Args:
135
+ bundle_id: ID of the bundle.
136
+ bundle_items: A ``BundleItems`` model or dict.
137
+
138
+ Returns:
139
+ The LineItem object.
140
+ """
141
+ resp = await self._http.post(
142
+ f"/cart/bundles/{bundle_id}", json=self._serialize(bundle_items)
143
+ )
144
+ return LineItem(**resp.json())
145
+
146
+ async def delete_bundle_item(
147
+ self,
148
+ bundle_id: str,
149
+ bundle_item_id: str,
150
+ ) -> None:
151
+ """Delete a cart bundle item
152
+
153
+ Args:
154
+ bundle_id: ID of the bundle.
155
+ bundle_item_id: ID of the bundle item.
156
+ """
157
+ await self._http.delete(f"/cart/bundles/{bundle_id}/{bundle_item_id}")
158
+
159
+ async def calculate(
160
+ self,
161
+ ) -> OrderWorksheet:
162
+ """Calculate the cart
163
+
164
+ Returns:
165
+ The OrderWorksheet object.
166
+ """
167
+ resp = await self._http.post("/cart/calculate")
168
+ return OrderWorksheet(**resp.json())
169
+
170
+ async def list_eligible_promotions(
171
+ self,
172
+ *,
173
+ search: Optional[str] = None,
174
+ search_on: Optional[str] = None,
175
+ sort_by: Optional[str] = None,
176
+ page: Optional[int] = None,
177
+ page_size: Optional[int] = None,
178
+ filters: Optional[dict[str, Any]] = None,
179
+ ) -> ListPage[EligiblePromotion]:
180
+ """List eligible promotions for the cart
181
+
182
+ Args:
183
+ search: Word or phrase to search for.
184
+ search_on: Comma-delimited list of fields to search on.
185
+ sort_by: Comma-delimited list of fields to sort by.
186
+ page: Page of results to return. When paginating through many items (> page 30), we recommend the "Last ID" method, as outlined in the Advanced Querying documentation.
187
+ page_size: Number of results to return per page.
188
+ filters: An object or dictionary representing key/value pairs to apply as filters. Valid keys are top-level properties of the returned model or 'xp.???'
189
+
190
+ Returns:
191
+ A paginated list of EligiblePromotion objects.
192
+ """
193
+ params = self._build_list_params(
194
+ search=search,
195
+ search_on=search_on,
196
+ sort_by=sort_by,
197
+ page=page,
198
+ page_size=page_size,
199
+ filters=filters,
200
+ )
201
+ resp = await self._http.get("/cart/eligiblepromotions", **params)
202
+ return self._parse_list(resp.json(), EligiblePromotion)
203
+
204
+ async def estimate_shipping(
205
+ self,
206
+ ) -> OrderWorksheet:
207
+ """Estimate shipping cost
208
+
209
+ Returns:
210
+ The OrderWorksheet object.
211
+ """
212
+ resp = await self._http.post("/cart/estimateshipping")
213
+ return OrderWorksheet(**resp.json())
214
+
215
+ async def patch_from_user(
216
+ self,
217
+ partial: dict[str, Any],
218
+ ) -> Order:
219
+ """Partially update a cart from user
220
+
221
+ Args:
222
+ partial: A dict of fields to update.
223
+
224
+ Returns:
225
+ The Order object.
226
+ """
227
+ resp = await self._http.patch("/cart/fromuser", json=partial)
228
+ return Order(**resp.json())
229
+
230
+ async def list_line_items(
231
+ self,
232
+ *,
233
+ search: Optional[str] = None,
234
+ search_on: Optional[str] = None,
235
+ sort_by: Optional[str] = None,
236
+ page: Optional[int] = None,
237
+ page_size: Optional[int] = None,
238
+ filters: Optional[dict[str, Any]] = None,
239
+ ) -> ListPage[LineItem]:
240
+ """List cart line items
241
+
242
+ Args:
243
+ search: Word or phrase to search for.
244
+ search_on: Comma-delimited list of fields to search on.
245
+ sort_by: Comma-delimited list of fields to sort by.
246
+ page: Page of results to return. When paginating through many items (> page 30), we recommend the "Last ID" method, as outlined in the Advanced Querying documentation.
247
+ page_size: Number of results to return per page.
248
+ filters: An object or dictionary representing key/value pairs to apply as filters. Valid keys are top-level properties of the returned model or 'xp.???'
249
+
250
+ Returns:
251
+ A paginated list of LineItem objects.
252
+ """
253
+ params = self._build_list_params(
254
+ search=search,
255
+ search_on=search_on,
256
+ sort_by=sort_by,
257
+ page=page,
258
+ page_size=page_size,
259
+ filters=filters,
260
+ )
261
+ resp = await self._http.get("/cart/lineitems", **params)
262
+ return self._parse_list(resp.json(), LineItem)
263
+
264
+ async def create_line_item(
265
+ self,
266
+ line_item: Union[LineItem, dict[str, Any]],
267
+ ) -> LineItem:
268
+ """Create a cart line item
269
+
270
+ Args:
271
+ line_item: A ``LineItem`` model or dict. Required fields: ProductID.
272
+
273
+ Returns:
274
+ The LineItem object.
275
+ """
276
+ resp = await self._http.post("/cart/lineitems", json=self._serialize(line_item))
277
+ return LineItem(**resp.json())
278
+
279
+ async def get_line_item(
280
+ self,
281
+ line_item_id: str,
282
+ ) -> LineItem:
283
+ """Retrieve a cart line item
284
+
285
+ Args:
286
+ line_item_id: ID of the line item.
287
+
288
+ Returns:
289
+ The LineItem object.
290
+ """
291
+ resp = await self._http.get(f"/cart/lineitems/{line_item_id}")
292
+ return LineItem(**resp.json())
293
+
294
+ async def save_line_item(
295
+ self,
296
+ line_item_id: str,
297
+ line_item: Union[LineItem, dict[str, Any]],
298
+ ) -> LineItem:
299
+ """Create or update a cart line item
300
+
301
+ Args:
302
+ line_item_id: ID of the line item.
303
+ line_item: A ``LineItem`` model or dict. Required fields: ProductID.
304
+
305
+ Returns:
306
+ The LineItem object.
307
+ """
308
+ resp = await self._http.put(
309
+ f"/cart/lineitems/{line_item_id}",
310
+ json=self._serialize(line_item),
311
+ )
312
+ return LineItem(**resp.json())
313
+
314
+ async def delete_line_item(
315
+ self,
316
+ line_item_id: str,
317
+ ) -> None:
318
+ """Delete a cart line item
319
+
320
+ Args:
321
+ line_item_id: ID of the line item.
322
+ """
323
+ await self._http.delete(f"/cart/lineitems/{line_item_id}")
324
+
325
+ async def patch_line_item(
326
+ self,
327
+ line_item_id: str,
328
+ partial: dict[str, Any],
329
+ ) -> LineItem:
330
+ """Partially update a cart line item
331
+
332
+ Args:
333
+ line_item_id: ID of the line item.
334
+ partial: A dict of fields to update.
335
+
336
+ Returns:
337
+ The LineItem object.
338
+ """
339
+ resp = await self._http.patch(f"/cart/lineitems/{line_item_id}", json=partial)
340
+ return LineItem(**resp.json())
341
+
342
+ async def list_payments(
343
+ self,
344
+ *,
345
+ search: Optional[str] = None,
346
+ search_on: Optional[str] = None,
347
+ sort_by: Optional[str] = None,
348
+ page: Optional[int] = None,
349
+ page_size: Optional[int] = None,
350
+ filters: Optional[dict[str, Any]] = None,
351
+ ) -> ListPage[Payment]:
352
+ """List cart payments
353
+
354
+ Args:
355
+ search: Word or phrase to search for.
356
+ search_on: Comma-delimited list of fields to search on.
357
+ sort_by: Comma-delimited list of fields to sort by.
358
+ page: Page of results to return. When paginating through many items (> page 30), we recommend the "Last ID" method, as outlined in the Advanced Querying documentation.
359
+ page_size: Number of results to return per page.
360
+ filters: An object or dictionary representing key/value pairs to apply as filters. Valid keys are top-level properties of the returned model or 'xp.???'
361
+
362
+ Returns:
363
+ A paginated list of Payment objects.
364
+ """
365
+ params = self._build_list_params(
366
+ search=search,
367
+ search_on=search_on,
368
+ sort_by=sort_by,
369
+ page=page,
370
+ page_size=page_size,
371
+ filters=filters,
372
+ )
373
+ resp = await self._http.get("/cart/payments", **params)
374
+ return self._parse_list(resp.json(), Payment)
375
+
376
+ async def create_payment(
377
+ self,
378
+ payment: Union[Payment, dict[str, Any]],
379
+ ) -> Payment:
380
+ """Create a cart payment
381
+
382
+ Args:
383
+ payment: A ``Payment`` model or dict.
384
+
385
+ Returns:
386
+ The Payment object.
387
+ """
388
+ resp = await self._http.post("/cart/payments", json=self._serialize(payment))
389
+ return Payment(**resp.json())
390
+
391
+ async def get_payment(
392
+ self,
393
+ payment_id: str,
394
+ ) -> Payment:
395
+ """Retrieve a cart payment
396
+
397
+ Args:
398
+ payment_id: ID of the payment.
399
+
400
+ Returns:
401
+ The Payment object.
402
+ """
403
+ resp = await self._http.get(f"/cart/payments/{payment_id}")
404
+ return Payment(**resp.json())
405
+
406
+ async def delete_payment(
407
+ self,
408
+ payment_id: str,
409
+ ) -> None:
410
+ """Delete a cart payment
411
+
412
+ Args:
413
+ payment_id: ID of the payment.
414
+ """
415
+ await self._http.delete(f"/cart/payments/{payment_id}")
416
+
417
+ async def patch_payment(
418
+ self,
419
+ payment_id: str,
420
+ partial: dict[str, Any],
421
+ ) -> Payment:
422
+ """Partially update a cart payment
423
+
424
+ Args:
425
+ payment_id: ID of the payment.
426
+ partial: A dict of fields to update.
427
+
428
+ Returns:
429
+ The Payment object.
430
+ """
431
+ resp = await self._http.patch(f"/cart/payments/{payment_id}", json=partial)
432
+ return Payment(**resp.json())
433
+
434
+ async def create_payment_transaction(
435
+ self,
436
+ payment_id: str,
437
+ payment_transaction: Union[PaymentTransaction, dict[str, Any]],
438
+ ) -> Payment:
439
+ """Create a cart payment transaction
440
+
441
+ Args:
442
+ payment_id: ID of the payment.
443
+ payment_transaction: A ``PaymentTransaction`` model or dict. Required fields: Type, DateExecuted.
444
+
445
+ Returns:
446
+ The Payment object.
447
+ """
448
+ resp = await self._http.post(
449
+ f"/cart/payments/{payment_id}/transactions", json=self._serialize(payment_transaction)
450
+ )
451
+ return Payment(**resp.json())
452
+
453
+ async def delete_payment_transaction(
454
+ self,
455
+ payment_id: str,
456
+ transaction_id: str,
457
+ ) -> None:
458
+ """Delete a cart payment transaction
459
+
460
+ Args:
461
+ payment_id: ID of the payment.
462
+ transaction_id: ID of the transaction.
463
+ """
464
+ await self._http.delete(f"/cart/payments/{payment_id}/transactions/{transaction_id}")
465
+
466
+ async def list_promotions(
467
+ self,
468
+ *,
469
+ search: Optional[str] = None,
470
+ search_on: Optional[str] = None,
471
+ sort_by: Optional[str] = None,
472
+ page: Optional[int] = None,
473
+ page_size: Optional[int] = None,
474
+ filters: Optional[dict[str, Any]] = None,
475
+ ) -> ListPage[OrderPromotion]:
476
+ """List cart promotions
477
+
478
+ Args:
479
+ search: Word or phrase to search for.
480
+ search_on: Comma-delimited list of fields to search on.
481
+ sort_by: Comma-delimited list of fields to sort by.
482
+ page: Page of results to return. When paginating through many items (> page 30), we recommend the "Last ID" method, as outlined in the Advanced Querying documentation.
483
+ page_size: Number of results to return per page.
484
+ filters: An object or dictionary representing key/value pairs to apply as filters. Valid keys are top-level properties of the returned model or 'xp.???'
485
+
486
+ Returns:
487
+ A paginated list of OrderPromotion objects.
488
+ """
489
+ params = self._build_list_params(
490
+ search=search,
491
+ search_on=search_on,
492
+ sort_by=sort_by,
493
+ page=page,
494
+ page_size=page_size,
495
+ filters=filters,
496
+ )
497
+ resp = await self._http.get("/cart/promotions", **params)
498
+ return self._parse_list(resp.json(), OrderPromotion)
499
+
500
+ async def add_promotion(
501
+ self,
502
+ promo_code: str,
503
+ ) -> OrderPromotion:
504
+ """Add a promotion
505
+
506
+ Args:
507
+ promo_code: Promo code of the order promotion.
508
+
509
+ Returns:
510
+ The OrderPromotion object.
511
+ """
512
+ resp = await self._http.post(f"/cart/promotions/{promo_code}")
513
+ return OrderPromotion(**resp.json())
514
+
515
+ async def delete_promotion(
516
+ self,
517
+ promo_code: str,
518
+ ) -> None:
519
+ """Delete a cart promotion
520
+
521
+ Args:
522
+ promo_code: Promo code of the cart.
523
+ """
524
+ await self._http.delete(f"/cart/promotions/{promo_code}")
525
+
526
+ async def refresh_promotions(
527
+ self,
528
+ ) -> RefreshPromosResponse:
529
+ """Refresh promotions on the cart
530
+
531
+ Returns:
532
+ The RefreshPromosResponse object.
533
+ """
534
+ resp = await self._http.post("/cart/refreshpromotions")
535
+ return RefreshPromosResponse(**resp.json())
536
+
537
+ async def select_ship_methods(
538
+ self,
539
+ order_ship_method_selection: Union[OrderShipMethodSelection, dict[str, Any]],
540
+ ) -> OrderWorksheet:
541
+ """Select a ship method
542
+
543
+ Args:
544
+ order_ship_method_selection: A ``OrderShipMethodSelection`` model or dict.
545
+
546
+ Returns:
547
+ The OrderWorksheet object.
548
+ """
549
+ resp = await self._http.post(
550
+ "/cart/shipmethods", json=self._serialize(order_ship_method_selection)
551
+ )
552
+ return OrderWorksheet(**resp.json())
553
+
554
+ async def set_shipping_address(
555
+ self,
556
+ address: Union[Address, dict[str, Any]],
557
+ ) -> Order:
558
+ """Set a shipping address
559
+
560
+ Args:
561
+ address: A ``Address`` model or dict. Required fields: Street1, City, Country.
562
+
563
+ Returns:
564
+ The Order object.
565
+ """
566
+ resp = await self._http.put(
567
+ "/cart/shipto",
568
+ json=self._serialize(address),
569
+ )
570
+ return Order(**resp.json())
571
+
572
+ async def patch_shipping_address(
573
+ self,
574
+ partial: dict[str, Any],
575
+ ) -> Order:
576
+ """Partially update a cart shipping address
577
+
578
+ Args:
579
+ partial: A dict of fields to update.
580
+
581
+ Returns:
582
+ The Order object.
583
+ """
584
+ resp = await self._http.patch("/cart/shipto", json=partial)
585
+ return Order(**resp.json())
586
+
587
+ async def submit(
588
+ self,
589
+ ) -> Order:
590
+ """Submit the cart
591
+
592
+ Returns:
593
+ The Order object.
594
+ """
595
+ resp = await self._http.post("/cart/submit")
596
+ return Order(**resp.json())
597
+
598
+ async def validate(
599
+ self,
600
+ ) -> None:
601
+ """Validate the cart in it's current state"""
602
+ await self._http.post("/cart/validate")
603
+
604
+ async def get_order_worksheet(
605
+ self,
606
+ ) -> OrderWorksheet:
607
+ """Retrieve a cart order worksheet
608
+
609
+ Returns:
610
+ The OrderWorksheet object.
611
+ """
612
+ resp = await self._http.get("/cart/worksheet")
613
+ return OrderWorksheet(**resp.json())