Coverage for amazonorders/orders.py: 97.96%

49 statements  

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

1import datetime 

2import logging 

3 

4from amazonorders.entity.order import Order 

5from amazonorders.exception import AmazonOrdersError 

6from amazonorders.session import BASE_URL 

7 

8__author__ = "Alex Laird" 

9__copyright__ = "Copyright 2024, Alex Laird" 

10__version__ = "0.0.5" 

11 

12logger = logging.getLogger(__name__) 

13 

14 

15class AmazonOrders: 

16 def __init__(self, 

17 amazon_session, 

18 debug=False, 

19 print_output=False) -> None: 

20 self.amazon_session = amazon_session 

21 

22 self.debug = debug 

23 if self.debug: 

24 logger.setLevel(logging.DEBUG) 

25 self.print_output = print_output 

26 

27 def get_order_history(self, 

28 year=datetime.date.today().year, 

29 start_index=None, 

30 full_details=False): 

31 if not self.amazon_session.is_authenticated: 

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

33 

34 orders = [] 

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

36 year, 

37 "&startIndex={}".format( 

38 start_index) if start_index else "") 

39 while next_page: 

40 self.amazon_session.get(next_page) 

41 response_parsed = self.amazon_session.last_response_parsed 

42 

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

44 order = Order(order_tag) 

45 

46 if full_details: 

47 self.amazon_session.get(order.order_details_link) 

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

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

50 

51 orders.append(order) 

52 

53 next_page = None 

54 if start_index is None: 

55 try: 

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

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

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

59 except AttributeError: 

60 logger.debug("No next page") 

61 else: 

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

63 

64 if self.print_output: 

65 for order in orders: 

66 print(order) 

67 

68 return orders 

69 

70 def get_order(self, order_id): 

71 if not self.amazon_session.is_authenticated: 

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

73 

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

75 

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

77 order = Order(order_details_tag, full_details=True) 

78 

79 if self.print_output: 

80 print(order) 

81 

82 return order