Beispiel #1
0
def _modify_pickup(
    validation_response: str, payload: PickupUpdateRequest, settings: Settings
):
    errors = parse_error_response(XP.to_xml(validation_response), settings)
    data = _modify_pickup_request(payload, settings) if len(errors) == 0 else None

    return Job(id="modify", data=data, fallback="")
Beispiel #2
0
    def _create_label_request(shipment_response: str) -> Job:
        activity = XP.build(document, XP.to_xml(shipment_response))
        fallback = shipment_response if activity is None else None
        data = (create_label_request(activity, payload, settings)
                if activity is None else None)

        return Job(id='create', data=data, fallback=fallback)
Beispiel #3
0
def _validate_shipment(payload: ShipmentRequest, settings: Settings) -> Job:
    return Job(
        id="validate",
        data=_shipment_request(payload=payload,
                               settings=settings,
                               validate=True),
    )
Beispiel #4
0
def shipment_cancel_request(payload: ShipmentCancelRequest,
                            _) -> Serializable[Pipeline]:
    identifier = Serializable(payload.shipment_identifier)

    def _refund_if_submitted(shipment_details: str):
        shipment = XP.build(ShipmentInfoType, XP.to_xml(shipment_details))
        transmitted = shipment.shipment_status == 'transmitted'
        data = dict(
            id=payload.shipment_identifier,
            payload=Serializable(
                ShipmentRefundRequestType(
                    email=payload.options.get('email')), lambda request: XP.
                export(request,
                       name_='shipment-refund-request',
                       namespacedef_=
                       'xmlns="http://www.canadapost.ca/ws/shipment-v8"'))
        ) if transmitted else None

        return Job(id="refund", data=data, fallback=shipment_details)

    def _cancel_other_wise(previous_job_response: str):
        response: Element = XP.to_xml(previous_job_response)
        refunded = (response.tag == 'shipment-refund-request-info')
        data = identifier if not refunded else None

        return Job(id="cancel", data=data)

    request: Pipeline = Pipeline(
        info=lambda *_: Job(id="info", data=identifier),
        refund=_refund_if_submitted,
        cancel=_cancel_other_wise)

    return Serializable(request)
Beispiel #5
0
def _create_pickup(availability_response: str, payload: PickupRequest,
                   settings: Settings):
    availability = XP.build(PickupAvailabilityReply,
                            XP.to_xml(availability_response))
    data = _pickup_request(payload, settings) if availability else None

    return Job(id="create_pickup", data=data, fallback="")
Beispiel #6
0
def _create_pickup(cancel_response: str, payload: PickupUpdateRequest,
                   settings: Settings) -> Job:
    errors = parse_error_response(XP.to_xml(cancel_response), settings)
    canceled = len(errors) == 0
    data: Optional[PickupRequest] = (pickup_request(payload, settings)
                                     if canceled else None)
    fallback: Optional[str] = None if canceled else ''

    return Job(id='schedule', data=data, fallback=fallback)
Beispiel #7
0
def _create_shipment(validate_response: str, payload: ShipmentRequest,
                     settings: Settings) -> Job:
    errors = parse_error_response(XP.to_xml(validate_response), settings)
    valid = len(errors) == 0
    return Job(
        id="create",
        data=_shipment_request(payload, settings) if valid else None,
        fallback=(validate_response if not valid else None),
    )
Beispiel #8
0
def _cancel_pickup(payload: PickupUpdateRequest, settings: Settings) -> Job:
    data = PickupCancelRequest(
        confirmation_number=payload.confirmation_number,
        address=payload.address,
        pickup_date=payload.pickup_date,
        reason='change pickup',
    )

    return Job(id='cancel', data=pickup_cancel_request(data, settings))
Beispiel #9
0
def _create_pickup(availability_response: str, payload: PickupRequest,
                   settings: Settings):
    availability = XP.build(pickup_availability,
                            XP.to_xml(availability_response))
    data = _create_pickup_request(
        payload, settings) if availability.on_demand_tour else None

    return Job(id="create_pickup",
               data=data,
               fallback="" if data is None else "")
