python-bestbuy 0.1.0__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.
- bestbuy/__init__.py +0 -0
- bestbuy/clients/__init__.py +9 -0
- bestbuy/clients/base.py +178 -0
- bestbuy/clients/catalog.py +64 -0
- bestbuy/clients/commerce.py +74 -0
- bestbuy/configs/__init__.py +5 -0
- bestbuy/configs/base.py +14 -0
- bestbuy/configs/catalog.py +6 -0
- bestbuy/configs/commerce.py +10 -0
- bestbuy/exceptions.py +59 -0
- bestbuy/loggers.py +11 -0
- bestbuy/models/__init__.py +205 -0
- bestbuy/models/catalog.py +948 -0
- bestbuy/models/commerce.py +603 -0
- bestbuy/operations/__init__.py +50 -0
- bestbuy/operations/base.py +10 -0
- bestbuy/operations/catalog.py +1443 -0
- bestbuy/operations/commerce.py +1208 -0
- bestbuy/operations/pagination.py +237 -0
- bestbuy/py.typed +0 -0
- bestbuy/typing.py +4 -0
- bestbuy/utils/__init__.py +9 -0
- bestbuy/utils/encryption.py +103 -0
- bestbuy/utils/errors.py +164 -0
- python_bestbuy-0.1.0.dist-info/METADATA +544 -0
- python_bestbuy-0.1.0.dist-info/RECORD +28 -0
- python_bestbuy-0.1.0.dist-info/WHEEL +4 -0
- python_bestbuy-0.1.0.dist-info/licenses/LICENSE +21 -0
|
@@ -0,0 +1,603 @@
|
|
|
1
|
+
from datetime import date
|
|
2
|
+
from decimal import Decimal
|
|
3
|
+
from enum import Enum
|
|
4
|
+
from typing import Optional, List
|
|
5
|
+
|
|
6
|
+
from pydantic_xml import BaseXmlModel, element, attr, wrapped
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class OrderStatus(str, Enum):
|
|
10
|
+
AWAITING_RETURN_PICKUP = "Awaiting Return Pickup"
|
|
11
|
+
AWAITING_SCHEDULING = "Awaiting Scheduling"
|
|
12
|
+
BACKORDERED = "Backordered"
|
|
13
|
+
CANCELED = "Canceled"
|
|
14
|
+
COMPLETED = "Completed"
|
|
15
|
+
DELAYED = "Delayed"
|
|
16
|
+
DELIVERED = "Delivered"
|
|
17
|
+
IN_PROGRESS = "In Progress"
|
|
18
|
+
INCOMPLETE = "Incomplete"
|
|
19
|
+
ITEM_RETURNED = "Item Returned"
|
|
20
|
+
ORDER_RECEIVED = "Order Received"
|
|
21
|
+
OUT_FOR_DELIVERY = "Out for Delivery"
|
|
22
|
+
OUT_OF_STOCK = "Out of Stock"
|
|
23
|
+
PENDING_CANCELLATION = "Pending Cancellation"
|
|
24
|
+
PICKED_UP = "Picked Up"
|
|
25
|
+
PRE_ORDERED = "Pre-Ordered"
|
|
26
|
+
PREPARING = "Preparing"
|
|
27
|
+
READY_TO_PICK_UP = "Ready to Pick Up"
|
|
28
|
+
REFUND_PENDING = "Refund Pending"
|
|
29
|
+
RESCHEDULE_REQUIRED = "Reschedule Required"
|
|
30
|
+
RETURN_IN_TRANSIT = "Return In Transit"
|
|
31
|
+
RETURN_RECEIVED = "Return Received"
|
|
32
|
+
RETURN_REQUEST_CONFIRMED = "Return Request Confirmed"
|
|
33
|
+
RETURNED = "Returned"
|
|
34
|
+
SCHEDULED = "Scheduled"
|
|
35
|
+
SCHEDULING_NEEDED = "Scheduling Needed"
|
|
36
|
+
SHIPPED = "Shipped"
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
class DeliveryOption(BaseXmlModel, tag="option"):
|
|
40
|
+
delivery_date: date = attr(name="date")
|
|
41
|
+
start_time: str = attr(name="start-time")
|
|
42
|
+
end_time: str = attr(name="end-time")
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
class DeliveryOptionsResponse(BaseXmlModel, tag="delivery-options"):
|
|
46
|
+
options: List[DeliveryOption] = element(tag="option", default_factory=list)
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
class DeliveryService(BaseXmlModel, tag="delivery-service"):
|
|
50
|
+
service_type: str = element(tag="service-type")
|
|
51
|
+
delivery_service_id: str = element(tag="delivery-service-id")
|
|
52
|
+
service_display_name: str = element(tag="service-display-name")
|
|
53
|
+
service_long_description: str = element(tag="service-long-description")
|
|
54
|
+
price: Decimal = element(tag="price")
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
class DeliveryServicesResponse(BaseXmlModel, tag="delivery-services"):
|
|
58
|
+
sku: str = element(tag="sku")
|
|
59
|
+
zipcode: str = element(tag="zipcode")
|
|
60
|
+
delivery_services: List[DeliveryService] = element(
|
|
61
|
+
tag="delivery-service", default_factory=list
|
|
62
|
+
)
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
class DeliveryDateQueryItem(BaseXmlModel, tag="item"):
|
|
66
|
+
sku_id: str = attr(name="sku-id")
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
class DeliveryDateQuery(BaseXmlModel, tag="deliverydate-query"):
|
|
70
|
+
item: DeliveryDateQueryItem = element(tag="item")
|
|
71
|
+
zipcode: str = element(tag="zipcode")
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
class DeliveryDateResponse(BaseXmlModel, tag="deliverydate-response"):
|
|
75
|
+
delivery_dates: List[date] = element(tag="deliverydate", default_factory=list)
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
class AvailabilityQueryRequest(BaseXmlModel, tag="availability-query"):
|
|
79
|
+
sku_id: str = element(tag="sku-id")
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
class AvailabilityQueryResponse(BaseXmlModel, tag="availability-query"):
|
|
83
|
+
sku_id: str = attr(name="sku-id")
|
|
84
|
+
order_code: int = element(tag="order-code")
|
|
85
|
+
display_message: str = element(tag="display-message")
|
|
86
|
+
home_delivery_code: int = element(tag="home-delivery-code")
|
|
87
|
+
home_delivery_message: str = element(tag="home-delivery-message")
|
|
88
|
+
instore_availability: bool = element(tag="instore-availability")
|
|
89
|
+
max_quantity: int = element(tag="max-quantity")
|
|
90
|
+
available_for_shipping: Optional[bool] = element(
|
|
91
|
+
tag="available-for-shipping", default=None
|
|
92
|
+
)
|
|
93
|
+
available_for_delivery: Optional[bool] = element(
|
|
94
|
+
tag="available-for-delivery", default=None
|
|
95
|
+
)
|
|
96
|
+
available_for_pickup: Optional[bool] = element(
|
|
97
|
+
tag="available-for-pickup", default=None
|
|
98
|
+
)
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
class ShippingAddress(BaseXmlModel, tag="address"):
|
|
102
|
+
address1: str = element(tag="address1")
|
|
103
|
+
address2: Optional[str] = element(tag="address2", default="")
|
|
104
|
+
city: str = element(tag="city")
|
|
105
|
+
state: str = element(tag="state")
|
|
106
|
+
postalcode: str = element(tag="postalcode")
|
|
107
|
+
country: str = element(tag="country", default="US")
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
class ShippingQueryItem(BaseXmlModel, tag="item"):
|
|
111
|
+
sku: str = attr(name="sku")
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
class ShippingQueryRequest(BaseXmlModel, tag="shipping-query"):
|
|
115
|
+
address: ShippingAddress = element(tag="address")
|
|
116
|
+
item: ShippingQueryItem = element(tag="item")
|
|
117
|
+
|
|
118
|
+
|
|
119
|
+
class ShippingOption(BaseXmlModel, tag="option"):
|
|
120
|
+
price: Decimal = attr(name="price")
|
|
121
|
+
currency: str = attr(name="currency")
|
|
122
|
+
expected_delivery_date: date = attr(name="expected-delivery-date")
|
|
123
|
+
key: str = attr(name="key")
|
|
124
|
+
name: str # Text content of the element
|
|
125
|
+
|
|
126
|
+
|
|
127
|
+
class ShippingOptionsResponse(BaseXmlModel, tag="shipping-options"):
|
|
128
|
+
sku_id: str = attr(name="sku-id")
|
|
129
|
+
free_shipping: bool = attr(name="free-shipping")
|
|
130
|
+
options: List[ShippingOption] = element(tag="option", default_factory=list)
|
|
131
|
+
|
|
132
|
+
|
|
133
|
+
class PriceQueryRequest(BaseXmlModel, tag="price-query"):
|
|
134
|
+
sku_id: str = element(tag="sku-id")
|
|
135
|
+
|
|
136
|
+
|
|
137
|
+
class UnitPrice(BaseXmlModel, tag="unit-price"):
|
|
138
|
+
sku_id: Optional[str] = attr(name="sku-id", default=None)
|
|
139
|
+
currency: str = attr(name="currency")
|
|
140
|
+
value: Decimal # Text content of the element
|
|
141
|
+
|
|
142
|
+
|
|
143
|
+
class PriceResponse(BaseXmlModel, tag="price-response"):
|
|
144
|
+
unit_price: UnitPrice = element(tag="unit-price")
|
|
145
|
+
|
|
146
|
+
|
|
147
|
+
class EstimateTaxQuery(BaseXmlModel, tag="estimate-tax"):
|
|
148
|
+
sku_id: str = element(tag="sku-id")
|
|
149
|
+
zipcode: str = element(tag="zipcode")
|
|
150
|
+
shipping_option: Optional[str] = element(tag="shipping-option", default=None)
|
|
151
|
+
|
|
152
|
+
|
|
153
|
+
class EstimatedTax(BaseXmlModel, tag="estimated-tax"):
|
|
154
|
+
sku_id: str = attr(name="sku-id")
|
|
155
|
+
currency: str = attr(name="currency")
|
|
156
|
+
value: Decimal = element(tag="value")
|
|
157
|
+
|
|
158
|
+
|
|
159
|
+
class StoreQuery(BaseXmlModel, tag="store-query"):
|
|
160
|
+
skuid: str = element(tag="skuid")
|
|
161
|
+
zipcode: str = element(tag="zipcode")
|
|
162
|
+
storecount: Optional[int] = element(tag="storecount", default=None)
|
|
163
|
+
|
|
164
|
+
|
|
165
|
+
class Store(BaseXmlModel, tag="store"):
|
|
166
|
+
id: str = attr(name="id")
|
|
167
|
+
name: str = attr(name="name")
|
|
168
|
+
availability_msg: str = attr(name="availabilityMsg")
|
|
169
|
+
href: str = attr(name="href")
|
|
170
|
+
ship_to_store: Optional[bool] = attr(name="ship-to-store", default=None)
|
|
171
|
+
service_level: Optional[str] = attr(name="service-level", default=None)
|
|
172
|
+
|
|
173
|
+
|
|
174
|
+
class Link(BaseXmlModel, tag="link"):
|
|
175
|
+
rel: str = attr(name="rel")
|
|
176
|
+
href: str = attr(name="href")
|
|
177
|
+
|
|
178
|
+
|
|
179
|
+
class StoresResponse(BaseXmlModel, tag="stores"):
|
|
180
|
+
total_count: int = attr(name="totalCount")
|
|
181
|
+
stores: List[Store] = element(tag="store", default_factory=list)
|
|
182
|
+
next_link: Optional[Link] = element(tag="link", default=None)
|
|
183
|
+
|
|
184
|
+
|
|
185
|
+
class ProductServiceRequest(BaseXmlModel, tag="productservice-request"):
|
|
186
|
+
skuid: str = element(tag="skuid")
|
|
187
|
+
zipcode: str = element(tag="zipcode")
|
|
188
|
+
|
|
189
|
+
|
|
190
|
+
class AvailabilityQuery(BaseXmlModel, tag="availability-query"):
|
|
191
|
+
sku_id: str = attr(name="sku-id")
|
|
192
|
+
order_code: int = element(tag="order-code")
|
|
193
|
+
display_message: str = element(tag="display-message")
|
|
194
|
+
home_delivery_code: int = element(tag="home-delivery-code")
|
|
195
|
+
home_delivery_message: str = element(tag="home-delivery-message")
|
|
196
|
+
instore_availability: bool = element(tag="instore-availability")
|
|
197
|
+
max_quantity: int = element(tag="max-quantity")
|
|
198
|
+
|
|
199
|
+
|
|
200
|
+
class ProductServiceResponse(BaseXmlModel, tag="productservice-response"):
|
|
201
|
+
availability_query: Optional[AvailabilityQuery] = element(
|
|
202
|
+
tag="availability-query", default=None
|
|
203
|
+
)
|
|
204
|
+
price_response: Optional[PriceResponse] = element(
|
|
205
|
+
tag="price-response", default=None
|
|
206
|
+
)
|
|
207
|
+
estimated_tax: Optional[EstimatedTax] = element(tag="estimated-tax", default=None)
|
|
208
|
+
shipping_options: Optional[ShippingOptionsResponse] = element(
|
|
209
|
+
tag="shipping-options", default=None
|
|
210
|
+
)
|
|
211
|
+
deliverydate_response: Optional[DeliveryDateResponse] = element(
|
|
212
|
+
tag="deliverydate-response", default=None
|
|
213
|
+
)
|
|
214
|
+
stores: Optional[StoresResponse] = element(tag="stores", default=None)
|
|
215
|
+
|
|
216
|
+
|
|
217
|
+
class Cost(BaseXmlModel, tag="cost"):
|
|
218
|
+
currency: str = attr(name="currency")
|
|
219
|
+
value: Decimal
|
|
220
|
+
|
|
221
|
+
|
|
222
|
+
class TaxCost(BaseXmlModel, tag="tax-cost"):
|
|
223
|
+
currency: str = attr(name="currency")
|
|
224
|
+
value: Optional[Decimal] = None # Can be empty
|
|
225
|
+
|
|
226
|
+
|
|
227
|
+
class ShippingCost(BaseXmlModel, tag="shipping-cost"):
|
|
228
|
+
currency: str = attr(name="currency")
|
|
229
|
+
fulfillment_id: Optional[str] = attr(name="fulfillment-id", default=None)
|
|
230
|
+
value: Decimal
|
|
231
|
+
|
|
232
|
+
|
|
233
|
+
class OrderItem(BaseXmlModel, tag="item"):
|
|
234
|
+
id: str = attr(name="id")
|
|
235
|
+
quantity: Optional[int] = element(tag="quantity", default=None)
|
|
236
|
+
link: Optional[Link] = element(tag="link", default=None)
|
|
237
|
+
sku: Optional[str] = attr(name="sku", default=None)
|
|
238
|
+
backordered: Optional[bool] = attr(name="backordered", default=None)
|
|
239
|
+
description: Optional[str] = element(tag="description", default=None)
|
|
240
|
+
unit_price: Optional[UnitPrice] = element(tag="unit-price", default=None)
|
|
241
|
+
cost: Optional[Cost] = element(tag="cost", default=None)
|
|
242
|
+
tax_cost: Optional[TaxCost] = element(tag="tax-cost", default=None)
|
|
243
|
+
shipping_cost: Optional[ShippingCost] = element(tag="shipping-cost", default=None)
|
|
244
|
+
|
|
245
|
+
|
|
246
|
+
class OrderList(BaseXmlModel, tag="list"):
|
|
247
|
+
id: Optional[str] = attr(name="id", default=None)
|
|
248
|
+
lastmodified: Optional[str] = attr(name="lastmodified", default=None)
|
|
249
|
+
items: List[OrderItem] = wrapped("items", element(tag="item", default_factory=list))
|
|
250
|
+
|
|
251
|
+
|
|
252
|
+
class OrderAddress(BaseXmlModel, tag="address"):
|
|
253
|
+
type: str = attr(name="type")
|
|
254
|
+
verified: Optional[bool] = attr(name="verified", default=None)
|
|
255
|
+
firstname: str = element(tag="firstname")
|
|
256
|
+
middlename: Optional[str] = element(tag="middlename", default="")
|
|
257
|
+
lastname: str = element(tag="lastname")
|
|
258
|
+
address1: str = element(tag="address1")
|
|
259
|
+
address2: Optional[str] = element(tag="address2", default="")
|
|
260
|
+
city: str = element(tag="city")
|
|
261
|
+
state: str = element(tag="state")
|
|
262
|
+
country: Optional[str] = element(tag="country", default=None)
|
|
263
|
+
postalcode: str = element(tag="postalcode")
|
|
264
|
+
phonenumber: Optional[str] = element(tag="phonenumber", default=None)
|
|
265
|
+
email: Optional[str] = element(tag="email", default=None)
|
|
266
|
+
otherphone: Optional[str] = element(tag="otherphone", default=None)
|
|
267
|
+
fulfillment_id: Optional[str] = attr(name="fulfillment-id", default=None)
|
|
268
|
+
tender_id: Optional[str] = attr(name="tender-id", default=None)
|
|
269
|
+
|
|
270
|
+
|
|
271
|
+
class Shipping(BaseXmlModel, tag="shipping"):
|
|
272
|
+
option: str = attr(name="option")
|
|
273
|
+
|
|
274
|
+
|
|
275
|
+
class AddressFulfillment(BaseXmlModel, tag="address-fulfillment"):
|
|
276
|
+
list: Optional[str] = attr(name="list", default=None)
|
|
277
|
+
item_id: str = attr(name="item-id")
|
|
278
|
+
shipping: Optional[Shipping] = element(tag="shipping", default=None)
|
|
279
|
+
address: Optional[OrderAddress] = element(tag="address", default=None)
|
|
280
|
+
id: Optional[str] = attr(name="id", default=None)
|
|
281
|
+
estimated_shipping_date: Optional[date] = attr(
|
|
282
|
+
name="estimated-shipping-date", default=None
|
|
283
|
+
)
|
|
284
|
+
|
|
285
|
+
|
|
286
|
+
class FriendsFamilyDetails(BaseXmlModel, tag="friends-family-details"):
|
|
287
|
+
firstname: str = element(tag="firstname")
|
|
288
|
+
lastname: str = element(tag="lastname")
|
|
289
|
+
emailaddress: str = element(tag="emailaddress")
|
|
290
|
+
phonenumber: str = element(tag="phonenumber")
|
|
291
|
+
|
|
292
|
+
|
|
293
|
+
class StoreFulfillment(BaseXmlModel, tag="store-fulfillment"):
|
|
294
|
+
store_id: str = attr(name="store-id")
|
|
295
|
+
list: str = attr(name="list")
|
|
296
|
+
item_id: str = attr(name="item-id")
|
|
297
|
+
ship_to_store: Optional[bool] = attr(name="ship-to-store", default=None)
|
|
298
|
+
service_level: Optional[str] = attr(name="service-level", default=None)
|
|
299
|
+
friends_family_details: Optional[FriendsFamilyDetails] = element(
|
|
300
|
+
tag="friends-family-details", default=None
|
|
301
|
+
)
|
|
302
|
+
|
|
303
|
+
|
|
304
|
+
class HomeDeliveryFulfillment(BaseXmlModel, tag="homedelivery-fulfillment"):
|
|
305
|
+
delivery_date: date = attr(name="delivery-date")
|
|
306
|
+
delivery_start_time: str = attr(name="delivery-start-time")
|
|
307
|
+
list: str = attr(name="list")
|
|
308
|
+
item_id: str = attr(name="item-id")
|
|
309
|
+
address: Optional[OrderAddress] = element(tag="address", default=None)
|
|
310
|
+
|
|
311
|
+
|
|
312
|
+
class Fulfillment(BaseXmlModel, tag="fulfillment"):
|
|
313
|
+
address_fulfillment: Optional[AddressFulfillment] = element(
|
|
314
|
+
tag="address-fulfillment", default=None
|
|
315
|
+
)
|
|
316
|
+
store_fulfillment: Optional[StoreFulfillment] = element(
|
|
317
|
+
tag="store-fulfillment", default=None
|
|
318
|
+
)
|
|
319
|
+
homedelivery_fulfillment: Optional[HomeDeliveryFulfillment] = element(
|
|
320
|
+
tag="homedelivery-fulfillment", default=None
|
|
321
|
+
)
|
|
322
|
+
|
|
323
|
+
|
|
324
|
+
class CreditCard(BaseXmlModel, tag="credit-card"):
|
|
325
|
+
"""Credit card details used in API responses."""
|
|
326
|
+
|
|
327
|
+
cc_number: str = element(tag="cc-number")
|
|
328
|
+
exp_month: str = element(tag="exp-month")
|
|
329
|
+
exp_year: str = element(tag="exp-year")
|
|
330
|
+
cid: str = element(tag="cid")
|
|
331
|
+
address: Optional[OrderAddress] = element(tag="address", default=None)
|
|
332
|
+
|
|
333
|
+
|
|
334
|
+
class CCTender(BaseXmlModel, tag="cc-tender"):
|
|
335
|
+
"""Credit card tender used in API responses."""
|
|
336
|
+
|
|
337
|
+
cid: Optional[str] = attr(name="cid", default=None)
|
|
338
|
+
last_four: Optional[str] = attr(name="last-four", default=None)
|
|
339
|
+
name: Optional[str] = attr(name="name", default=None)
|
|
340
|
+
id: Optional[str] = attr(name="id", default=None)
|
|
341
|
+
exp_date: Optional[str] = attr(name="exp-date", default=None)
|
|
342
|
+
credit_card: Optional[CreditCard] = element(tag="credit-card", default=None)
|
|
343
|
+
|
|
344
|
+
|
|
345
|
+
class Tender(BaseXmlModel, tag="tender"):
|
|
346
|
+
"""Tender used in API responses."""
|
|
347
|
+
|
|
348
|
+
purchase_order_number: Optional[str] = element(
|
|
349
|
+
tag="purchase-order-number", default=None
|
|
350
|
+
)
|
|
351
|
+
cc_tender: Optional[CCTender] = element(tag="cc-tender", default=None)
|
|
352
|
+
|
|
353
|
+
|
|
354
|
+
# Registered Order Tender Models
|
|
355
|
+
|
|
356
|
+
|
|
357
|
+
class RegisteredCCTender(BaseXmlModel, tag="cc-tender"):
|
|
358
|
+
"""Credit card tender for registered orders.
|
|
359
|
+
|
|
360
|
+
For registered orders, the credit card is stored in the Billing Account,
|
|
361
|
+
so only the CID (CVV) is required, or a list reference when using a
|
|
362
|
+
purchase order number.
|
|
363
|
+
|
|
364
|
+
Examples:
|
|
365
|
+
Simple form with CID only:
|
|
366
|
+
<cc-tender cid="999"/>
|
|
367
|
+
|
|
368
|
+
With purchase order number and list reference:
|
|
369
|
+
<cc-tender list="123"/>
|
|
370
|
+
"""
|
|
371
|
+
|
|
372
|
+
cid: Optional[str] = attr(name="cid", default=None)
|
|
373
|
+
list: Optional[str] = attr(name="list", default=None)
|
|
374
|
+
|
|
375
|
+
|
|
376
|
+
class RegisteredTender(BaseXmlModel, tag="tender"):
|
|
377
|
+
"""Tender for registered orders.
|
|
378
|
+
|
|
379
|
+
Registered orders are charged to the company's credit card stored in the
|
|
380
|
+
Billing Account. Only the CID (CVV) is required, or a purchase order number
|
|
381
|
+
with list reference.
|
|
382
|
+
|
|
383
|
+
Examples:
|
|
384
|
+
With CID only:
|
|
385
|
+
<tender>
|
|
386
|
+
<cc-tender cid="999"/>
|
|
387
|
+
</tender>
|
|
388
|
+
|
|
389
|
+
With purchase order number:
|
|
390
|
+
<tender>
|
|
391
|
+
<purchase-order-number>MSC1277362</purchase-order-number>
|
|
392
|
+
<cc-tender list="123"/>
|
|
393
|
+
</tender>
|
|
394
|
+
"""
|
|
395
|
+
|
|
396
|
+
purchase_order_number: Optional[str] = element(
|
|
397
|
+
tag="purchase-order-number", default=None
|
|
398
|
+
)
|
|
399
|
+
cc_tender: RegisteredCCTender = element(tag="cc-tender")
|
|
400
|
+
|
|
401
|
+
|
|
402
|
+
# Guest Order Tender Models
|
|
403
|
+
|
|
404
|
+
|
|
405
|
+
class BillingAddress(BaseXmlModel, tag="address"):
|
|
406
|
+
"""Billing address for guest order credit card.
|
|
407
|
+
|
|
408
|
+
The billing address is required for guest orders and must have
|
|
409
|
+
type="billing".
|
|
410
|
+
"""
|
|
411
|
+
|
|
412
|
+
type: str = attr(name="type", default="billing")
|
|
413
|
+
verified: bool = attr(name="verified", default=False)
|
|
414
|
+
firstname: str = element(tag="firstname")
|
|
415
|
+
middlename: Optional[str] = element(tag="middlename", default=None)
|
|
416
|
+
lastname: str = element(tag="lastname")
|
|
417
|
+
address1: str = element(tag="address1")
|
|
418
|
+
address2: Optional[str] = element(tag="address2", default=None)
|
|
419
|
+
city: str = element(tag="city")
|
|
420
|
+
state: str = element(tag="state")
|
|
421
|
+
postalcode: str = element(tag="postalcode")
|
|
422
|
+
country: str = element(tag="country", default="US")
|
|
423
|
+
phonenumber: str = element(tag="phonenumber")
|
|
424
|
+
email: str = element(tag="email")
|
|
425
|
+
otherphone: Optional[str] = element(tag="otherphone", default=None)
|
|
426
|
+
|
|
427
|
+
|
|
428
|
+
class GuestCreditCard(BaseXmlModel, tag="credit-card"):
|
|
429
|
+
"""Credit card details for guest orders.
|
|
430
|
+
|
|
431
|
+
Guest orders require an encrypted payment token in cc_number, obtained
|
|
432
|
+
by encrypting the credit card number with the public key from
|
|
433
|
+
/commerce/encryptionkey.
|
|
434
|
+
|
|
435
|
+
The exp_month, exp_year, and cid fields are optional when using an
|
|
436
|
+
encrypted payment token that includes this information.
|
|
437
|
+
"""
|
|
438
|
+
|
|
439
|
+
cc_number: str = element(tag="cc-number")
|
|
440
|
+
exp_month: Optional[str] = element(tag="exp-month", default=None)
|
|
441
|
+
exp_year: Optional[str] = element(tag="exp-year", default=None)
|
|
442
|
+
cid: Optional[str] = element(tag="cid", default=None)
|
|
443
|
+
address: BillingAddress = element(tag="address")
|
|
444
|
+
|
|
445
|
+
|
|
446
|
+
class GuestCCTender(BaseXmlModel, tag="cc-tender"):
|
|
447
|
+
"""Credit card tender for guest orders.
|
|
448
|
+
|
|
449
|
+
Contains the encrypted credit card details for charging the customer's
|
|
450
|
+
credit card.
|
|
451
|
+
"""
|
|
452
|
+
|
|
453
|
+
credit_card: GuestCreditCard = element(tag="credit-card")
|
|
454
|
+
|
|
455
|
+
|
|
456
|
+
class GuestTender(BaseXmlModel, tag="tender"):
|
|
457
|
+
"""Tender for guest orders.
|
|
458
|
+
|
|
459
|
+
Guest orders are charged to the customer's credit card, which must be
|
|
460
|
+
encrypted using the public key from /commerce/encryptionkey.
|
|
461
|
+
|
|
462
|
+
Examples:
|
|
463
|
+
Basic guest tender:
|
|
464
|
+
<tender>
|
|
465
|
+
<cc-tender>
|
|
466
|
+
<credit-card>
|
|
467
|
+
<cc-number>Encrypted Payment Token</cc-number>
|
|
468
|
+
<exp-month>12</exp-month>
|
|
469
|
+
<exp-year>2025</exp-year>
|
|
470
|
+
<cid>999</cid>
|
|
471
|
+
<address type="billing" verified="false">...</address>
|
|
472
|
+
</credit-card>
|
|
473
|
+
</cc-tender>
|
|
474
|
+
</tender>
|
|
475
|
+
|
|
476
|
+
With purchase order number:
|
|
477
|
+
<tender>
|
|
478
|
+
<purchase-order-number>MSC1277362</purchase-order-number>
|
|
479
|
+
<cc-tender>
|
|
480
|
+
<credit-card>...</credit-card>
|
|
481
|
+
</cc-tender>
|
|
482
|
+
</tender>
|
|
483
|
+
"""
|
|
484
|
+
|
|
485
|
+
purchase_order_number: Optional[str] = element(
|
|
486
|
+
tag="purchase-order-number", default=None
|
|
487
|
+
)
|
|
488
|
+
cc_tender: GuestCCTender = element(tag="cc-tender")
|
|
489
|
+
|
|
490
|
+
|
|
491
|
+
class CartTotal(BaseXmlModel, tag="total"):
|
|
492
|
+
currency: str = attr(name="currency")
|
|
493
|
+
product_cost: Decimal = element(tag="product-cost")
|
|
494
|
+
sales_tax: Decimal = element(tag="sales-tax")
|
|
495
|
+
order_cost: Decimal = element(tag="order-cost")
|
|
496
|
+
shipping_cost: Decimal = element(tag="shipping-cost")
|
|
497
|
+
|
|
498
|
+
|
|
499
|
+
class Cart(BaseXmlModel, tag="cart"):
|
|
500
|
+
items: List[OrderItem] = wrapped("items", element(tag="item", default_factory=list))
|
|
501
|
+
total: CartTotal = element(tag="total")
|
|
502
|
+
|
|
503
|
+
|
|
504
|
+
class OrderQueryRequest(BaseXmlModel, tag="order-query"):
|
|
505
|
+
order_id: str = element(tag="order-id")
|
|
506
|
+
last_name: str = element(tag="last-name")
|
|
507
|
+
phone_number: str = element(tag="phone-number")
|
|
508
|
+
|
|
509
|
+
|
|
510
|
+
class OrderSubmitRegisteredRequest(BaseXmlModel, tag="order"):
|
|
511
|
+
"""Request to submit a registered order.
|
|
512
|
+
|
|
513
|
+
Registered orders are charged to the company's credit card stored in the
|
|
514
|
+
Billing Account. Requires authentication via login.
|
|
515
|
+
"""
|
|
516
|
+
|
|
517
|
+
id: str = attr(name="id")
|
|
518
|
+
partner_id: Optional[str] = attr(name="partner-id", default=None)
|
|
519
|
+
reviewable: bool = attr(name="reviewable", default=False)
|
|
520
|
+
order_list: OrderList = element(tag="list")
|
|
521
|
+
fulfillment: Fulfillment = element(tag="fulfillment")
|
|
522
|
+
tender: RegisteredTender = element(tag="tender")
|
|
523
|
+
|
|
524
|
+
|
|
525
|
+
class OrderSubmitGuestRequest(BaseXmlModel, tag="order"):
|
|
526
|
+
"""Request to submit a guest order.
|
|
527
|
+
|
|
528
|
+
Guest orders are charged to the customer's credit card, which must be
|
|
529
|
+
encrypted using the public key from /commerce/encryptionkey.
|
|
530
|
+
"""
|
|
531
|
+
|
|
532
|
+
id: str = attr(name="id")
|
|
533
|
+
partner_id: Optional[str] = attr(name="partner-id", default=None)
|
|
534
|
+
reviewable: bool = attr(name="reviewable", default=False)
|
|
535
|
+
order_list: OrderList = element(tag="list")
|
|
536
|
+
fulfillment: Fulfillment = element(tag="fulfillment")
|
|
537
|
+
tender: GuestTender = element(tag="tender")
|
|
538
|
+
|
|
539
|
+
|
|
540
|
+
class OrderResponse(BaseXmlModel, tag="order"):
|
|
541
|
+
id: Optional[str] = attr(name="id", default=None)
|
|
542
|
+
reviewable: Optional[bool] = attr(name="reviewable", default=None)
|
|
543
|
+
partner_id: Optional[str] = attr(name="partner-id", default=None)
|
|
544
|
+
status: Optional[OrderStatus] = attr(name="status", default=None)
|
|
545
|
+
order_date: Optional[date] = attr(name="order-date", default=None)
|
|
546
|
+
total: Optional[Decimal] = attr(name="total", default=None)
|
|
547
|
+
given_id: Optional[str] = attr(name="given-id", default=None)
|
|
548
|
+
link: Optional[Link] = element(tag="link", default=None)
|
|
549
|
+
order_list: Optional[OrderList] = element(tag="list", default=None)
|
|
550
|
+
fulfillment: Optional[Fulfillment] = element(tag="fulfillment", default=None)
|
|
551
|
+
tender: Optional[Tender] = element(tag="tender", default=None)
|
|
552
|
+
cart: Optional[Cart] = element(tag="cart", default=None)
|
|
553
|
+
addresses: Optional[List[OrderAddress]] = wrapped(
|
|
554
|
+
"addresses", element(tag="address", default_factory=list)
|
|
555
|
+
)
|
|
556
|
+
|
|
557
|
+
|
|
558
|
+
class IdMapEntry(BaseXmlModel, tag="entry"):
|
|
559
|
+
key: str = element(tag="key")
|
|
560
|
+
value: str = element(tag="value")
|
|
561
|
+
|
|
562
|
+
|
|
563
|
+
class OrderSubmitResponse(BaseXmlModel, tag="order-response"):
|
|
564
|
+
version: str = attr(name="version")
|
|
565
|
+
status: str = attr(name="status")
|
|
566
|
+
link: Optional[Link] = element(tag="link", default=None)
|
|
567
|
+
id_map: Optional[List[IdMapEntry]] = wrapped(
|
|
568
|
+
"id-map", element(tag="entry", default_factory=list)
|
|
569
|
+
)
|
|
570
|
+
messages: Optional[str] = element(tag="messages", default=None)
|
|
571
|
+
|
|
572
|
+
|
|
573
|
+
class PublicKeyEncryptionResponse(BaseXmlModel, tag="publicKeyEncryption"):
|
|
574
|
+
terminal_id: str = element(tag="terminalId")
|
|
575
|
+
track_id: str = element(tag="trackId")
|
|
576
|
+
key_id: str = element(tag="keyId")
|
|
577
|
+
base64_encoded_public_key_bytes: str = element(tag="base64EncodedPublicKeyBytes")
|
|
578
|
+
|
|
579
|
+
|
|
580
|
+
class CommerceResponse(BaseXmlModel, tag="commerce"):
|
|
581
|
+
version: str = attr(name="version")
|
|
582
|
+
links: List[Link] = element(tag="link", default_factory=list)
|
|
583
|
+
|
|
584
|
+
|
|
585
|
+
# Error Models
|
|
586
|
+
|
|
587
|
+
|
|
588
|
+
class ApiErrorMessage(BaseXmlModel, tag="message"):
|
|
589
|
+
text: str
|
|
590
|
+
sku: Optional[str] = attr(name="sku", default=None)
|
|
591
|
+
|
|
592
|
+
|
|
593
|
+
class ApiError(BaseXmlModel, tag="error"):
|
|
594
|
+
code: Optional[str] = attr(name="code", default=None)
|
|
595
|
+
message: ApiErrorMessage = element(tag="message")
|
|
596
|
+
|
|
597
|
+
|
|
598
|
+
class ApiErrors(BaseXmlModel, tag="errors"):
|
|
599
|
+
errors: List[ApiError] = element(tag="error", default_factory=list)
|
|
600
|
+
|
|
601
|
+
|
|
602
|
+
class SimpleError(BaseXmlModel, tag="Error"):
|
|
603
|
+
message: str = element(tag="Message")
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
from .base import BaseOperations
|
|
2
|
+
from .catalog import (
|
|
3
|
+
AsyncCategoryOperations,
|
|
4
|
+
AsyncProductOperations,
|
|
5
|
+
AsyncRecommendationOperations,
|
|
6
|
+
AsyncStoreOperations,
|
|
7
|
+
CategoryOperations,
|
|
8
|
+
ProductOperations,
|
|
9
|
+
RecommendationOperations,
|
|
10
|
+
StoreOperations,
|
|
11
|
+
)
|
|
12
|
+
from .commerce import (
|
|
13
|
+
AsyncAuthOperations,
|
|
14
|
+
AsyncEncryptionOperations,
|
|
15
|
+
AsyncFulfillmentOperations,
|
|
16
|
+
AsyncOrderOperations,
|
|
17
|
+
AsyncPricingOperations,
|
|
18
|
+
AuthOperations,
|
|
19
|
+
CommerceOperations,
|
|
20
|
+
EncryptionOperations,
|
|
21
|
+
FulfillmentOperations,
|
|
22
|
+
OrderOperations,
|
|
23
|
+
PricingOperations,
|
|
24
|
+
)
|
|
25
|
+
from .pagination import AsyncPaginator, Paginator
|
|
26
|
+
|
|
27
|
+
__all__ = [
|
|
28
|
+
"AsyncPaginator",
|
|
29
|
+
"BaseOperations",
|
|
30
|
+
"Paginator",
|
|
31
|
+
"AsyncCategoryOperations",
|
|
32
|
+
"AsyncProductOperations",
|
|
33
|
+
"AsyncRecommendationOperations",
|
|
34
|
+
"AsyncStoreOperations",
|
|
35
|
+
"CategoryOperations",
|
|
36
|
+
"ProductOperations",
|
|
37
|
+
"RecommendationOperations",
|
|
38
|
+
"StoreOperations",
|
|
39
|
+
"CommerceOperations",
|
|
40
|
+
"AuthOperations",
|
|
41
|
+
"AsyncAuthOperations",
|
|
42
|
+
"FulfillmentOperations",
|
|
43
|
+
"AsyncFulfillmentOperations",
|
|
44
|
+
"PricingOperations",
|
|
45
|
+
"AsyncPricingOperations",
|
|
46
|
+
"OrderOperations",
|
|
47
|
+
"AsyncOrderOperations",
|
|
48
|
+
"EncryptionOperations",
|
|
49
|
+
"AsyncEncryptionOperations",
|
|
50
|
+
]
|