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
« 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
5from amazonorders.entity.order import Order
6from amazonorders.exception import AmazonOrdersError
7from amazonorders.session import BASE_URL, AmazonSession
9__author__ = "Alex Laird"
10__copyright__ = "Copyright 2024, Alex Laird"
11__version__ = "0.0.7"
13logger = logging.getLogger(__name__)
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
23 self.debug: bool = debug
24 if self.debug:
25 logger.setLevel(logging.DEBUG)
26 self.print_output: bool = print_output
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.")
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
44 for order_tag in response_parsed.find_all("div", {"class": "order-card"}):
45 order = Order(order_tag)
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)
52 orders.append(order)
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")
65 if self.print_output:
66 for order in orders:
67 print(order)
69 return orders
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.")
76 self.amazon_session.get("{}/gp/your-account/order-details?orderID={}".format(BASE_URL, order_id))
78 order_details_tag = self.amazon_session.last_response_parsed.find("div", id="orderDetails")
79 order = Order(order_details_tag, full_details=True)
81 if self.print_output:
82 print(order)
84 return order