def build_request(self, tracking_number):
        # Build AccessRequest
        access_request = Element("AccessRequest")
        access_request.set("xml:lang", "en-US")

        license_number = SubElement(access_request, "AccessLicenseNumber")
        license_number.text = UPS_API_KEY

        user_id = SubElement(access_request, "UserId")
        user_id.text = UPS_USERID

        password = SubElement(access_request, "Password")
        password.text = UPS_PASSWORD

        # Build TrackRequest
        track_request = Element("TrackRequest")
        track_request.set("xml:lang", "en-US")

        request_element = SubElement(track_request, "Request")

        transaction_reference = SubElement(request_element, "TransactionReference")

        customer_context = SubElement(transaction_reference, "CustomerContext")
        customer_context.text = "Tracking package %s" % tracking_number
        xpci_version = SubElement(transaction_reference, "XpciVersion")
        xpci_version.text = "1.0"

        request_action = SubElement(request_element, "RequestAction")
        request_action.text = "Track"

        request_option = SubElement(request_element, "RequestOption")
        request_option.text = "1"

        tracking_number_element = SubElement(track_request, "TrackingNumber")
        tracking_number_element.text = tracking_number

        access_request_tree = PrintableElementTree(access_request)
        track_request_tree = PrintableElementTree(track_request)

        request_xml = '<?xml version="1.0"?>' + access_request_tree.print_tree() + '<?xml version="1.0"?>' + track_request_tree.print_tree()

        return request_xml
