def parse_non_contract_shipment_response( response: Element, settings: Settings) -> Tuple[ShipmentDetails, List[Message]]: shipment = (_extract_shipment(response, settings) if len( response.xpath(".//*[local-name() = $name]", name="shipment-id")) > 0 else None) return shipment, parse_error_response(response, settings)
def parse_pickup_response( response: Element, settings: Settings) -> Tuple[PickupDetails, List[Message]]: pickup = (_extract_pickup_details(response, settings) if len( response.xpath(".//*[local-name() = $name]", name="pickup-request-header")) > 0 else None) return pickup, parse_error_response(response, settings)
def parse_rate_response( response: Element, settings: Settings ) -> Tuple[List[RateDetails], List[Message]]: price_quotes = XP.find("price-quote", response) quotes: List[RateDetails] = [ _extract_quote(price_quote_node, settings) for price_quote_node in price_quotes ] return quotes, parse_error_response(response, settings)
def parse_tracking_summary( response: Element, settings: Settings ) -> Tuple[List[TrackingDetails], List[Message]]: pin_summaries = response.xpath(".//*[local-name() = $name]", name="pin-summary") tracking: List[TrackingDetails] = [ _extract_tracking(pin, settings) for pin in pin_summaries ] return tracking, parse_error_response(response, settings)
def parse_price_quotes( response: Element, settings: Settings ) -> Tuple[List[RateDetails], List[Message]]: price_quotes = response.xpath(".//*[local-name() = $name]", name="price-quote") quotes: List[RateDetails] = [ _extract_quote(price_quote_node, settings) for price_quote_node in price_quotes ] return quotes, parse_error_response(response, settings)
def parse_shipment_response( response: Element, settings: Settings ) -> Tuple[ShipmentDetails, List[Message]]: shipment = ( _extract_shipment(response, settings) if len(XP.find("shipment-id", response)) > 0 else None ) return shipment, parse_error_response(response, settings)
def parse_tracking_response( response: Element, settings: Settings ) -> Tuple[List[TrackingDetails], List[Message]]: details = XP.find("tracking-detail", response) tracking_details: List[TrackingDetails] = [ _extract_tracking(node, settings) for node in details if len(XP.find("occurrence", node)) > 0 ] return tracking_details, parse_error_response(response, settings)
def _get_pickup(update_response: str, payload: PickupUpdateRequest, settings: Settings) -> Job: errors = parse_error_response(XP.to_xml(XP.bundle_xml([update_response])), settings) data = None if any( errors ) else f"/enab/{settings.customer_number}/pickuprequest/{payload.confirmation_number}/details" return Job(id="get_pickup", data=Serializable(data), fallback="" if data is None else "")
def parse_pickup_cancel_response( response: Element, settings: Settings) -> Tuple[ConfirmationDetails, List[Message]]: errors = parse_error_response(response, settings) cancellation = (ConfirmationDetails( carrier_id=settings.carrier_id, carrier_name=settings.carrier_name, success=True, operation="Cancel Pickup", ) if len(errors) == 0 else None) return cancellation, errors
def parse_shipment_cancel_response( response: Element, settings: Settings) -> Tuple[ConfirmationDetails, List[Message]]: errors = parse_error_response(response, settings) success = len(errors) == 0 confirmation: ConfirmationDetails = ConfirmationDetails( carrier_id=settings.carrier_id, carrier_name=settings.carrier_name, success=success, operation="Cancel Shipment", ) if success else None return confirmation, errors
def _extract_shipment(response: Element, settings: Settings) -> ShipmentDetails: info_node = next( iter(response.xpath(".//*[local-name() = $name]", name="shipment-info")) ) label = next(iter(response.xpath(".//*[local-name() = $name]", name="label"))) errors = parse_error_response(label, settings) info: ShipmentInfoType = ShipmentInfoType() info.build(info_node) return ShipmentDetails( carrier_name=settings.carrier_name, carrier_id=settings.carrier_id, tracking_number=info.tracking_pin, label=label.text if len(errors) == 0 else None, )