Coverage for amazonorders/orders.py: 98.00%

50 statements  

« prev     ^ index     » next       coverage.py v7.4.0, created at 2024-01-16 23:55 +0000

1import datetime 

2import logging 

3from typing import List, Optional 

4 

5from amazonorders.entity.order import Order 

6from amazonorders.exception import AmazonOrdersError 

7from amazonorders.session import BASE_URL, AmazonSession 

8 

9__author__ = "Alex Laird" 

10__copyright__ = "Copyright 2024, Alex Laird" 

11__version__ = "0.0.7" 

12 

13logger = logging.getLogger(__name__) 

14 

15 

16class AmazonOrders: 

17 def __init__(self, 

18 amazon_session: AmazonSession, 

19 debug: bool = False, 

20 print_output: bool = False) -> None: 

21 self.amazon_session: AmazonSession = amazon_session 

22 

23 self.debug: bool = debug 

24 if self.debug: 

25 logger.setLevel(logging.DEBUG) 

26 self.print_output: bool = print_output 

27 

28 def get_order_history(self, 

29 year: int = datetime.date.today().year, 

30 start_index: Optional[int] = None, 

31 full_details: bool = False) -> List[Order]: 

32 if not self.amazon_session.is_authenticated: 

33 raise AmazonOrdersError("Call AmazonSession.login() to authenticate first.") 

34 

35 orders = [] 

36 next_page = "{}/your-orders/orders?timeFilter=year-{}{}".format(BASE_URL, 

37 year, 

38 "&startIndex={}".format( 

39 start_index) if start_index else "") 

40 while next_page: 

41 self.amazon_session.get(next_page) 

42 response_parsed = self.amazon_session.last_response_parsed 

43 

44 for order_tag in response_parsed.find_all("div", {"class": "order-card"}): 

45 order = Order(order_tag) 

46 

47 if full_details: 

48 self.amazon_session.get(order.order_details_link) 

49 order_details_tag = self.amazon_session.last_response_parsed.find("div", id="orderDetails") 

50 order = Order(order_details_tag, full_details=True, clone=order) 

51 

52 orders.append(order) 

53 

54 next_page = None 

55 if start_index is None: 

56 try: 

57 next_page = "{}{}".format(BASE_URL, 

58 response_parsed.find("ul", {"class", "a-pagination"}).find( 

59 "li", {"class": "a-last"}).find("a").attrs["href"]) 

60 except AttributeError: 

61 logger.debug("No next page") 

62 else: 

63 logger.debug("start_index is given, not paging") 

64 

65 if self.print_output: 

66 for order in orders: 

67 print(order) 

68 

69 return orders 

70 

71 def get_order(self, 

72 order_id: str) -> Order: 

73 if not self.amazon_session.is_authenticated: 

74 raise AmazonOrdersError("Call AmazonSession.login() to authenticate first.") 

75 

76 self.amazon_session.get("{}/gp/your-account/order-details?orderID={}".format(BASE_URL, order_id)) 

77 

78 order_details_tag = self.amazon_session.last_response_parsed.find("div", id="orderDetails") 

79 order = Order(order_details_tag, full_details=True) 

80 

81 if self.print_output: 

82 print(order) 

83 

84 return order