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,484 @@
1
+ # GENERATED by tools/codegen — DO NOT EDIT
2
+ # Source: ordercloud-openapi-v3.json
3
+ """OrderCloud InventoryRecords API resource."""
4
+
5
+ from __future__ import annotations
6
+ from typing import Any, Optional, Union
7
+
8
+ from ..models.assignments import InventoryRecordAssignment
9
+ from ..models.inventory_record import InventoryRecord
10
+ from ..models.shared import ListPage
11
+ from .base import BaseResource
12
+
13
+ __all__ = ["InventoryRecordsResource"]
14
+
15
+
16
+ class InventoryRecordsResource(BaseResource):
17
+ """Operations on OrderCloud InventoryRecords."""
18
+
19
+ async def list(
20
+ self,
21
+ product_id: str,
22
+ *,
23
+ search: Optional[str] = None,
24
+ search_on: Optional[str] = None,
25
+ sort_by: Optional[str] = None,
26
+ page: Optional[int] = None,
27
+ page_size: Optional[int] = None,
28
+ filters: Optional[dict[str, Any]] = None,
29
+ include_address: Optional[bool] = None,
30
+ ) -> ListPage[InventoryRecord]:
31
+ """List inventory records
32
+
33
+ Args:
34
+ product_id: ID of the product.
35
+ search: Word or phrase to search for.
36
+ search_on: Comma-delimited list of fields to search on.
37
+ sort_by: Comma-delimited list of fields to sort by.
38
+ 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.
39
+ page_size: Number of results to return per page.
40
+ 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.???'
41
+ include_address: Include address of the inventory record.
42
+
43
+ Returns:
44
+ A paginated list of InventoryRecord objects.
45
+ """
46
+ params = self._build_list_params(
47
+ search=search,
48
+ search_on=search_on,
49
+ sort_by=sort_by,
50
+ page=page,
51
+ page_size=page_size,
52
+ filters=filters,
53
+ )
54
+ if include_address is not None:
55
+ params["includeAddress"] = include_address
56
+ resp = await self._http.get(f"/products/{product_id}/inventoryrecords", **params)
57
+ return self._parse_list(resp.json(), InventoryRecord)
58
+
59
+ async def create(
60
+ self,
61
+ product_id: str,
62
+ inventory_record: Union[InventoryRecord, dict[str, Any]],
63
+ ) -> InventoryRecord:
64
+ """Create an inventory record
65
+
66
+ Args:
67
+ product_id: ID of the product.
68
+ inventory_record: A ``InventoryRecord`` model or dict. Required fields: AddressID.
69
+
70
+ Returns:
71
+ The InventoryRecord object.
72
+ """
73
+ resp = await self._http.post(
74
+ f"/products/{product_id}/inventoryrecords", json=self._serialize(inventory_record)
75
+ )
76
+ return InventoryRecord(**resp.json())
77
+
78
+ async def get(
79
+ self,
80
+ product_id: str,
81
+ inventory_record_id: str,
82
+ ) -> InventoryRecord:
83
+ """Retrieve an inventory record
84
+
85
+ Args:
86
+ product_id: ID of the product.
87
+ inventory_record_id: ID of the inventory record.
88
+
89
+ Returns:
90
+ The InventoryRecord object.
91
+ """
92
+ resp = await self._http.get(
93
+ f"/products/{product_id}/inventoryrecords/{inventory_record_id}"
94
+ )
95
+ return InventoryRecord(**resp.json())
96
+
97
+ async def save(
98
+ self,
99
+ product_id: str,
100
+ inventory_record_id: str,
101
+ inventory_record: Union[InventoryRecord, dict[str, Any]],
102
+ ) -> InventoryRecord:
103
+ """Create or update an inventory record
104
+
105
+ Args:
106
+ product_id: ID of the product.
107
+ inventory_record_id: ID of the inventory record.
108
+ inventory_record: A ``InventoryRecord`` model or dict. Required fields: AddressID.
109
+
110
+ Returns:
111
+ The InventoryRecord object.
112
+ """
113
+ resp = await self._http.put(
114
+ f"/products/{product_id}/inventoryrecords/{inventory_record_id}",
115
+ json=self._serialize(inventory_record),
116
+ )
117
+ return InventoryRecord(**resp.json())
118
+
119
+ async def delete(
120
+ self,
121
+ product_id: str,
122
+ inventory_record_id: str,
123
+ ) -> None:
124
+ """Delete an inventory record
125
+
126
+ Args:
127
+ product_id: ID of the product.
128
+ inventory_record_id: ID of the inventory record.
129
+ """
130
+ await self._http.delete(f"/products/{product_id}/inventoryrecords/{inventory_record_id}")
131
+
132
+ async def patch(
133
+ self,
134
+ product_id: str,
135
+ inventory_record_id: str,
136
+ partial: dict[str, Any],
137
+ ) -> InventoryRecord:
138
+ """Partially update an inventory record
139
+
140
+ Args:
141
+ product_id: ID of the product.
142
+ inventory_record_id: ID of the inventory record.
143
+ partial: A dict of fields to update.
144
+
145
+ Returns:
146
+ The InventoryRecord object.
147
+ """
148
+ resp = await self._http.patch(
149
+ f"/products/{product_id}/inventoryrecords/{inventory_record_id}", json=partial
150
+ )
151
+ return InventoryRecord(**resp.json())
152
+
153
+ async def delete_assignment(
154
+ self,
155
+ product_id: str,
156
+ inventory_record_id: str,
157
+ *,
158
+ buyer_id: Optional[str],
159
+ user_id: Optional[str] = None,
160
+ user_group_id: Optional[str] = None,
161
+ ) -> None:
162
+ """Delete an inventory record assignment
163
+
164
+ Args:
165
+ product_id: ID of the product.
166
+ inventory_record_id: ID of the inventory record.
167
+ buyer_id: ID of the buyer.
168
+ user_id: ID of the user.
169
+ user_group_id: ID of the user group.
170
+ """
171
+ _params: dict[str, Any] = {}
172
+ if buyer_id is not None:
173
+ _params["buyerID"] = buyer_id
174
+ if user_id is not None:
175
+ _params["userID"] = user_id
176
+ if user_group_id is not None:
177
+ _params["userGroupID"] = user_group_id
178
+ await self._http.delete(
179
+ f"/products/{product_id}/inventoryrecords/{inventory_record_id}/assignments", **_params
180
+ )
181
+
182
+ async def list_assignments(
183
+ self,
184
+ product_id: str,
185
+ *,
186
+ buyer_id: Optional[str] = None,
187
+ inventory_record_id: Optional[str] = None,
188
+ user_group_id: Optional[str] = None,
189
+ level: Optional[str] = None,
190
+ page: Optional[int] = None,
191
+ page_size: Optional[int] = None,
192
+ ) -> ListPage[InventoryRecordAssignment]:
193
+ """List inventory record assignments
194
+
195
+ Args:
196
+ product_id: ID of the product.
197
+ buyer_id: ID of the buyer.
198
+ inventory_record_id: ID of the inventory record.
199
+ user_group_id: ID of the user group.
200
+ level: Level of the inventory record assignment. Possible values: Group, Company, BuyerGroup.
201
+ 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.
202
+ page_size: Number of results to return per page.
203
+
204
+ Returns:
205
+ A paginated list of InventoryRecordAssignment objects.
206
+ """
207
+ params = self._build_list_params(
208
+ page=page,
209
+ page_size=page_size,
210
+ )
211
+ if buyer_id is not None:
212
+ params["buyerID"] = buyer_id
213
+ if inventory_record_id is not None:
214
+ params["inventoryRecordID"] = inventory_record_id
215
+ if user_group_id is not None:
216
+ params["userGroupID"] = user_group_id
217
+ if level is not None:
218
+ params["level"] = level
219
+ resp = await self._http.get(
220
+ f"/products/{product_id}/inventoryrecords/assignments", **params
221
+ )
222
+ return self._parse_list(resp.json(), InventoryRecordAssignment)
223
+
224
+ async def save_assignment(
225
+ self,
226
+ product_id: str,
227
+ inventory_record_assignment: Union[InventoryRecordAssignment, dict[str, Any]],
228
+ ) -> None:
229
+ """Create or update an inventory record assignment
230
+
231
+ Args:
232
+ product_id: ID of the product.
233
+ inventory_record_assignment: A ``InventoryRecordAssignment`` model or dict. Required fields: InventoryRecordID, BuyerID.
234
+ """
235
+ await self._http.post(
236
+ f"/products/{product_id}/inventoryrecords/assignments",
237
+ json=self._serialize(inventory_record_assignment),
238
+ )
239
+
240
+ async def list_variant(
241
+ self,
242
+ product_id: str,
243
+ variant_id: str,
244
+ *,
245
+ search: Optional[str] = None,
246
+ search_on: Optional[str] = None,
247
+ sort_by: Optional[str] = None,
248
+ page: Optional[int] = None,
249
+ page_size: Optional[int] = None,
250
+ filters: Optional[dict[str, Any]] = None,
251
+ include_address: Optional[bool] = None,
252
+ ) -> ListPage[InventoryRecord]:
253
+ """Get a list of variant inventory records
254
+
255
+ Args:
256
+ product_id: ID of the product.
257
+ variant_id: ID of the variant.
258
+ search: Word or phrase to search for.
259
+ search_on: Comma-delimited list of fields to search on.
260
+ sort_by: Comma-delimited list of fields to sort by.
261
+ 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.
262
+ page_size: Number of results to return per page.
263
+ 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.???'
264
+ include_address: Include address of the inventory record.
265
+
266
+ Returns:
267
+ A paginated list of InventoryRecord objects.
268
+ """
269
+ params = self._build_list_params(
270
+ search=search,
271
+ search_on=search_on,
272
+ sort_by=sort_by,
273
+ page=page,
274
+ page_size=page_size,
275
+ filters=filters,
276
+ )
277
+ if include_address is not None:
278
+ params["includeAddress"] = include_address
279
+ resp = await self._http.get(
280
+ f"/products/{product_id}/variants/{variant_id}/inventoryrecords", **params
281
+ )
282
+ return self._parse_list(resp.json(), InventoryRecord)
283
+
284
+ async def create_variant(
285
+ self,
286
+ product_id: str,
287
+ variant_id: str,
288
+ inventory_record: Union[InventoryRecord, dict[str, Any]],
289
+ ) -> InventoryRecord:
290
+ """Create a new variant inventory record
291
+
292
+ Args:
293
+ product_id: ID of the product.
294
+ variant_id: ID of the variant.
295
+ inventory_record: A ``InventoryRecord`` model or dict. Required fields: AddressID.
296
+
297
+ Returns:
298
+ The InventoryRecord object.
299
+ """
300
+ resp = await self._http.post(
301
+ f"/products/{product_id}/variants/{variant_id}/inventoryrecords",
302
+ json=self._serialize(inventory_record),
303
+ )
304
+ return InventoryRecord(**resp.json())
305
+
306
+ async def get_variant(
307
+ self,
308
+ product_id: str,
309
+ variant_id: str,
310
+ inventory_record_id: str,
311
+ ) -> InventoryRecord:
312
+ """Get a single variant inventory record
313
+
314
+ Args:
315
+ product_id: ID of the product.
316
+ variant_id: ID of the variant.
317
+ inventory_record_id: ID of the inventory record.
318
+
319
+ Returns:
320
+ The InventoryRecord object.
321
+ """
322
+ resp = await self._http.get(
323
+ f"/products/{product_id}/variants/{variant_id}/inventoryrecords/{inventory_record_id}"
324
+ )
325
+ return InventoryRecord(**resp.json())
326
+
327
+ async def save_variant(
328
+ self,
329
+ product_id: str,
330
+ variant_id: str,
331
+ inventory_record_id: str,
332
+ inventory_record: Union[InventoryRecord, dict[str, Any]],
333
+ ) -> InventoryRecord:
334
+ """Create or update a variant inventory record
335
+
336
+ Args:
337
+ product_id: ID of the product.
338
+ variant_id: ID of the variant.
339
+ inventory_record_id: ID of the inventory record.
340
+ inventory_record: A ``InventoryRecord`` model or dict. Required fields: AddressID.
341
+
342
+ Returns:
343
+ The InventoryRecord object.
344
+ """
345
+ resp = await self._http.put(
346
+ f"/products/{product_id}/variants/{variant_id}/inventoryrecords/{inventory_record_id}",
347
+ json=self._serialize(inventory_record),
348
+ )
349
+ return InventoryRecord(**resp.json())
350
+
351
+ async def delete_variant(
352
+ self,
353
+ product_id: str,
354
+ variant_id: str,
355
+ inventory_record_id: str,
356
+ ) -> None:
357
+ """Delete a variant inventory record
358
+
359
+ Args:
360
+ product_id: ID of the product.
361
+ variant_id: ID of the variant.
362
+ inventory_record_id: ID of the inventory record.
363
+ """
364
+ await self._http.delete(
365
+ f"/products/{product_id}/variants/{variant_id}/inventoryrecords/{inventory_record_id}"
366
+ )
367
+
368
+ async def patch_variant(
369
+ self,
370
+ product_id: str,
371
+ variant_id: str,
372
+ inventory_record_id: str,
373
+ partial: dict[str, Any],
374
+ ) -> InventoryRecord:
375
+ """Partially update a variant inventory record
376
+
377
+ Args:
378
+ product_id: ID of the product.
379
+ variant_id: ID of the variant.
380
+ inventory_record_id: ID of the inventory record.
381
+ partial: A dict of fields to update.
382
+
383
+ Returns:
384
+ The InventoryRecord object.
385
+ """
386
+ resp = await self._http.patch(
387
+ f"/products/{product_id}/variants/{variant_id}/inventoryrecords/{inventory_record_id}",
388
+ json=partial,
389
+ )
390
+ return InventoryRecord(**resp.json())
391
+
392
+ async def delete_variant_assignment(
393
+ self,
394
+ product_id: str,
395
+ variant_id: str,
396
+ inventory_record_id: str,
397
+ *,
398
+ buyer_id: Optional[str],
399
+ user_id: Optional[str] = None,
400
+ user_group_id: Optional[str] = None,
401
+ ) -> None:
402
+ """Delete an inventory record variant assignment
403
+
404
+ Args:
405
+ product_id: ID of the product.
406
+ variant_id: ID of the variant.
407
+ inventory_record_id: ID of the inventory record.
408
+ buyer_id: ID of the buyer.
409
+ user_id: ID of the user.
410
+ user_group_id: ID of the user group.
411
+ """
412
+ _params: dict[str, Any] = {}
413
+ if buyer_id is not None:
414
+ _params["buyerID"] = buyer_id
415
+ if user_id is not None:
416
+ _params["userID"] = user_id
417
+ if user_group_id is not None:
418
+ _params["userGroupID"] = user_group_id
419
+ await self._http.delete(
420
+ f"/products/{product_id}/variants/{variant_id}/inventoryrecords/{inventory_record_id}/assignments",
421
+ **_params,
422
+ )
423
+
424
+ async def list_variant_assignments(
425
+ self,
426
+ product_id: str,
427
+ variant_id: str,
428
+ *,
429
+ buyer_id: Optional[str] = None,
430
+ inventory_record_id: Optional[str] = None,
431
+ user_group_id: Optional[str] = None,
432
+ level: Optional[str] = None,
433
+ page: Optional[int] = None,
434
+ page_size: Optional[int] = None,
435
+ ) -> ListPage[InventoryRecordAssignment]:
436
+ """List inventory record variant assignments
437
+
438
+ Args:
439
+ product_id: ID of the product.
440
+ variant_id: ID of the variant.
441
+ buyer_id: ID of the buyer.
442
+ inventory_record_id: ID of the inventory record.
443
+ user_group_id: ID of the user group.
444
+ level: Level of the inventory record assignment. Possible values: Group, Company, BuyerGroup.
445
+ 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.
446
+ page_size: Number of results to return per page.
447
+
448
+ Returns:
449
+ A paginated list of InventoryRecordAssignment objects.
450
+ """
451
+ params = self._build_list_params(
452
+ page=page,
453
+ page_size=page_size,
454
+ )
455
+ if buyer_id is not None:
456
+ params["buyerID"] = buyer_id
457
+ if inventory_record_id is not None:
458
+ params["inventoryRecordID"] = inventory_record_id
459
+ if user_group_id is not None:
460
+ params["userGroupID"] = user_group_id
461
+ if level is not None:
462
+ params["level"] = level
463
+ resp = await self._http.get(
464
+ f"/products/{product_id}/variants/{variant_id}/inventoryrecords/assignments", **params
465
+ )
466
+ return self._parse_list(resp.json(), InventoryRecordAssignment)
467
+
468
+ async def save_variant_assignment(
469
+ self,
470
+ product_id: str,
471
+ variant_id: str,
472
+ inventory_record_assignment: Union[InventoryRecordAssignment, dict[str, Any]],
473
+ ) -> None:
474
+ """Create or update an inventory record variant assignment
475
+
476
+ Args:
477
+ product_id: ID of the product.
478
+ variant_id: ID of the variant.
479
+ inventory_record_assignment: A ``InventoryRecordAssignment`` model or dict. Required fields: InventoryRecordID, BuyerID.
480
+ """
481
+ await self._http.post(
482
+ f"/products/{product_id}/variants/{variant_id}/inventoryrecords/assignments",
483
+ json=self._serialize(inventory_record_assignment),
484
+ )