~serpent-consulting-services/openerp-usa/shipping_api_6-1

« back to all changes in this revision

Viewing changes to partner_address_validation/usps/addressinformation/base.py

  • Committer: npgllc
  • Date: 2012-08-02 17:13:27 UTC
  • Revision ID: npgllc-20120802171327-2xgyyjjb5d1kx26y
Removed all the 6.0 compatible modules

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
'''
2
 
See http://www.usps.com/webtools/htm/Address-Information.htm for complete documentation of the API
3
 
'''
4
 
 
5
 
import urllib, urllib2
6
 
try:
7
 
    from xml.etree import ElementTree as ET
8
 
except ImportError:
9
 
    from elementtree import ElementTree as ET
10
 
 
11
 
def utf8urlencode(data):
12
 
    ret = dict()
13
 
    for key, value in data.iteritems():
14
 
        ret[key] = value.encode('utf8')
15
 
    return urllib.urlencode(ret)
16
 
 
17
 
def dicttoxml(dictionary, parent, tagname, attributes=None):
18
 
    element = ET.SubElement(parent, tagname)
19
 
    if attributes: #USPS likes things in a certain order!
20
 
        for key in attributes:
21
 
            ET.SubElement(element, key).text = dictionary.get(key, '')
22
 
    else:
23
 
        for key, value in dictionary.iteritems():
24
 
            ET.SubElement(element, key).text = value
25
 
    return element
26
 
 
27
 
def xmltodict(element):
28
 
    ret = dict()
29
 
    for item in element.getchildren():
30
 
        ret[item.tag] = item.text
31
 
    return ret
32
 
 
33
 
class USPSXMLError(Exception):
34
 
    def __init__(self, element):
35
 
        self.info = xmltodict(element)
36
 
        super(USPSXMLError, self).__init__(self.info['Description'])
37
 
 
38
 
class USPSAddressService(object):
39
 
    SERVICE_NAME = None
40
 
    API = None
41
 
    CHILD_XML_NAME = None
42
 
    PARAMETERS = None
43
 
    
44
 
    def __init__(self, url):
45
 
        self.url = url
46
 
 
47
 
    def submit_xml(self, xml):
48
 
        data = {'XML':ET.tostring(xml),
49
 
                'API':self.API}
50
 
        response = urllib2.urlopen(self.url, utf8urlencode(data))
51
 
        root = ET.parse(response).getroot()
52
 
        if root.tag == 'Error':
53
 
            raise USPSXMLError(root)
54
 
        error = root.find('.//Error')
55
 
        if error:
56
 
            raise USPSXMLError(error)
57
 
        return root
58
 
    
59
 
    def parse_xml(self, xml):
60
 
        items = list()
61
 
        for item in xml.getchildren():#xml.findall(self.SERVICE_NAME+'Response'):
62
 
            items.append(xmltodict(item))
63
 
        return items
64
 
    
65
 
    def make_xml(self, userid, addresses):
66
 
        root = ET.Element(self.SERVICE_NAME+'Request')
67
 
        root.attrib['USERID'] = userid
68
 
        index = 0
69
 
        for address_dict in addresses:
70
 
            address_xml = dicttoxml(address_dict, root, self.CHILD_XML_NAME, self.PARAMETERS)
71
 
            address_xml.attrib['ID'] = str(index)
72
 
            index += 1
73
 
        return root
74
 
    
75
 
    def execute(self, userid, addresses):
76
 
        xml = self.make_xml(userid, addresses)
77
 
        return self.parse_xml(self.submit_xml(xml))
78
 
 
79
 
class AddressValidate(USPSAddressService):
80
 
    SERVICE_NAME = 'AddressValidate'
81
 
    CHILD_XML_NAME = 'Address'
82
 
    API = 'Verify'
83
 
    PARAMETERS = ['FirmName',
84
 
                  'Address1',
85
 
                  'Address2',
86
 
                  'City',
87
 
                  'State',
88
 
                  'Zip5',
89
 
                  'Zip4',]
90
 
    
91
 
class ZipCodeLookup(USPSAddressService):
92
 
    SERVICE_NAME = 'ZipCodeLookup'
93
 
    CHILD_XML_NAME = 'Address'
94
 
    API = 'ZipCodeLookup'
95
 
    PARAMETERS = ['FirmName',
96
 
                  'Address1',
97
 
                  'Address2',
98
 
                  'City',
99
 
                  'State',]
100
 
 
101
 
class CityStateLookup(USPSAddressService):
102
 
    SERVICE_NAME = 'CityStateLookup'
103
 
    CHILD_XML_NAME = 'ZipCode'
104
 
    API = 'CityStateLookup'
105
 
    PARAMETERS = ['Zip5',]
106