예제 #1
0
    def get_tracking(self, TrackRequests_: TrackRequest) -> etree.ElementBase:
        """
        get_tracking make parrallel request for each TrackRequest
        """
        results = exec_parrallel(self._get_tracking, TrackRequests_)

        return to_xml(bundle_xml(xml_strings=results))
예제 #2
0
    def get_trackings(self, tracking_pins: List[str]) -> etree.ElementBase:
        """
        get_trackings make parrallel request for each pin
        """
        results = exec_parrallel(self._get_tracking, tracking_pins)

        return to_xml(bundle_xml(xml_strings=results))
예제 #3
0
    def create_shipment(
        self, shipment: Union[NonContractShipmentType, ShipmentType]
    ) -> etree.ElementBase:
        is_non_contract = isinstance(shipment, NonContractShipmentType)

        if is_non_contract:
            req_type = "application/vnd.cpc.ncshipment-v4+xml"
            namespace = 'xmlns="http://www.canadapost.ca/ws/ncshipment-v4"'
            name = "non-contract-shipment"
            url_ = (
                f"{self.client.server_url}/rs/{self.client.customer_number}/ncshipment"
            )
        else:
            req_type = "application/vnd.cpc.shipment-v8+xml"
            namespace = 'xmlns="http://www.canadapost.ca/ws/shipment-v8"'
            name = "shipment"
            url_ = f"{self.client.server_url}/rs/{self.client.customer_number}/{shipment.customer_request_id}/shipment"

        xmlStr = export(shipment, name_=name, namespacedef_=namespace)

        result = http(
            url=url_,
            data=bytearray(xmlStr, "utf-8"),
            headers={
                "Content-Type": req_type,
                "Accept": req_type,
                "Authorization": "Basic %s" % self.authorization,
                "Accept-language": "en-CA",
            },
            method="POST",
        )

        response = to_xml(result)
        links = response.xpath(".//*[local-name() = $name]", name="link")

        if len(links) > 0:
            results = exec_parrallel(
                self._get_info,
                [
                    link for link in links
                    if link.get("rel") in ["price", "receipt"]
                ],
            )
            return to_xml(bundle_xml(xml_strings=[result] + results))
        return response
    def get_tracking(self, tracking_ids: List[str]) -> dict:

        def track(tracking_id):
            return {
                "ref": tracking_id,
                "response": to_dict(
                    http(
                        url=f"{self.client.server_url}/tracking/{tracking_id}",
                        headers={
                            "Content-Type": "application/json",
                            "Authorization": f"Basic {self.authorization}",
                        },
                        method="GET",
                    )
                )
            }
        responses = exec_parrallel(track, tracking_ids)
        return responses