Beispiel #10
0
def _get_shipment_label(create_response: str, payload: ShipmentRequest,
                        settings: Settings) -> Job:
    response = XP.to_xml(create_response)
    valid = len(parse_error_response(response, settings)) == 0
    shipment_pin = (getattr(XP.find("ShipmentPIN", response, PIN, first=True),
                            'Value', None) if valid else None)
    data = (get_shipping_documents_request(shipment_pin, payload, settings)
            if valid else None)

    return Job(id="document", data=data, fallback="")
Beispiel #11
0
def _create_pickup(deletion_response: str,
                   payload: PickupUpdateRequest) -> Job:
    errors = parse_error_response(deletion_response)
    create_job: Job = (_create_pickup_job(cast(PickupRequest, payload))
                       if not any(errors) else None)
    data = (create_job.data if create_job is not None else None)

    return Job(id="create_pickup",
               data=data,
               fallback=("{}" if data is None else None))
Beispiel #12
0
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 "")
Beispiel #13
0
def _update_pickup(payload: PickupUpdateRequest, settings: Settings) -> Job:
    data = Serializable(
        dict(
            confirmation_number=payload.confirmation_number,
            data=_create_pickup_request(cast(PickupRequest, payload),
                                        settings,
                                        update=True),
        ), _update_request_serializer)
    fallback = "" if data is None else ""

    return Job(id="update_pickup", data=data, fallback=fallback)
Beispiel #14
0
def _get_label(shipment_response: str, settings: Settings) -> Job:
    response = XP.to_xml(shipment_response)
    shipment = XP.to_object(
        Shipment, next(iter(response.xpath(".//*[local-name() = $name]", name="shipment")), None)
    )
    success = (shipment is not None and shipment.id is not None)
    data = (
        get_label_request(LabelRequest(shipment_id=shipment.id), settings)
        if success else
        None
    )

    return Job(id="get_label", data=data, fallback=("" if not success else None))
Beispiel #15
0
    def _refund_if_submitted(shipment_details: str):
        shipment = XP.build(ShipmentInfoType, XP.to_xml(shipment_details))
        transmitted = shipment.shipment_status == 'transmitted'
        data = dict(
            id=payload.shipment_identifier,
            payload=Serializable(
                ShipmentRefundRequestType(
                    email=payload.options.get('email')), lambda request: XP.
                export(request,
                       name_='shipment-refund-request',
                       namespacedef_=
                       'xmlns="http://www.canadapost.ca/ws/shipment-v8"'))
        ) if transmitted else None

        return Job(id="refund", data=data, fallback=shipment_details)
Beispiel #16
0
def _cancel_pickup_request(response: str, payload: PickupUpdateRequest,
                           settings: Settings):
    reply = next(
        iter(
            XP.to_xml(response).xpath(".//*[local-name() = $name]",
                                      name="PickupCreationResponse")),
        None,
    )
    new_pickup = XP.to_object(PickupCreationResponse, reply)
    data = (pickup_cancel_request(
        PickupCancelRequest(confirmation_number=payload.confirmation_number),
        settings,
    ) if new_pickup is not None and new_pickup.PRN is not None else None)

    return Job(id="cancel_pickup", data=data, fallback="")
Beispiel #17
0
def _cancel_pickup_request(response: str, payload: PickupUpdateRequest,
                           settings: Settings):
    reply = next(
        iter(
            XP.to_xml(response).xpath(".//*[local-name() = $name]",
                                      name="CreatePickupReply")),
        None,
    )
    new_pickup = XP.build(CreatePickupReply, reply)
    data = (pickup_cancel_request(
        PickupCancelRequest(confirmation_number=payload.confirmation_number),
        settings,
    ) if new_pickup is not None and new_pickup.HighestSeverity
            == NotificationSeverityType.SUCCESS.value else None)

    return Job(id="cancel_pickup", data=data, fallback="")
Beispiel #18
0
def _retrieve_pickup(creation_response: str, payload: PickupRequest,
                     settings: Settings) -> Job:
    errors = parse_error_response(DP.to_dict(creation_response), settings)
    data = (Serializable(
        dict(
            category=payload.options.get("category", "Parcel"),
            pickupDate=payload.pickup_date,
            streetNumber=SF.concat_str(payload.address.address_line1,
                                       payload.address.address_line2,
                                       join=True),
            postalCode=payload.address.postal_code,
            offset=10,
        ), urllib.parse.urlencode) if not any(errors) else None)

    return Job(id="retrieve_pickup",
               data=data,
               fallback=('{}' if data is None else None))
Beispiel #19
0
def _cancel_pickup_request(
    response: str, payload: PickupUpdateRequest, settings: Settings
):
    new_pickup = XP.find(
        "PickupCreationResponse",
        XP.to_xml(response),
        PickupCreationResponse,
        first=True,
    )
    data = (
        pickup_cancel_request(
            PickupCancelRequest(confirmation_number=payload.confirmation_number),
            settings,
        )
        if new_pickup is not None and new_pickup.PRN is not None
        else None
    )

    return Job(id="cancel_pickup", data=data, fallback="")
Beispiel #20
0
def _get_shipment_label(create_response: str, payload: ShipmentRequest,
                        settings: Settings) -> Job:
    errors = parse_error_response(XP.to_xml(create_response), settings)
    valid = len(errors) == 0
    shipment_pin = None

    if valid:
        node = next(
            iter(
                XP.to_xml(create_response).xpath(".//*[local-name() = $name]",
                                                 name="ShipmentPIN")),
            None,
        )
        pin = PIN()
        pin.build(node)
        shipment_pin = pin.Value

    return Job(
        id="document",
        data=(get_shipping_documents_request(shipment_pin, payload, settings)
              if valid else None),
        fallback="",
    )
Beispiel #21
0
def _create_pickup(payload: PickupRequest) -> Job:

    request = DicomPickupRequest(
        date=payload.pickup_date,
        ready=payload.ready_time,
        category=payload.options.get("category", "Parcel"),
        officeClose=payload.closing_time,
        sender=Sender(city=payload.address.city,
                      provinceCode=payload.address.state_code,
                      postalCode=payload.address.postal_code,
                      countryCode=payload.address.country_code,
                      customerName=payload.address.company_name,
                      streetNumber=SF.concat_str(payload.address.address_line1,
                                                 payload.address.address_line2,
                                                 join=True),
                      contact=Contact(
                          fullName=payload.address.person_name,
                          email=payload.address.email,
                          telephone=payload.address.phone_number,
                      )),
        location=payload.options.get("dicom_location", "OT"),
        otherLocation=payload.package_location)

    return Job(id="create_pickup", data=Serializable(request, DP.to_dict))
Beispiel #22
0
def _rate_pickup(payload: PickupRequest, settings: Settings):
    data = pickup_rate_request(payload, settings)

    return Job(id="availability", data=data)
Beispiel #23
0
def _delete_pickup(payload: PickupUpdateRequest, settings: Settings) -> Job:
    data = pickup_cancel_request(settings=settings,
                                 payload=cast(PickupCancelRequest, payload))

    return Job(id="delete_pickup", data=data)
Beispiel #24
0
def _create_shipment(payload: ShipmentRequest, settings: Settings) -> Job:
    return Job(
        id="create",
        data=_shipment_request(payload, settings),
    )
Beispiel #25
0
def _get_pickup_availability(payload: PickupRequest):
    return Job(id="availability", data=payload.address.postal_code)
Beispiel #26
0
def _get_pickup_availability(payload: PickupRequest):
    return Job(
        id="availability", data=(payload.address.postal_code or "").replace(" ", "")
    )
Beispiel #27
0
def _get_availability(payload: PickupRequest, settings: Settings):
    data = pickup_availability_request(payload, settings)

    return Job(id="availability", data=data)
