Skip to content

Instantly share code, notes, and snippets.

@poundifdef
Created February 20, 2013 20:22
Show Gist options
  • Save poundifdef/4999225 to your computer and use it in GitHub Desktop.
Save poundifdef/4999225 to your computer and use it in GitHub Desktop.
ups
import requests
from dict2xml import dict2xml
import xmltodict
from datetime import datetime
class UPSConnection(object):
test_urls = {
'track': 'https://wwwcie.ups.com/ups.app/xml/Track',
}
production_urls = {
'track': 'https://onlinetools.ups.com/ups.app/xml/Track',
}
def __init__(self, **kwargs):
self.kwargs = kwargs ##### HOW CAN I AVOID ALL OF THIS #####
self.license_number = kwargs['license_number']
self.user_id = kwargs['user_id']
self.password = kwargs['password']
self.shipper_number = kwargs.get('shipper_number')
self.debug = kwargs.get('debug', False)
def _generate_xml(self, url_action, ups_request):
access_request = {
'AccessRequest': {
'AccessLicenseNumber': self.license_number,
'UserId': self.user_id,
'Password': self.password,
}
}
xml = '''
<?xml version="1.0"?>
{access_request_xml}
<?xml version="1.0"?>
{api_xml}
'''.format(
request_type=url_action,
access_request_xml=dict2xml(access_request),
api_xml=dict2xml(ups_request),
)
return xml
def _transmit_request(self, url_action, ups_request):
url = self.production_urls[url_action]
if self.debug:
url = self.test_urls[url_action]
xml = self._generate_xml(url_action, ups_request)
resp = requests.post(url, data=xml)
rc = type('', (), {})()
rc.outgoing_xml = xml
rc.incoming_xml = resp.text
rc.incoming_dict = xmltodict.parse(resp.text)
return rc
def tracking_info(self, tracking_number):
return TrackingInfo(tracking_number, **self.kwargs)
class TrackingInfo(UPSConnection):
def __init__(self, tracking_number, **kwargs):
super(TrackingInfo, self).__init__(**kwargs)
self.tracking_number = tracking_number
tracking_request = {
'TrackRequest': {
'Request': {
'TransactionReference': {
'CustomerContext': 'Get tracking status',
'XpciVersion': '1.0',
},
'RequestAction': 'Track',
'RequestOption': 'activity',
},
'TrackingNumber': tracking_number,
},
}
self.result = self._transmit_request('track', tracking_request)
@property
def shipment_activities(self):
shipment_activities = (self.result.incoming_dict['TrackResponse']
['Shipment']['Package']['Activity'])
if type(shipment_activities) != list:
shipment_activities = [shipment_activities]
return shipment_activities
@property
def delivered(self):
delivered = [x for x in self.shipment_activities
if x['Status']['StatusType']['Code'] == 'D']
if delivered:
return datetime.strptime(delivered[0]['Date'], '%Y%m%d')
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment