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.
@@ -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
+ ]
@@ -0,0 +1,10 @@
1
+ """Base classes for Best Buy API operations."""
2
+
3
+ from typing import Any
4
+
5
+
6
+ class BaseOperations:
7
+ """Base class for all API operations (sync and async)."""
8
+
9
+ def __init__(self, client: Any) -> None:
10
+ self.client = client