Source code for amazonorders.entity.shipment
__copyright__ = "Copyright (c) 2024-2025 Alex Laird"
__license__ = "MIT"
import logging
from typing import List, Optional, TypeVar
from bs4 import Tag
from amazonorders import util
from amazonorders.conf import AmazonOrdersConfig
from amazonorders.entity.item import Item
from amazonorders.entity.parsable import Parsable
logger = logging.getLogger(__name__)
ShipmentEntity = TypeVar("ShipmentEntity", bound="Shipment")
[docs]
class Shipment(Parsable):
"""
An Amazon Shipment, which should contain one or more :class:`~amazonorders.entity.item.Item`'s.
"""
def __init__(self,
parsed: Tag,
config: AmazonOrdersConfig) -> None:
super().__init__(parsed, config)
#: The Shipment Items.
self.items: List[Item] = self._parse_items()
#: The Shipment delivery status.
self.delivery_status: Optional[str] = self.safe_simple_parse(
selector=self.config.selectors.FIELD_SHIPMENT_DELIVERY_STATUS_SELECTOR)
#: The Shipment tracking link.
self.tracking_link: Optional[str] = self.safe_simple_parse(
selector=self.config.selectors.FIELD_SHIPMENT_TRACKING_LINK_SELECTOR,
attr_name="href")
def __repr__(self) -> str:
return f"<Shipment: \"{self.items}\">"
def __str__(self) -> str: # pragma: no cover
return f"Shipment: {self.items}"
def __lt__(self,
other: ShipmentEntity) -> bool:
if self.delivery_status:
return self.delivery_status < str(other.delivery_status if other.delivery_status else "")
else:
return str(self.items) < str(other.items)
def _parse_items(self) -> List[Item]:
if not self.parsed:
return []
items: List[Item] = [self.config.item_cls(x, self.config)
for x in util.select(self.parsed,
self.config.selectors.ITEM_ENTITY_SELECTOR)]
items.sort()
return items