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
Beispiel #2
0
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}")
Beispiel #3
0
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)
Beispiel #6
0
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
Beispiel #7
0
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)
Beispiel #8
0
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,
    )
Beispiel #9
0
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,
    )
Beispiel #10
0
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
Beispiel #11
0
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
    )
Beispiel #12
0
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)
        ],
    )
Beispiel #13
0
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'))
Beispiel #14
0
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)