def parse_tracking_response(response: dict, settings: Settings) -> Tuple[List[TrackingDetails], List[Message]]: tracking_results = response.get('tracking_results', []) errors = sum([ _extract_error(DP.to_object(TrackingResult, result), settings) for result in tracking_results if "errors" in result ], parse_error_response(response, settings)) tracking_details = [ _extract_detail(DP.to_object(TrackingResult, d), settings) for d in response.get('tracking_results', []) if "trackable_items" in d ] return tracking_details, errors
def _extract_error(detail: dict, settings: Settings) -> Message: result = DP.to_object(Result, detail) return Message( carrier_name=settings.carrier_name, carrier_id=settings.carrier_id, code=result.tracking_status, message=f"No tracking details found for {result.tracking_number}")
def parse_tracking_response(response: List[dict], settings: Settings) -> Tuple[List[TrackingDetails], List[Message]]: errors = [e for e in response if 'mailPieces' not in e] details = [ _extract_detail(DP.to_object(MailPieces, d['mailPieces']), settings) for d in response if 'mailPieces' in d ] return details, parse_error_response(errors, settings)
def parse_tracking_response( response, settings: Settings) -> Tuple[List[TrackingDetails], List[Message]]: tracking_details = [ _extract_detail(DP.to_object(RouteResp, d), settings) for d in response.get('msgData', {}).get('routeResps', []) ] return tracking_details, parse_error_response(response, settings)
def parse_tracking_response( response: dict, settings: Settings) -> Tuple[List[TrackingDetails], List[Message]]: errors = [e for e in response if 'activities' not in e] details = [ _extract_detail(DP.to_object(Tracking, d), settings) for d in response if 'activities' in d ] return details, parse_error_response(errors, settings)
def parse_pickup_response( response: dict, settings: Settings) -> Tuple[PickupDetails, List[Message]]: errors = parse_error_response(response, settings) pickup = next((DP.to_object(Pickup, pickup) for pickup in response.get('pickups', [])), None) details = (_extract_details(pickup, settings) if pickup is not None else None) return details, errors
def parse_tracking_response( response: List[Tuple[str, dict]], settings: Settings) -> Tuple[List[TrackingDetails], List[Message]]: errors = [e for ref, e in response if 'error' in e] tracking_details = [ _extract_detail((ref, DP.to_object(Tracking, d)), settings) for ref, d in response if 'tracking_events' in d ] return tracking_details, parse_error_response(errors, settings)
def _extract_details(response: dict, settings: Settings) -> ShipmentDetails: label: str = response['label'] shipment = DP.to_object(ShipmentResponse, response['shipment']) return ShipmentDetails( carrier_name=settings.carrier_name, carrier_id=settings.carrier_id, label=label, tracking_number=shipment.trackingNumber, shipment_identifier=shipment.ID, )
def _extract_details(response: Tuple[str, dict], settings: Settings) -> ShipmentDetails: label, details = response shipment = DP.to_object(PackageLabel, details) return ShipmentDetails( carrier_name=settings.carrier_name, carrier_id=settings.carrier_id, label=label, tracking_number=shipment.trackingNumber, shipment_identifier=shipment.packageId, )
def parse_rate_response( response: dict, settings: Settings) -> Tuple[List[RateDetails], List[Message]]: errors = parse_error_response(response, settings) rate_response = (DP.to_object(RateResponse, response) if 'rates' in response else RateResponse()) details = [ _extract_details(rate, rate_response, settings) for rate in (rate_response.rates or []) ] return details, errors
def _extract_error(error: dict, settings: Settings) -> Message: carrier_error = DP.to_object(ResponseStatus, error) return Message( # context info carrier_name=settings.carrier_name, carrier_id=settings.carrier_id, # carrier error info code=carrier_error.responseStatusCode, message=carrier_error.responseStatusMessage )
def _extract_detail(detail: dict, settings: Settings) -> TrackingDetails: order_info = DP.to_object(OrderInfo, detail) return TrackingDetails( # context info carrier_name=settings.carrier_name, carrier_id=settings.carrier_id, tracking_number=order_info.TrackingNumber, events=[ TrackingEvent(date=time.strftime('%Y-%m-%d'), description=order_info.msg) ], )
def _extract_detail(detail: dict, settings: Settings) -> TrackingDetails: result = DP.to_object(Result, detail) return TrackingDetails(carrier_name=settings.carrier_name, carrier_id=settings.carrier_id, tracking_number=result.tracking_number, events=[ TrackingEvent( date=DF.fdate(event.time_stamp, '2019-08-15T18:52:19'), description=event.message, location=event.location, code=event.tracking_status, time=DF.ftime(event.time_stamp, '2019-08-15T18:52:19'), ) for event in result.checkpoints ], delivered=(result.tracking_status == 'LM40'))
def _extract_detail(detail: dict, settings: Settings) -> TrackingDetails: tracking = DP.to_object(Tracking, detail) delivered = (tracking.trackingMilestoneEvents[0].eventCode == 'Delivered' if len(tracking.trackingMilestoneEvents) > 0 else False) return TrackingDetails(carrier_name=settings.carrier_name, carrier_id=settings.carrier_id, tracking_number=tracking.trackingNumberVendor, events=[ TrackingEvent( date=DF.fdate(event.eventOn, _date_format(event.eventOn)), time=DF.ftime(event.eventOn, _date_format(event.eventOn)), description=event.eventDescription, location=event.eventLocation, code=event.eventCode, ) for event in tracking.trackingMilestoneEvents ], delivered=delivered)