Exemple #2
0
    def create_shipment(self, tracking_number, subscriber):
        ups_connector = UPSConnector()
        tracking_response = ups_connector.get_tracking_information(tracking_number)
        #tracking_response = '<?xml version="1.0"?>\n<TrackResponse><Response><TransactionReference><CustomerContext>Tracking package 1Z8Y875V0310424142</CustomerContext><XpciVersion>1.0</XpciVersion></TransactionReference><ResponseStatusCode>1</ResponseStatusCode><ResponseStatusDescription>Success</ResponseStatusDescription></Response><Shipment><Shipper><ShipperNumber>8Y875V</ShipperNumber><Address><AddressLine1>1100 WESTLAKE PKWY SW</AddressLine1><AddressLine2>SUITE 120</AddressLine2><City>ATLANTA</City><StateProvinceCode>GA</StateProvinceCode><PostalCode>30336   2937</PostalCode><CountryCode>US</CountryCode></Address></Shipper><ShipTo><Address><City>ARLINGTON</City><StateProvinceCode>VA</StateProvinceCode><PostalCode>22202</PostalCode><CountryCode>US</CountryCode></Address></ShipTo><ShipmentWeight><UnitOfMeasurement><Code>LBS</Code></UnitOfMeasurement><Weight>7.00</Weight></ShipmentWeight><Service><Code>003</Code><Description>GROUND</Description></Service><ShipmentIdentificationNumber>1Z8Y875V0310424142</ShipmentIdentificationNumber><PickupDate>20100826</PickupDate><ScheduledDeliveryDate>20100830</ScheduledDeliveryDate><Package><TrackingNumber>1Z8Y875V0310424142</TrackingNumber><Activity><ActivityLocation><Address><City>ALEXANDRIA</City><StateProvinceCode>VA</StateProvinceCode><CountryCode>US</CountryCode></Address></ActivityLocation><Status><StatusType><Code>I</Code><Description>IN TRANSIT TO</Description></StatusType><StatusCode><Code>IT</Code></StatusCode></Status><Date>20100828</Date><Time>025200</Time></Activity><Activity><ActivityLocation><Address><City>RICHMOND</City><StateProvinceCode>VA</StateProvinceCode><CountryCode>US</CountryCode></Address></ActivityLocation><Status><StatusType><Code>I</Code><Description>DEPARTURE SCAN</Description></StatusType><StatusCode><Code>DP</Code></StatusCode></Status><Date>20100828</Date><Time>025100</Time></Activity><Activity><ActivityLocation><Address><City>RICHMOND</City><StateProvinceCode>VA</StateProvinceCode><CountryCode>US</CountryCode></Address></ActivityLocation><Status><StatusType><Code>I</Code><Description>LOCATION SCAN</Description></StatusType><StatusCode><Code>LC</Code></StatusCode></Status><Date>20100827</Date><Time>192700</Time></Activity><Activity><ActivityLocation><Address><City>RICHMOND</City><StateProvinceCode>VA</StateProvinceCode><CountryCode>US</CountryCode></Address></ActivityLocation><Status><StatusType><Code>I</Code><Description>ARRIVAL SCAN</Description></StatusType><StatusCode><Code>AR</Code></StatusCode></Status><Date>20100827</Date><Time>134200</Time></Activity><Activity><ActivityLocation><Address><City>DORAVILLE</City><StateProvinceCode>GA</StateProvinceCode><CountryCode>US</CountryCode></Address></ActivityLocation><Status><StatusType><Code>I</Code><Description>DEPARTURE SCAN</Description></StatusType><StatusCode><Code>DP</Code></StatusCode></Status><Date>20100827</Date><Time>032000</Time></Activity><Activity><ActivityLocation><Address><City>DORAVILLE</City><StateProvinceCode>GA</StateProvinceCode><CountryCode>US</CountryCode></Address></ActivityLocation><Status><StatusType><Code>I</Code><Description>ARRIVAL SCAN</Description></StatusType><StatusCode><Code>AR</Code></StatusCode></Status><Date>20100827</Date><Time>013000</Time></Activity><Activity><ActivityLocation><Address><City>ATLANTA</City><StateProvinceCode>GA</StateProvinceCode><CountryCode>US</CountryCode></Address></ActivityLocation><Status><StatusType><Code>I</Code><Description>DEPARTURE SCAN</Description></StatusType><StatusCode><Code>DP</Code></StatusCode></Status><Date>20100827</Date><Time>005100</Time></Activity><Activity><ActivityLocation><Address><City>ATLANTA</City><StateProvinceCode>GA</StateProvinceCode><CountryCode>US</CountryCode></Address></ActivityLocation><Status><StatusType><Code>I</Code><Description>ORIGIN SCAN</Description></StatusType><StatusCode><Code>OR</Code></StatusCode></Status><Date>20100826</Date><Time>192200</Time></Activity><Activity><ActivityLocation><Address><CountryCode>US</CountryCode></Address></ActivityLocation><Status><StatusType><Code>M</Code><Description>BILLING INFORMATION RECEIVED</Description></StatusType><StatusCode><Code>MP</Code></StatusCode></Status><Date>20100826</Date><Time>172438</Time></Activity><Message><Code>01</Code><Description>On Time</Description></Message><PackageWeight><UnitOfMeasurement><Code>LBS</Code></UnitOfMeasurement><Weight>7.00</Weight></PackageWeight><ReferenceNumber><Code>01</Code><Value>P594078</Value></ReferenceNumber><ReferenceNumber><Code>01</Code><Value>00000000000092287872</Value></ReferenceNumber><ReferenceNumber><Code>01</Code><Value>82621</Value></ReferenceNumber></Package></Shipment></TrackResponse>'

        tracking_parser = PrintableElementTree()
        tracking_parser.parse_xml(tracking_response)

        error_element = tracking_parser.find("//Error")

        if error_element != None:
            error_code = get_element_text(tracking_parser.find("//ErrorCode"), "N/A")
            error_description = get_element_text(tracking_parser.find("//ErrorDescription"), "N/A")

            raise Exception("Error creating shipment. Error Code: %s Description: %s" % (error_code, error_description))
        else:
            shipment_element = tracking_parser.find("//Shipment")
            if shipment_element == None:
                raise Exception("Could not locate shipment information.")

            shipment = Shipment()
            shipment.subscriber = subscriber
            shipment.tracking_number = shipment_element.find("ShipmentIdentificationNumber").text
            shipment.provider = SHIPMENT_SERVICE_PROVIDER_UPS

            shipment.save()

            shipper_element = shipment_element.find("Shipper")
            if shipper_element != None:
                shipper = Shipper()
                shipper.shipper_number = get_element_text(shipper_element.find("ShipperNumber"))
                if shipper_element.find("Address") != None:
                    address = Address()
                    address.address_line_1 = get_element_text(shipper_element.find("Address/AddressLine1"))
                    address.address_line_2 = get_element_text(shipper_element.find("Address/AddressLine2"))
                    address.city = get_element_text(shipper_element.find("Address/City"))
                    address.state_province = get_element_text(shipper_element.find("Address/StateProvinceCode"))
                    address.zipcode = re.sub("\s+", "-", get_element_text(shipper_element.find("Address/PostalCode")))
                    address.country = get_element_text(shipper_element.find("Address/CountryCode"))
                    address.save()
                    shipper.address = address

                shipper.save()
                shipment.shipper = shipper

            receiver_element = shipment_element.find("ShipTo")
            if receiver_element != None:
                receiver = Receiver()

                address = Address()
                address.address_line_1 = get_element_text(receiver_element.find("Address/AddressLine1"))
                address.address_line_2 = get_element_text(receiver_element.find("Address/AddressLine2"))
                address.city = get_element_text(receiver_element.find("Address/City"))
                address.state_province = get_element_text(receiver_element.find("Address/StateProvinceCode"))
                address.zipcode = re.sub("\s+", "-", get_element_text(receiver_element.find("Address/PostalCode")))
                address.country = get_element_text(receiver_element.find("Address/CountryCode"))
                address.save()

                receiver.address = address
                receiver.save()
                shipment.receiver = receiver

            shipment_weight_element = shipment_element.find("ShipmentWeight")
            if shipment_weight_element != None:
                shipment.weight = get_element_text(shipment_weight_element.find("Weight"))
                shipment.weight_unit = get_element_text(shipment_weight_element.find("UnitOfMeasurement/Code"))

            service_element = shipment_element.find("Service")
            if service_element != None:
                shipment.service_code = get_element_text(service_element.find("Code"))
                shipment.service_description = get_element_text(service_element.find("Description"))

            pickup_date_element = shipment_element.find("PickupDate")
            if pickup_date_element != None:
                shipment.pickup_date = datetime.datetime.strptime(pickup_date_element.text, "%Y%m%d")

            scheduled_delivery_date_element = shipment_element.find("ScheduledDeliveryDate")
            if scheduled_delivery_date_element != None:
                shipment.scheduled_delivery_date = datetime.datetime.strptime(scheduled_delivery_date_element.text, "%Y%m%d")

            shipment.save()

            package_elements = shipment_element.findall("Package")
            for package_element in package_elements:
                package = Package()
                package.shipment = shipment
                package.tracking_number = package_element.find("TrackingNumber").text
                package.save()

                activity_elements = package_element.findall("Activity")
                for activity_element in activity_elements:
                    activity = Activity()
                    activity.package = package

                    address_element = activity_element.find("ActivityLocation")

                    address = Address()
                    address.address_line_1 = get_element_text(address_element.find("Address/AddressLine1"))
                    address.address_line_2 = get_element_text(address_element.find("Address/AddressLine2"))
                    address.city = get_element_text(address_element.find("Address/City"))
                    address.state_province = get_element_text(address_element.find("Address/StateProvinceCode"))
                    address.zipcode = re.sub("\s+", "-", get_element_text(address_element.find("Address/PostalCode")))
                    address.country = get_element_text(address_element.find("Address/CountryCode"))
                    address.save()        

                    activity.address = address

                    date_element = activity_element.find("Date")
                    time_element = activity_element.find("Time")

                    time_string = date_element.text
                    time_parser = "%Y%m%d" 

                    if time_element != None:
                        time_string = "%s%s" % (time_string, time_element.text)
                        time_parser = "%s%s" % (time_parser, "%H%M%S")

                    activity.time = datetime.datetime.strptime(time_string, time_parser)

                    status_element = activity_element.find("Status")
                    if status_element != None:
                        activity.status_code = get_element_text(status_element.find("StatusCode/Code"))
                        activity.status_description = get_element_text(status_element.find("StatusType/Description"))

                    activity.save()

            return shipment