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,58 @@
1
+ # GENERATED by tools/codegen — DO NOT EDIT
2
+ # Source: ordercloud-openapi-v3.json
3
+ """OrderCloud WebhookRoute, Webhook models."""
4
+
5
+ from __future__ import annotations
6
+ from typing import Any, Optional
7
+ from pydantic import Field
8
+
9
+ from .shared import OrderCloudModel
10
+ from .misc import ApiRole
11
+
12
+ __all__ = ["WebhookRoute", "Webhook"]
13
+
14
+
15
+ class WebhookRoute(OrderCloudModel):
16
+ """An OrderCloud WebhookRoute.
17
+
18
+ Attributes:
19
+ route:
20
+ verb:
21
+ """
22
+
23
+ route: Optional[str] = Field(None, alias="Route")
24
+ verb: Optional[str] = Field(None, alias="Verb")
25
+
26
+
27
+ class Webhook(OrderCloudModel):
28
+ """An OrderCloud Webhook.
29
+
30
+ Attributes:
31
+ id:
32
+ name:
33
+ description:
34
+ url: URL the webhook will POST data to, likely a route within your middleware. Required unless there is a valid DeliveryConfig.
35
+ hash_key: Security feature that allows your middleware to verify the digital signature in the request header to ensure you only accept trusted data.
36
+ elevated_roles: If you need additional data not provided by the webhook payload, you can request any elevated roles needed to make additional calls.
37
+ config_data:
38
+ before_process_request: If true, the webhook is processed prior to the call being made and OrderCloud waits for a response before proceeding.
39
+ api_client_i_ds: List of API client IDs the webhook will be triggered for.
40
+ webhook_routes: List of routes the webhook will be triggered for.
41
+ delivery_config_id:
42
+ custom_auth_header_name: The header name that can be passed to your middleware.
43
+ custom_auth_header_value: The header value that can be passed to your middleware.
44
+ """
45
+
46
+ id: Optional[str] = Field(None, alias="ID")
47
+ name: Optional[str] = Field(None, alias="Name")
48
+ description: Optional[str] = Field(None, alias="Description")
49
+ url: Optional[str] = Field(None, alias="Url")
50
+ hash_key: Optional[str] = Field(None, alias="HashKey")
51
+ elevated_roles: Optional[list[ApiRole]] = Field(None, alias="ElevatedRoles")
52
+ config_data: Optional[dict[str, Any]] = Field(None, alias="ConfigData")
53
+ before_process_request: Optional[bool] = Field(None, alias="BeforeProcessRequest")
54
+ api_client_i_ds: Optional[list[str]] = Field(None, alias="ApiClientIDs")
55
+ webhook_routes: Optional[list[WebhookRoute]] = Field(None, alias="WebhookRoutes")
56
+ delivery_config_id: Optional[str] = Field(None, alias="DeliveryConfigID")
57
+ custom_auth_header_name: Optional[str] = Field(None, alias="CustomAuthHeaderName")
58
+ custom_auth_header_value: Optional[str] = Field(None, alias="CustomAuthHeaderValue")
ordercloud/py.typed ADDED
File without changes
@@ -0,0 +1,65 @@
1
+ # GENERATED by tools/codegen — DO NOT EDIT
2
+ # Source: ordercloud-openapi-v3.json
3
+ """OrderCloud API resource clients."""
4
+
5
+ from .base import BaseResource # noqa: F401
6
+ from .addresses import AddressesResource # noqa: F401
7
+ from .admin_addresses import AdminAddressesResource # noqa: F401
8
+ from .admin_user_groups import AdminUserGroupsResource # noqa: F401
9
+ from .admin_users import AdminUsersResource # noqa: F401
10
+ from .api_clients import ApiClientsResource # noqa: F401
11
+ from .approval_rules import ApprovalRulesResource # noqa: F401
12
+ from .bundle_line_items import BundleLineItemsResource # noqa: F401
13
+ from .bundle_subscription_items import BundleSubscriptionItemsResource # noqa: F401
14
+ from .bundles import BundlesResource # noqa: F401
15
+ from .buyer_groups import BuyerGroupsResource # noqa: F401
16
+ from .buyers import BuyersResource # noqa: F401
17
+ from .cart import CartResource # noqa: F401
18
+ from .catalogs import CatalogsResource # noqa: F401
19
+ from .categories import CategoriesResource # noqa: F401
20
+ from .cost_centers import CostCentersResource # noqa: F401
21
+ from .credit_cards import CreditCardsResource # noqa: F401
22
+ from .delivery_configurations import DeliveryConfigurationsResource # noqa: F401
23
+ from .discounts import DiscountsResource # noqa: F401
24
+ from .entity_syncs import EntitySyncsResource # noqa: F401
25
+ from .error_configs import ErrorConfigsResource # noqa: F401
26
+ from .forgotten_credentials import ForgottenCredentialsResource # noqa: F401
27
+ from .group_orders import GroupOrdersResource # noqa: F401
28
+ from .impersonation_configs import ImpersonationConfigsResource # noqa: F401
29
+ from .incrementors import IncrementorsResource # noqa: F401
30
+ from .integration_events import IntegrationEventsResource # noqa: F401
31
+ from .inventory_integrations import InventoryIntegrationsResource # noqa: F401
32
+ from .inventory_records import InventoryRecordsResource # noqa: F401
33
+ from .line_items import LineItemsResource # noqa: F401
34
+ from .locales import LocalesResource # noqa: F401
35
+ from .me import MeResource # noqa: F401
36
+ from .message_senders import MessageSendersResource # noqa: F401
37
+ from .open_id_connects import OpenIdConnectsResource # noqa: F401
38
+ from .order_returns import OrderReturnsResource # noqa: F401
39
+ from .order_syncs import OrderSyncsResource # noqa: F401
40
+ from .orders import OrdersResource # noqa: F401
41
+ from .payments import PaymentsResource # noqa: F401
42
+ from .price_schedules import PriceSchedulesResource # noqa: F401
43
+ from .product_collections import ProductCollectionsResource # noqa: F401
44
+ from .product_facets import ProductFacetsResource # noqa: F401
45
+ from .product_syncs import ProductSyncsResource # noqa: F401
46
+ from .products import ProductsResource # noqa: F401
47
+ from .promotion_integrations import PromotionIntegrationsResource # noqa: F401
48
+ from .promotions import PromotionsResource # noqa: F401
49
+ from .security_profiles import SecurityProfilesResource # noqa: F401
50
+ from .seller_approval_rules import SellerApprovalRulesResource # noqa: F401
51
+ from .shipments import ShipmentsResource # noqa: F401
52
+ from .specs import SpecsResource # noqa: F401
53
+ from .spending_accounts import SpendingAccountsResource # noqa: F401
54
+ from .subscription_integrations import SubscriptionIntegrationsResource # noqa: F401
55
+ from .subscription_items import SubscriptionItemsResource # noqa: F401
56
+ from .subscriptions import SubscriptionsResource # noqa: F401
57
+ from .supplier_addresses import SupplierAddressesResource # noqa: F401
58
+ from .supplier_user_groups import SupplierUserGroupsResource # noqa: F401
59
+ from .supplier_users import SupplierUsersResource # noqa: F401
60
+ from .suppliers import SuppliersResource # noqa: F401
61
+ from .tracking_events import TrackingEventsResource # noqa: F401
62
+ from .user_groups import UserGroupsResource # noqa: F401
63
+ from .users import UsersResource # noqa: F401
64
+ from .webhooks import WebhooksResource # noqa: F401
65
+ from .xp_indices import XpIndicesResource # noqa: F401
@@ -0,0 +1,228 @@
1
+ # GENERATED by tools/codegen — DO NOT EDIT
2
+ # Source: ordercloud-openapi-v3.json
3
+ """OrderCloud Addresses 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.assignments import AddressAssignment
10
+ from ..models.misc import PartyType
11
+ from ..models.shared import ListPage
12
+ from .base import BaseResource
13
+
14
+ __all__ = ["AddressesResource"]
15
+
16
+
17
+ class AddressesResource(BaseResource):
18
+ """Operations on OrderCloud Addresses."""
19
+
20
+ async def list(
21
+ self,
22
+ buyer_id: str,
23
+ *,
24
+ search: Optional[str] = None,
25
+ search_on: Optional[str] = None,
26
+ sort_by: Optional[str] = None,
27
+ page: Optional[int] = None,
28
+ page_size: Optional[int] = None,
29
+ filters: Optional[dict[str, Any]] = None,
30
+ ) -> ListPage[Address]:
31
+ """List addresses
32
+
33
+ Args:
34
+ buyer_id: ID of the buyer.
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
+
42
+ Returns:
43
+ A paginated list of Address objects.
44
+ """
45
+ params = self._build_list_params(
46
+ search=search,
47
+ search_on=search_on,
48
+ sort_by=sort_by,
49
+ page=page,
50
+ page_size=page_size,
51
+ filters=filters,
52
+ )
53
+ resp = await self._http.get(f"/buyers/{buyer_id}/addresses", **params)
54
+ return self._parse_list(resp.json(), Address)
55
+
56
+ async def create(
57
+ self,
58
+ buyer_id: str,
59
+ address: Union[Address, dict[str, Any]],
60
+ ) -> Address:
61
+ """Create an address
62
+
63
+ Args:
64
+ buyer_id: ID of the buyer.
65
+ address: A ``Address`` model or dict. Required fields: Street1, City, Country.
66
+
67
+ Returns:
68
+ The Address object.
69
+ """
70
+ resp = await self._http.post(f"/buyers/{buyer_id}/addresses", json=self._serialize(address))
71
+ return Address(**resp.json())
72
+
73
+ async def get(
74
+ self,
75
+ buyer_id: str,
76
+ address_id: str,
77
+ ) -> Address:
78
+ """Retrieve an address
79
+
80
+ Args:
81
+ buyer_id: ID of the buyer.
82
+ address_id: ID of the address.
83
+
84
+ Returns:
85
+ The Address object.
86
+ """
87
+ resp = await self._http.get(f"/buyers/{buyer_id}/addresses/{address_id}")
88
+ return Address(**resp.json())
89
+
90
+ async def save(
91
+ self,
92
+ buyer_id: str,
93
+ address_id: str,
94
+ address: Union[Address, dict[str, Any]],
95
+ ) -> Address:
96
+ """Create or update an address
97
+
98
+ Args:
99
+ buyer_id: ID of the buyer.
100
+ address_id: ID of the address.
101
+ address: A ``Address`` model or dict. Required fields: Street1, City, Country.
102
+
103
+ Returns:
104
+ The Address object.
105
+ """
106
+ resp = await self._http.put(
107
+ f"/buyers/{buyer_id}/addresses/{address_id}",
108
+ json=self._serialize(address),
109
+ )
110
+ return Address(**resp.json())
111
+
112
+ async def delete(
113
+ self,
114
+ buyer_id: str,
115
+ address_id: str,
116
+ ) -> None:
117
+ """Delete an address
118
+
119
+ Args:
120
+ buyer_id: ID of the buyer.
121
+ address_id: ID of the address.
122
+ """
123
+ await self._http.delete(f"/buyers/{buyer_id}/addresses/{address_id}")
124
+
125
+ async def patch(
126
+ self,
127
+ buyer_id: str,
128
+ address_id: str,
129
+ partial: dict[str, Any],
130
+ ) -> Address:
131
+ """Partially update an address
132
+
133
+ Args:
134
+ buyer_id: ID of the buyer.
135
+ address_id: ID of the address.
136
+ partial: A dict of fields to update.
137
+
138
+ Returns:
139
+ The Address object.
140
+ """
141
+ resp = await self._http.patch(f"/buyers/{buyer_id}/addresses/{address_id}", json=partial)
142
+ return Address(**resp.json())
143
+
144
+ async def delete_assignment(
145
+ self,
146
+ buyer_id: str,
147
+ address_id: str,
148
+ *,
149
+ user_id: Optional[str] = None,
150
+ user_group_id: Optional[str] = None,
151
+ ) -> None:
152
+ """Delete an address assignment
153
+
154
+ Args:
155
+ buyer_id: ID of the buyer.
156
+ address_id: ID of the address.
157
+ user_id: ID of the user.
158
+ user_group_id: ID of the user group.
159
+ """
160
+ _params: dict[str, Any] = {}
161
+ if user_id is not None:
162
+ _params["userID"] = user_id
163
+ if user_group_id is not None:
164
+ _params["userGroupID"] = user_group_id
165
+ await self._http.delete(f"/buyers/{buyer_id}/addresses/{address_id}/assignments", **_params)
166
+
167
+ async def list_assignments(
168
+ self,
169
+ buyer_id: str,
170
+ *,
171
+ address_id: Optional[str] = None,
172
+ user_id: Optional[str] = None,
173
+ user_group_id: Optional[str] = None,
174
+ level: Optional[PartyType] = None,
175
+ is_shipping: Optional[bool] = None,
176
+ is_billing: Optional[bool] = None,
177
+ page: Optional[int] = None,
178
+ page_size: Optional[int] = None,
179
+ ) -> ListPage[AddressAssignment]:
180
+ """List address assignments
181
+
182
+ Args:
183
+ buyer_id: ID of the buyer.
184
+ address_id: ID of the address.
185
+ user_id: ID of the user.
186
+ user_group_id: ID of the user group.
187
+ level: Level of the address assignment. Possible values: User, Group, Company, BuyerGroup.
188
+ is_shipping: Is shipping of the address assignment.
189
+ is_billing: Is billing of the address assignment.
190
+ 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.
191
+ page_size: Number of results to return per page.
192
+
193
+ Returns:
194
+ A paginated list of AddressAssignment objects.
195
+ """
196
+ params = self._build_list_params(
197
+ page=page,
198
+ page_size=page_size,
199
+ )
200
+ if address_id is not None:
201
+ params["addressID"] = address_id
202
+ if user_id is not None:
203
+ params["userID"] = user_id
204
+ if user_group_id is not None:
205
+ params["userGroupID"] = user_group_id
206
+ if level is not None:
207
+ params["level"] = level
208
+ if is_shipping is not None:
209
+ params["isShipping"] = is_shipping
210
+ if is_billing is not None:
211
+ params["isBilling"] = is_billing
212
+ resp = await self._http.get(f"/buyers/{buyer_id}/addresses/assignments", **params)
213
+ return self._parse_list(resp.json(), AddressAssignment)
214
+
215
+ async def save_assignment(
216
+ self,
217
+ buyer_id: str,
218
+ address_assignment: Union[AddressAssignment, dict[str, Any]],
219
+ ) -> None:
220
+ """Create or update an address assignment
221
+
222
+ Args:
223
+ buyer_id: ID of the buyer.
224
+ address_assignment: A ``AddressAssignment`` model or dict. Required fields: AddressID.
225
+ """
226
+ await self._http.post(
227
+ f"/buyers/{buyer_id}/addresses/assignments", json=self._serialize(address_assignment)
228
+ )
@@ -0,0 +1,128 @@
1
+ # GENERATED by tools/codegen — DO NOT EDIT
2
+ # Source: ordercloud-openapi-v3.json
3
+ """OrderCloud AdminAddresses 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.shared import ListPage
10
+ from .base import BaseResource
11
+
12
+ __all__ = ["AdminAddressesResource"]
13
+
14
+
15
+ class AdminAddressesResource(BaseResource):
16
+ """Operations on OrderCloud AdminAddresses."""
17
+
18
+ async def list(
19
+ self,
20
+ *,
21
+ search: Optional[str] = None,
22
+ search_on: Optional[str] = None,
23
+ sort_by: Optional[str] = None,
24
+ page: Optional[int] = None,
25
+ page_size: Optional[int] = None,
26
+ filters: Optional[dict[str, Any]] = None,
27
+ ) -> ListPage[Address]:
28
+ """List admin addresses
29
+
30
+ Args:
31
+ search: Word or phrase to search for.
32
+ search_on: Comma-delimited list of fields to search on.
33
+ sort_by: Comma-delimited list of fields to sort by.
34
+ 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.
35
+ page_size: Number of results to return per page.
36
+ 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.???'
37
+
38
+ Returns:
39
+ A paginated list of Address objects.
40
+ """
41
+ params = self._build_list_params(
42
+ search=search,
43
+ search_on=search_on,
44
+ sort_by=sort_by,
45
+ page=page,
46
+ page_size=page_size,
47
+ filters=filters,
48
+ )
49
+ resp = await self._http.get("/addresses", **params)
50
+ return self._parse_list(resp.json(), Address)
51
+
52
+ async def create(
53
+ self,
54
+ address: Union[Address, dict[str, Any]],
55
+ ) -> Address:
56
+ """Create an admin address
57
+
58
+ Args:
59
+ address: A ``Address`` model or dict. Required fields: Street1, City, Country.
60
+
61
+ Returns:
62
+ The Address object.
63
+ """
64
+ resp = await self._http.post("/addresses", json=self._serialize(address))
65
+ return Address(**resp.json())
66
+
67
+ async def get(
68
+ self,
69
+ address_id: str,
70
+ ) -> Address:
71
+ """Retrieve an admin address
72
+
73
+ Args:
74
+ address_id: ID of the address.
75
+
76
+ Returns:
77
+ The Address object.
78
+ """
79
+ resp = await self._http.get(f"/addresses/{address_id}")
80
+ return Address(**resp.json())
81
+
82
+ async def save(
83
+ self,
84
+ address_id: str,
85
+ address: Union[Address, dict[str, Any]],
86
+ ) -> Address:
87
+ """Create or update an admin address
88
+
89
+ Args:
90
+ address_id: ID of the address.
91
+ address: A ``Address`` model or dict. Required fields: Street1, City, Country.
92
+
93
+ Returns:
94
+ The Address object.
95
+ """
96
+ resp = await self._http.put(
97
+ f"/addresses/{address_id}",
98
+ json=self._serialize(address),
99
+ )
100
+ return Address(**resp.json())
101
+
102
+ async def delete(
103
+ self,
104
+ address_id: str,
105
+ ) -> None:
106
+ """Delete an admin address
107
+
108
+ Args:
109
+ address_id: ID of the address.
110
+ """
111
+ await self._http.delete(f"/addresses/{address_id}")
112
+
113
+ async def patch(
114
+ self,
115
+ address_id: str,
116
+ partial: dict[str, Any],
117
+ ) -> Address:
118
+ """Partially update an admin address
119
+
120
+ Args:
121
+ address_id: ID of the address.
122
+ partial: A dict of fields to update.
123
+
124
+ Returns:
125
+ The Address object.
126
+ """
127
+ resp = await self._http.patch(f"/addresses/{address_id}", json=partial)
128
+ return Address(**resp.json())
@@ -0,0 +1,185 @@
1
+ # GENERATED by tools/codegen — DO NOT EDIT
2
+ # Source: ordercloud-openapi-v3.json
3
+ """OrderCloud AdminUserGroups API resource."""
4
+
5
+ from __future__ import annotations
6
+ from typing import Any, Optional, Union
7
+
8
+ from ..models.assignments import UserGroupAssignment
9
+ from ..models.user_group import UserGroup
10
+ from ..models.shared import ListPage
11
+ from .base import BaseResource
12
+
13
+ __all__ = ["AdminUserGroupsResource"]
14
+
15
+
16
+ class AdminUserGroupsResource(BaseResource):
17
+ """Operations on OrderCloud AdminUserGroups."""
18
+
19
+ async def list(
20
+ self,
21
+ *,
22
+ search: Optional[str] = None,
23
+ search_on: Optional[str] = None,
24
+ sort_by: Optional[str] = None,
25
+ page: Optional[int] = None,
26
+ page_size: Optional[int] = None,
27
+ filters: Optional[dict[str, Any]] = None,
28
+ ) -> ListPage[UserGroup]:
29
+ """List admin user groups
30
+
31
+ Args:
32
+ search: Word or phrase to search for.
33
+ search_on: Comma-delimited list of fields to search on.
34
+ sort_by: Comma-delimited list of fields to sort by.
35
+ 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.
36
+ page_size: Number of results to return per page.
37
+ 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.???'
38
+
39
+ Returns:
40
+ A paginated list of UserGroup objects.
41
+ """
42
+ params = self._build_list_params(
43
+ search=search,
44
+ search_on=search_on,
45
+ sort_by=sort_by,
46
+ page=page,
47
+ page_size=page_size,
48
+ filters=filters,
49
+ )
50
+ resp = await self._http.get("/usergroups", **params)
51
+ return self._parse_list(resp.json(), UserGroup)
52
+
53
+ async def create(
54
+ self,
55
+ user_group: Union[UserGroup, dict[str, Any]],
56
+ ) -> UserGroup:
57
+ """Create an admin user group
58
+
59
+ Args:
60
+ user_group: A ``UserGroup`` model or dict. Required fields: Name.
61
+
62
+ Returns:
63
+ The UserGroup object.
64
+ """
65
+ resp = await self._http.post("/usergroups", json=self._serialize(user_group))
66
+ return UserGroup(**resp.json())
67
+
68
+ async def get(
69
+ self,
70
+ user_group_id: str,
71
+ ) -> UserGroup:
72
+ """Retrieve an admin user group
73
+
74
+ Args:
75
+ user_group_id: ID of the user group.
76
+
77
+ Returns:
78
+ The UserGroup object.
79
+ """
80
+ resp = await self._http.get(f"/usergroups/{user_group_id}")
81
+ return UserGroup(**resp.json())
82
+
83
+ async def save(
84
+ self,
85
+ user_group_id: str,
86
+ user_group: Union[UserGroup, dict[str, Any]],
87
+ ) -> UserGroup:
88
+ """Create or update an admin user group
89
+
90
+ Args:
91
+ user_group_id: ID of the user group.
92
+ user_group: A ``UserGroup`` model or dict. Required fields: Name.
93
+
94
+ Returns:
95
+ The UserGroup object.
96
+ """
97
+ resp = await self._http.put(
98
+ f"/usergroups/{user_group_id}",
99
+ json=self._serialize(user_group),
100
+ )
101
+ return UserGroup(**resp.json())
102
+
103
+ async def delete(
104
+ self,
105
+ user_group_id: str,
106
+ ) -> None:
107
+ """Delete an admin user group
108
+
109
+ Args:
110
+ user_group_id: ID of the user group.
111
+ """
112
+ await self._http.delete(f"/usergroups/{user_group_id}")
113
+
114
+ async def patch(
115
+ self,
116
+ user_group_id: str,
117
+ partial: dict[str, Any],
118
+ ) -> UserGroup:
119
+ """Partially update an admin user group
120
+
121
+ Args:
122
+ user_group_id: ID of the user group.
123
+ partial: A dict of fields to update.
124
+
125
+ Returns:
126
+ The UserGroup object.
127
+ """
128
+ resp = await self._http.patch(f"/usergroups/{user_group_id}", json=partial)
129
+ return UserGroup(**resp.json())
130
+
131
+ async def delete_user_assignment(
132
+ self,
133
+ user_group_id: str,
134
+ user_id: str,
135
+ ) -> None:
136
+ """Delete an admin user group user assignment
137
+
138
+ Args:
139
+ user_group_id: ID of the user group.
140
+ user_id: ID of the user.
141
+ """
142
+ await self._http.delete(f"/usergroups/{user_group_id}/assignments/{user_id}")
143
+
144
+ async def list_user_assignments(
145
+ self,
146
+ *,
147
+ user_group_id: Optional[str] = None,
148
+ user_id: Optional[str] = None,
149
+ page: Optional[int] = None,
150
+ page_size: Optional[int] = None,
151
+ ) -> ListPage[UserGroupAssignment]:
152
+ """List admin user group user assignments
153
+
154
+ Args:
155
+ user_group_id: ID of the user group.
156
+ user_id: ID of the user.
157
+ 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.
158
+ page_size: Number of results to return per page.
159
+
160
+ Returns:
161
+ A paginated list of UserGroupAssignment objects.
162
+ """
163
+ params = self._build_list_params(
164
+ page=page,
165
+ page_size=page_size,
166
+ )
167
+ if user_group_id is not None:
168
+ params["userGroupID"] = user_group_id
169
+ if user_id is not None:
170
+ params["userID"] = user_id
171
+ resp = await self._http.get("/usergroups/assignments", **params)
172
+ return self._parse_list(resp.json(), UserGroupAssignment)
173
+
174
+ async def save_user_assignment(
175
+ self,
176
+ user_group_assignment: Union[UserGroupAssignment, dict[str, Any]],
177
+ ) -> None:
178
+ """Create or update an admin user group user assignment
179
+
180
+ Args:
181
+ user_group_assignment: A ``UserGroupAssignment`` model or dict. Required fields: UserGroupID, UserID.
182
+ """
183
+ await self._http.post(
184
+ "/usergroups/assignments", json=self._serialize(user_group_assignment)
185
+ )