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.
- ordercloud/__init__.py +37 -0
- ordercloud/auth.py +136 -0
- ordercloud/client.py +211 -0
- ordercloud/config.py +42 -0
- ordercloud/errors.py +47 -0
- ordercloud/http.py +218 -0
- ordercloud/middleware.py +66 -0
- ordercloud/models/__init__.py +271 -0
- ordercloud/models/address.py +47 -0
- ordercloud/models/api_client.py +116 -0
- ordercloud/models/approval.py +73 -0
- ordercloud/models/assignments.py +402 -0
- ordercloud/models/auth_models.py +114 -0
- ordercloud/models/bundle.py +31 -0
- ordercloud/models/buyer.py +271 -0
- ordercloud/models/catalog.py +33 -0
- ordercloud/models/category.py +35 -0
- ordercloud/models/cost_center.py +27 -0
- ordercloud/models/credit_card.py +35 -0
- ordercloud/models/delivery.py +277 -0
- ordercloud/models/discount.py +63 -0
- ordercloud/models/integration.py +76 -0
- ordercloud/models/inventory_record.py +53 -0
- ordercloud/models/line_item.py +95 -0
- ordercloud/models/line_item_types.py +89 -0
- ordercloud/models/message_sender.py +80 -0
- ordercloud/models/misc.py +280 -0
- ordercloud/models/open_id_connect.py +47 -0
- ordercloud/models/order.py +477 -0
- ordercloud/models/order_return.py +92 -0
- ordercloud/models/payment.py +77 -0
- ordercloud/models/price_schedule.py +76 -0
- ordercloud/models/product.py +227 -0
- ordercloud/models/product_collection.py +186 -0
- ordercloud/models/promotion.py +297 -0
- ordercloud/models/security.py +89 -0
- ordercloud/models/shared.py +131 -0
- ordercloud/models/shipment.py +150 -0
- ordercloud/models/spec.py +67 -0
- ordercloud/models/spending_account.py +33 -0
- ordercloud/models/subscription.py +125 -0
- ordercloud/models/supplier.py +43 -0
- ordercloud/models/sync.py +172 -0
- ordercloud/models/user.py +207 -0
- ordercloud/models/user_group.py +27 -0
- ordercloud/models/webhook.py +58 -0
- ordercloud/py.typed +0 -0
- ordercloud/resources/__init__.py +65 -0
- ordercloud/resources/addresses.py +228 -0
- ordercloud/resources/admin_addresses.py +128 -0
- ordercloud/resources/admin_user_groups.py +185 -0
- ordercloud/resources/admin_users.py +150 -0
- ordercloud/resources/api_clients.py +308 -0
- ordercloud/resources/approval_rules.py +144 -0
- ordercloud/resources/base.py +145 -0
- ordercloud/resources/bundle_line_items.py +59 -0
- ordercloud/resources/bundle_subscription_items.py +54 -0
- ordercloud/resources/bundles.py +278 -0
- ordercloud/resources/buyer_groups.py +128 -0
- ordercloud/resources/buyers.py +164 -0
- ordercloud/resources/cart.py +613 -0
- ordercloud/resources/catalogs.py +311 -0
- ordercloud/resources/categories.py +392 -0
- ordercloud/resources/cost_centers.py +222 -0
- ordercloud/resources/credit_cards.py +227 -0
- ordercloud/resources/delivery_configurations.py +132 -0
- ordercloud/resources/discounts.py +201 -0
- ordercloud/resources/entity_syncs.py +534 -0
- ordercloud/resources/error_configs.py +71 -0
- ordercloud/resources/forgotten_credentials.py +74 -0
- ordercloud/resources/group_orders.py +28 -0
- ordercloud/resources/impersonation_configs.py +132 -0
- ordercloud/resources/incrementors.py +128 -0
- ordercloud/resources/integration_events.py +203 -0
- ordercloud/resources/inventory_integrations.py +65 -0
- ordercloud/resources/inventory_records.py +484 -0
- ordercloud/resources/line_items.py +262 -0
- ordercloud/resources/locales.py +203 -0
- ordercloud/resources/me.py +1882 -0
- ordercloud/resources/message_senders.py +261 -0
- ordercloud/resources/open_id_connects.py +128 -0
- ordercloud/resources/order_returns.py +306 -0
- ordercloud/resources/order_syncs.py +65 -0
- ordercloud/resources/orders.py +689 -0
- ordercloud/resources/payments.py +176 -0
- ordercloud/resources/price_schedules.py +164 -0
- ordercloud/resources/product_collections.py +116 -0
- ordercloud/resources/product_facets.py +128 -0
- ordercloud/resources/product_syncs.py +76 -0
- ordercloud/resources/products.py +454 -0
- ordercloud/resources/promotion_integrations.py +65 -0
- ordercloud/resources/promotions.py +203 -0
- ordercloud/resources/security_profiles.py +222 -0
- ordercloud/resources/seller_approval_rules.py +128 -0
- ordercloud/resources/shipments.py +256 -0
- ordercloud/resources/specs.py +313 -0
- ordercloud/resources/spending_accounts.py +227 -0
- ordercloud/resources/subscription_integrations.py +65 -0
- ordercloud/resources/subscription_items.py +146 -0
- ordercloud/resources/subscriptions.py +128 -0
- ordercloud/resources/supplier_addresses.py +144 -0
- ordercloud/resources/supplier_user_groups.py +210 -0
- ordercloud/resources/supplier_users.py +170 -0
- ordercloud/resources/suppliers.py +190 -0
- ordercloud/resources/tracking_events.py +130 -0
- ordercloud/resources/user_groups.py +210 -0
- ordercloud/resources/users.py +254 -0
- ordercloud/resources/webhooks.py +128 -0
- ordercloud/resources/xp_indices.py +77 -0
- ordercloud/sync_client.py +170 -0
- ordercloud_python-2026.4.1.dist-info/METADATA +552 -0
- ordercloud_python-2026.4.1.dist-info/RECORD +114 -0
- ordercloud_python-2026.4.1.dist-info/WHEEL +4 -0
- ordercloud_python-2026.4.1.dist-info/licenses/LICENSE +21 -0
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
# GENERATED by tools/codegen — DO NOT EDIT
|
|
2
|
+
# Source: ordercloud-openapi-v3.json
|
|
3
|
+
"""OrderCloud SupplierAddresses 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__ = ["SupplierAddressesResource"]
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class SupplierAddressesResource(BaseResource):
|
|
16
|
+
"""Operations on OrderCloud SupplierAddresses."""
|
|
17
|
+
|
|
18
|
+
async def list(
|
|
19
|
+
self,
|
|
20
|
+
supplier_id: str,
|
|
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[Address]:
|
|
29
|
+
"""List supplier addresses
|
|
30
|
+
|
|
31
|
+
Args:
|
|
32
|
+
supplier_id: ID of the supplier.
|
|
33
|
+
search: Word or phrase to search for.
|
|
34
|
+
search_on: Comma-delimited list of fields to search on.
|
|
35
|
+
sort_by: Comma-delimited list of fields to sort by.
|
|
36
|
+
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.
|
|
37
|
+
page_size: Number of results to return per page.
|
|
38
|
+
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.???'
|
|
39
|
+
|
|
40
|
+
Returns:
|
|
41
|
+
A paginated list of Address objects.
|
|
42
|
+
"""
|
|
43
|
+
params = self._build_list_params(
|
|
44
|
+
search=search,
|
|
45
|
+
search_on=search_on,
|
|
46
|
+
sort_by=sort_by,
|
|
47
|
+
page=page,
|
|
48
|
+
page_size=page_size,
|
|
49
|
+
filters=filters,
|
|
50
|
+
)
|
|
51
|
+
resp = await self._http.get(f"/suppliers/{supplier_id}/addresses", **params)
|
|
52
|
+
return self._parse_list(resp.json(), Address)
|
|
53
|
+
|
|
54
|
+
async def create(
|
|
55
|
+
self,
|
|
56
|
+
supplier_id: str,
|
|
57
|
+
address: Union[Address, dict[str, Any]],
|
|
58
|
+
) -> Address:
|
|
59
|
+
"""Create a supplier address
|
|
60
|
+
|
|
61
|
+
Args:
|
|
62
|
+
supplier_id: ID of the supplier.
|
|
63
|
+
address: A ``Address`` model or dict. Required fields: Street1, City, Country.
|
|
64
|
+
|
|
65
|
+
Returns:
|
|
66
|
+
The Address object.
|
|
67
|
+
"""
|
|
68
|
+
resp = await self._http.post(
|
|
69
|
+
f"/suppliers/{supplier_id}/addresses", json=self._serialize(address)
|
|
70
|
+
)
|
|
71
|
+
return Address(**resp.json())
|
|
72
|
+
|
|
73
|
+
async def get(
|
|
74
|
+
self,
|
|
75
|
+
supplier_id: str,
|
|
76
|
+
address_id: str,
|
|
77
|
+
) -> Address:
|
|
78
|
+
"""Retrieve a supplier address
|
|
79
|
+
|
|
80
|
+
Args:
|
|
81
|
+
supplier_id: ID of the supplier.
|
|
82
|
+
address_id: ID of the address.
|
|
83
|
+
|
|
84
|
+
Returns:
|
|
85
|
+
The Address object.
|
|
86
|
+
"""
|
|
87
|
+
resp = await self._http.get(f"/suppliers/{supplier_id}/addresses/{address_id}")
|
|
88
|
+
return Address(**resp.json())
|
|
89
|
+
|
|
90
|
+
async def save(
|
|
91
|
+
self,
|
|
92
|
+
supplier_id: str,
|
|
93
|
+
address_id: str,
|
|
94
|
+
address: Union[Address, dict[str, Any]],
|
|
95
|
+
) -> Address:
|
|
96
|
+
"""Create or update a supplier address
|
|
97
|
+
|
|
98
|
+
Args:
|
|
99
|
+
supplier_id: ID of the supplier.
|
|
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"/suppliers/{supplier_id}/addresses/{address_id}",
|
|
108
|
+
json=self._serialize(address),
|
|
109
|
+
)
|
|
110
|
+
return Address(**resp.json())
|
|
111
|
+
|
|
112
|
+
async def delete(
|
|
113
|
+
self,
|
|
114
|
+
supplier_id: str,
|
|
115
|
+
address_id: str,
|
|
116
|
+
) -> None:
|
|
117
|
+
"""Delete a supplier address
|
|
118
|
+
|
|
119
|
+
Args:
|
|
120
|
+
supplier_id: ID of the supplier.
|
|
121
|
+
address_id: ID of the address.
|
|
122
|
+
"""
|
|
123
|
+
await self._http.delete(f"/suppliers/{supplier_id}/addresses/{address_id}")
|
|
124
|
+
|
|
125
|
+
async def patch(
|
|
126
|
+
self,
|
|
127
|
+
supplier_id: str,
|
|
128
|
+
address_id: str,
|
|
129
|
+
partial: dict[str, Any],
|
|
130
|
+
) -> Address:
|
|
131
|
+
"""Partially update a supplier address
|
|
132
|
+
|
|
133
|
+
Args:
|
|
134
|
+
supplier_id: ID of the supplier.
|
|
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(
|
|
142
|
+
f"/suppliers/{supplier_id}/addresses/{address_id}", json=partial
|
|
143
|
+
)
|
|
144
|
+
return Address(**resp.json())
|
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
# GENERATED by tools/codegen — DO NOT EDIT
|
|
2
|
+
# Source: ordercloud-openapi-v3.json
|
|
3
|
+
"""OrderCloud SupplierUserGroups 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__ = ["SupplierUserGroupsResource"]
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class SupplierUserGroupsResource(BaseResource):
|
|
17
|
+
"""Operations on OrderCloud SupplierUserGroups."""
|
|
18
|
+
|
|
19
|
+
async def list(
|
|
20
|
+
self,
|
|
21
|
+
supplier_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
|
+
) -> ListPage[UserGroup]:
|
|
30
|
+
"""List supplier user groups
|
|
31
|
+
|
|
32
|
+
Args:
|
|
33
|
+
supplier_id: ID of the supplier.
|
|
34
|
+
search: Word or phrase to search for.
|
|
35
|
+
search_on: Comma-delimited list of fields to search on.
|
|
36
|
+
sort_by: Comma-delimited list of fields to sort by.
|
|
37
|
+
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.
|
|
38
|
+
page_size: Number of results to return per page.
|
|
39
|
+
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.???'
|
|
40
|
+
|
|
41
|
+
Returns:
|
|
42
|
+
A paginated list of UserGroup objects.
|
|
43
|
+
"""
|
|
44
|
+
params = self._build_list_params(
|
|
45
|
+
search=search,
|
|
46
|
+
search_on=search_on,
|
|
47
|
+
sort_by=sort_by,
|
|
48
|
+
page=page,
|
|
49
|
+
page_size=page_size,
|
|
50
|
+
filters=filters,
|
|
51
|
+
)
|
|
52
|
+
resp = await self._http.get(f"/suppliers/{supplier_id}/usergroups", **params)
|
|
53
|
+
return self._parse_list(resp.json(), UserGroup)
|
|
54
|
+
|
|
55
|
+
async def create(
|
|
56
|
+
self,
|
|
57
|
+
supplier_id: str,
|
|
58
|
+
user_group: Union[UserGroup, dict[str, Any]],
|
|
59
|
+
) -> UserGroup:
|
|
60
|
+
"""Create a supplier user group
|
|
61
|
+
|
|
62
|
+
Args:
|
|
63
|
+
supplier_id: ID of the supplier.
|
|
64
|
+
user_group: A ``UserGroup`` model or dict. Required fields: Name.
|
|
65
|
+
|
|
66
|
+
Returns:
|
|
67
|
+
The UserGroup object.
|
|
68
|
+
"""
|
|
69
|
+
resp = await self._http.post(
|
|
70
|
+
f"/suppliers/{supplier_id}/usergroups", json=self._serialize(user_group)
|
|
71
|
+
)
|
|
72
|
+
return UserGroup(**resp.json())
|
|
73
|
+
|
|
74
|
+
async def get(
|
|
75
|
+
self,
|
|
76
|
+
supplier_id: str,
|
|
77
|
+
user_group_id: str,
|
|
78
|
+
) -> UserGroup:
|
|
79
|
+
"""Retrieve a supplier user group
|
|
80
|
+
|
|
81
|
+
Args:
|
|
82
|
+
supplier_id: ID of the supplier.
|
|
83
|
+
user_group_id: ID of the user group.
|
|
84
|
+
|
|
85
|
+
Returns:
|
|
86
|
+
The UserGroup object.
|
|
87
|
+
"""
|
|
88
|
+
resp = await self._http.get(f"/suppliers/{supplier_id}/usergroups/{user_group_id}")
|
|
89
|
+
return UserGroup(**resp.json())
|
|
90
|
+
|
|
91
|
+
async def save(
|
|
92
|
+
self,
|
|
93
|
+
supplier_id: str,
|
|
94
|
+
user_group_id: str,
|
|
95
|
+
user_group: Union[UserGroup, dict[str, Any]],
|
|
96
|
+
) -> UserGroup:
|
|
97
|
+
"""Create or update a supplier user group
|
|
98
|
+
|
|
99
|
+
Args:
|
|
100
|
+
supplier_id: ID of the supplier.
|
|
101
|
+
user_group_id: ID of the user group.
|
|
102
|
+
user_group: A ``UserGroup`` model or dict. Required fields: Name.
|
|
103
|
+
|
|
104
|
+
Returns:
|
|
105
|
+
The UserGroup object.
|
|
106
|
+
"""
|
|
107
|
+
resp = await self._http.put(
|
|
108
|
+
f"/suppliers/{supplier_id}/usergroups/{user_group_id}",
|
|
109
|
+
json=self._serialize(user_group),
|
|
110
|
+
)
|
|
111
|
+
return UserGroup(**resp.json())
|
|
112
|
+
|
|
113
|
+
async def delete(
|
|
114
|
+
self,
|
|
115
|
+
supplier_id: str,
|
|
116
|
+
user_group_id: str,
|
|
117
|
+
) -> None:
|
|
118
|
+
"""Delete a supplier user group
|
|
119
|
+
|
|
120
|
+
Args:
|
|
121
|
+
supplier_id: ID of the supplier.
|
|
122
|
+
user_group_id: ID of the user group.
|
|
123
|
+
"""
|
|
124
|
+
await self._http.delete(f"/suppliers/{supplier_id}/usergroups/{user_group_id}")
|
|
125
|
+
|
|
126
|
+
async def patch(
|
|
127
|
+
self,
|
|
128
|
+
supplier_id: str,
|
|
129
|
+
user_group_id: str,
|
|
130
|
+
partial: dict[str, Any],
|
|
131
|
+
) -> UserGroup:
|
|
132
|
+
"""Partially update a supplier user group
|
|
133
|
+
|
|
134
|
+
Args:
|
|
135
|
+
supplier_id: ID of the supplier.
|
|
136
|
+
user_group_id: ID of the user group.
|
|
137
|
+
partial: A dict of fields to update.
|
|
138
|
+
|
|
139
|
+
Returns:
|
|
140
|
+
The UserGroup object.
|
|
141
|
+
"""
|
|
142
|
+
resp = await self._http.patch(
|
|
143
|
+
f"/suppliers/{supplier_id}/usergroups/{user_group_id}", json=partial
|
|
144
|
+
)
|
|
145
|
+
return UserGroup(**resp.json())
|
|
146
|
+
|
|
147
|
+
async def delete_user_assignment(
|
|
148
|
+
self,
|
|
149
|
+
supplier_id: str,
|
|
150
|
+
user_group_id: str,
|
|
151
|
+
user_id: str,
|
|
152
|
+
) -> None:
|
|
153
|
+
"""Delete a supplier user group user assignment
|
|
154
|
+
|
|
155
|
+
Args:
|
|
156
|
+
supplier_id: ID of the supplier.
|
|
157
|
+
user_group_id: ID of the user group.
|
|
158
|
+
user_id: ID of the user.
|
|
159
|
+
"""
|
|
160
|
+
await self._http.delete(
|
|
161
|
+
f"/suppliers/{supplier_id}/usergroups/{user_group_id}/assignments/{user_id}"
|
|
162
|
+
)
|
|
163
|
+
|
|
164
|
+
async def list_user_assignments(
|
|
165
|
+
self,
|
|
166
|
+
supplier_id: str,
|
|
167
|
+
*,
|
|
168
|
+
user_group_id: Optional[str] = None,
|
|
169
|
+
user_id: Optional[str] = None,
|
|
170
|
+
page: Optional[int] = None,
|
|
171
|
+
page_size: Optional[int] = None,
|
|
172
|
+
) -> ListPage[UserGroupAssignment]:
|
|
173
|
+
"""List supplier user group user assignments
|
|
174
|
+
|
|
175
|
+
Args:
|
|
176
|
+
supplier_id: ID of the supplier.
|
|
177
|
+
user_group_id: ID of the user group.
|
|
178
|
+
user_id: ID of the user.
|
|
179
|
+
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.
|
|
180
|
+
page_size: Number of results to return per page.
|
|
181
|
+
|
|
182
|
+
Returns:
|
|
183
|
+
A paginated list of UserGroupAssignment objects.
|
|
184
|
+
"""
|
|
185
|
+
params = self._build_list_params(
|
|
186
|
+
page=page,
|
|
187
|
+
page_size=page_size,
|
|
188
|
+
)
|
|
189
|
+
if user_group_id is not None:
|
|
190
|
+
params["userGroupID"] = user_group_id
|
|
191
|
+
if user_id is not None:
|
|
192
|
+
params["userID"] = user_id
|
|
193
|
+
resp = await self._http.get(f"/suppliers/{supplier_id}/usergroups/assignments", **params)
|
|
194
|
+
return self._parse_list(resp.json(), UserGroupAssignment)
|
|
195
|
+
|
|
196
|
+
async def save_user_assignment(
|
|
197
|
+
self,
|
|
198
|
+
supplier_id: str,
|
|
199
|
+
user_group_assignment: Union[UserGroupAssignment, dict[str, Any]],
|
|
200
|
+
) -> None:
|
|
201
|
+
"""Create or update a supplier user group user assignment
|
|
202
|
+
|
|
203
|
+
Args:
|
|
204
|
+
supplier_id: ID of the supplier.
|
|
205
|
+
user_group_assignment: A ``UserGroupAssignment`` model or dict. Required fields: UserGroupID, UserID.
|
|
206
|
+
"""
|
|
207
|
+
await self._http.post(
|
|
208
|
+
f"/suppliers/{supplier_id}/usergroups/assignments",
|
|
209
|
+
json=self._serialize(user_group_assignment),
|
|
210
|
+
)
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
# GENERATED by tools/codegen — DO NOT EDIT
|
|
2
|
+
# Source: ordercloud-openapi-v3.json
|
|
3
|
+
"""OrderCloud SupplierUsers API resource."""
|
|
4
|
+
|
|
5
|
+
from __future__ import annotations
|
|
6
|
+
from typing import Any, Optional, Union
|
|
7
|
+
|
|
8
|
+
from ..models.user import User
|
|
9
|
+
from ..models.shared import ListPage
|
|
10
|
+
from .base import BaseResource
|
|
11
|
+
|
|
12
|
+
__all__ = ["SupplierUsersResource"]
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class SupplierUsersResource(BaseResource):
|
|
16
|
+
"""Operations on OrderCloud SupplierUsers."""
|
|
17
|
+
|
|
18
|
+
async def list(
|
|
19
|
+
self,
|
|
20
|
+
supplier_id: str,
|
|
21
|
+
*,
|
|
22
|
+
user_group_id: Optional[str] = None,
|
|
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
|
+
) -> ListPage[User]:
|
|
30
|
+
"""List supplier users
|
|
31
|
+
|
|
32
|
+
Args:
|
|
33
|
+
supplier_id: ID of the supplier.
|
|
34
|
+
user_group_id: ID of the user group.
|
|
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 User 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
|
+
if user_group_id is not None:
|
|
54
|
+
params["userGroupID"] = user_group_id
|
|
55
|
+
resp = await self._http.get(f"/suppliers/{supplier_id}/users", **params)
|
|
56
|
+
return self._parse_list(resp.json(), User)
|
|
57
|
+
|
|
58
|
+
async def create(
|
|
59
|
+
self,
|
|
60
|
+
supplier_id: str,
|
|
61
|
+
user: Union[User, dict[str, Any]],
|
|
62
|
+
) -> User:
|
|
63
|
+
"""Create a supplier user
|
|
64
|
+
|
|
65
|
+
Args:
|
|
66
|
+
supplier_id: ID of the supplier.
|
|
67
|
+
user: A ``User`` model or dict. Required fields: Username, FirstName, LastName, Email, Active.
|
|
68
|
+
|
|
69
|
+
Returns:
|
|
70
|
+
The User object.
|
|
71
|
+
"""
|
|
72
|
+
resp = await self._http.post(f"/suppliers/{supplier_id}/users", json=self._serialize(user))
|
|
73
|
+
return User(**resp.json())
|
|
74
|
+
|
|
75
|
+
async def get(
|
|
76
|
+
self,
|
|
77
|
+
supplier_id: str,
|
|
78
|
+
user_id: str,
|
|
79
|
+
) -> User:
|
|
80
|
+
"""Retrieve a supplier user
|
|
81
|
+
|
|
82
|
+
Args:
|
|
83
|
+
supplier_id: ID of the supplier.
|
|
84
|
+
user_id: ID of the user.
|
|
85
|
+
|
|
86
|
+
Returns:
|
|
87
|
+
The User object.
|
|
88
|
+
"""
|
|
89
|
+
resp = await self._http.get(f"/suppliers/{supplier_id}/users/{user_id}")
|
|
90
|
+
return User(**resp.json())
|
|
91
|
+
|
|
92
|
+
async def save(
|
|
93
|
+
self,
|
|
94
|
+
supplier_id: str,
|
|
95
|
+
user_id: str,
|
|
96
|
+
user: Union[User, dict[str, Any]],
|
|
97
|
+
) -> User:
|
|
98
|
+
"""Create or update a supplier user
|
|
99
|
+
|
|
100
|
+
Args:
|
|
101
|
+
supplier_id: ID of the supplier.
|
|
102
|
+
user_id: ID of the user.
|
|
103
|
+
user: A ``User`` model or dict. Required fields: Username, FirstName, LastName, Email, Active.
|
|
104
|
+
|
|
105
|
+
Returns:
|
|
106
|
+
The User object.
|
|
107
|
+
"""
|
|
108
|
+
resp = await self._http.put(
|
|
109
|
+
f"/suppliers/{supplier_id}/users/{user_id}",
|
|
110
|
+
json=self._serialize(user),
|
|
111
|
+
)
|
|
112
|
+
return User(**resp.json())
|
|
113
|
+
|
|
114
|
+
async def delete(
|
|
115
|
+
self,
|
|
116
|
+
supplier_id: str,
|
|
117
|
+
user_id: str,
|
|
118
|
+
) -> None:
|
|
119
|
+
"""Delete a supplier user
|
|
120
|
+
|
|
121
|
+
Args:
|
|
122
|
+
supplier_id: ID of the supplier.
|
|
123
|
+
user_id: ID of the user.
|
|
124
|
+
"""
|
|
125
|
+
await self._http.delete(f"/suppliers/{supplier_id}/users/{user_id}")
|
|
126
|
+
|
|
127
|
+
async def patch(
|
|
128
|
+
self,
|
|
129
|
+
supplier_id: str,
|
|
130
|
+
user_id: str,
|
|
131
|
+
partial: dict[str, Any],
|
|
132
|
+
) -> User:
|
|
133
|
+
"""Partially update a supplier user
|
|
134
|
+
|
|
135
|
+
Args:
|
|
136
|
+
supplier_id: ID of the supplier.
|
|
137
|
+
user_id: ID of the user.
|
|
138
|
+
partial: A dict of fields to update.
|
|
139
|
+
|
|
140
|
+
Returns:
|
|
141
|
+
The User object.
|
|
142
|
+
"""
|
|
143
|
+
resp = await self._http.patch(f"/suppliers/{supplier_id}/users/{user_id}", json=partial)
|
|
144
|
+
return User(**resp.json())
|
|
145
|
+
|
|
146
|
+
async def revoke_user_tokens(
|
|
147
|
+
self,
|
|
148
|
+
supplier_id: str,
|
|
149
|
+
user_id: str,
|
|
150
|
+
) -> None:
|
|
151
|
+
"""Revoke a user tokens
|
|
152
|
+
|
|
153
|
+
Args:
|
|
154
|
+
supplier_id: ID of the supplier.
|
|
155
|
+
user_id: ID of the user.
|
|
156
|
+
"""
|
|
157
|
+
await self._http.delete(f"/suppliers/{supplier_id}/users/{user_id}/tokens")
|
|
158
|
+
|
|
159
|
+
async def unlock_user_account(
|
|
160
|
+
self,
|
|
161
|
+
supplier_id: str,
|
|
162
|
+
user_id: str,
|
|
163
|
+
) -> None:
|
|
164
|
+
"""Unlock a user account
|
|
165
|
+
|
|
166
|
+
Args:
|
|
167
|
+
supplier_id: ID of the supplier.
|
|
168
|
+
user_id: ID of the user.
|
|
169
|
+
"""
|
|
170
|
+
await self._http.post(f"/suppliers/{supplier_id}/users/{user_id}/unlock")
|