Beispiel #28
0
def _process_shipment(payload: ShipmentRequest, settings: Settings) -> Job:
    packages = Packages(payload.parcels)
    options = Options(payload.options, Option)
    service_type = Service.map(payload.service).value_or_key

    premium: Optional[bool] = next((True for option, _ in options if option in [
        Option.canpar_ten_am.value,
        Option.canpar_noon.value,
        Option.canpar_saturday.value,
    ]), None)
    shipping_date = DF.fdatetime(
        options.shipment_date or time.strftime('%Y-%m-%d'),
        current_format='%Y-%m-%d', output_format='%Y-%m-%dT%H:%M:%S'
    )

    request = create_envelope(
        body_content=processShipment(
            request=ProcessShipmentRq(
                password=settings.password,
                shipment=Shipment(
                    cod_type=options.canpar_cash_on_delivery,
                    delivery_address=Address(
                        address_line_1=payload.recipient.address_line1,
                        address_line_2=payload.recipient.address_line2,
                        address_line_3=None,
                        attention=payload.recipient.person_name,
                        city=payload.recipient.city,
                        country=payload.recipient.country_code,
                        email=payload.recipient.email,
                        extension=None,
                        name=payload.recipient.company_name,
                        phone=payload.recipient.phone_number,
                        postal_code=payload.recipient.postal_code,
                        province=payload.recipient.state_code,
                        residential=payload.recipient.residential,
                    ),
                    description=None,
                    dg=options.canpar_dangerous_goods,
                    dimention_unit=DimensionUnit.IN.value,
                    handling=None,
                    handling_type=None,
                    instruction=None,
                    nsr=(options.canpar_no_signature_required or options.canpar_not_no_signature_required),
                    packages=[
                        Package(
                            alternative_reference=None,
                            cod=None,
                            cost_centre=None,
                            declared_value=None,
                            height=pkg.height.CM,
                            length=pkg.length.CM,
                            lg=None,
                            reference=None,
                            reported_weight=pkg.weight.LB,
                            store_num=None,
                            width=pkg.width.CM,
                            xc=('canpar_extra_care' in options) or None
                        ) for pkg in packages
                    ],
                    pickup_address=Address(
                        address_line_1=payload.shipper.address_line1,
                        address_line_2=payload.shipper.address_line2,
                        address_line_3=None,
                        attention=payload.shipper.person_name,
                        city=payload.shipper.city,
                        country=payload.shipper.country_code,
                        email=payload.shipper.email,
                        extension=None,
                        name=payload.shipper.company_name,
                        phone=payload.shipper.phone_number,
                        postal_code=payload.shipper.postal_code,
                        province=payload.shipper.state_code,
                        residential=payload.shipper.residential,
                    ),
                    premium=premium,
                    proforma=None,
                    reported_weight_unit=WeightUnit.LB.value,
                    send_email_to_delivery=payload.recipient.email,
                    send_email_to_pickup=payload.shipper.email,
                    service_type=service_type,
                    shipper_num=None,
                    shipping_date=shipping_date,
                    subtotal=None,
                    subtotal_with_handling=None,
                    total=None,
                    total_with_handling=None,
                    user_id=None,
                ),
                user_id=settings.username
            )
        )
    )

    data = Serializable(
        request, partial(
            settings.serialize,
            extra_namespace='xmlns:xsd1="http://dto.canshipws.canpar.com/xsd"',
            special_prefixes=dict(shipment_children='xsd1')
        )
    )
    return Job(id="process", data=data)
Beispiel #29
0
    def _cancel_other_wise(previous_job_response: str):
        response: Element = XP.to_xml(previous_job_response)
        refunded = (response.tag == 'shipment-refund-request-info')
        data = identifier if not refunded else None

        return Job(id="cancel", data=data)
Beispiel #30
0
def _create_pickup(rate_response: str, payload: PickupRequest, settings: Settings):
    rate_result = XP.to_object(RateResultType, XP.to_xml(rate_response))
    data = _create_pickup_request(payload, settings) if rate_result else None

    return Job(id="create_pickup", data=data, fallback="")