From 4207049a00a91403a3bb72cf57f7a5f354ffc0b3 Mon Sep 17 00:00:00 2001 From: Tristan Date: Sun, 18 Dec 2022 21:22:28 +0100 Subject: [PATCH 1/2] made all sections of address optional. this is better for the Zipcodelookup This call those not require all the zipcode to be added --- usps/address.py | 2 +- usps/usps.py | 10 ++++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/usps/address.py b/usps/address.py index 7c84508..6ed3667 100644 --- a/usps/address.py +++ b/usps/address.py @@ -3,7 +3,7 @@ class Address(object): - def __init__(self, name, address_1, city, state, zipcode, + def __init__(self, name = '', address_1 = '', city = '', state='', zipcode='', zipcode_ext='', company='', address_2='', phone=''): self.name = name self.company = company diff --git a/usps/usps.py b/usps/usps.py index 0de3eef..a290d42 100644 --- a/usps/usps.py +++ b/usps/usps.py @@ -17,6 +17,7 @@ class USPSApi(object): 'tracking': 'TrackV2{test}&XML={xml}', 'label': 'eVS{test}&XML={xml}', 'validate': 'Verify&XML={xml}', + 'zipcode': 'ZipCodeLookup&XML={xml}', } def __init__(self, api_user_id, test=False): @@ -59,6 +60,15 @@ def __init__(self, usps, address): self.result = usps.send_request('validate', xml) +class ZipCodeLookup(object): + + def __int__(self, usps, address): + xml = etree.Element('ZipCodeLookupRequest', {'USERID': usps.api_user_id}) + _address = etree.SubElement(xml, 'Address', {'ID': '0'}) + address.add_to_xml(_address, prefix='', validate=True) + self.request = usps.send_request('zipcode', xml) + + class TrackingInfo(object): def __init__(self, usps, tracking_number,**kwargs): From e397d1f637de0294540b9dd720ca86751be3ae61 Mon Sep 17 00:00:00 2001 From: Tristan Date: Sun, 18 Dec 2022 22:34:17 +0100 Subject: [PATCH 2/2] Made address field option not requred for all calls --- usps/address.py | 42 ++++++++++++++++++++++++------------------ usps/tests.py | 7 +++++-- usps/usps.py | 7 +++++-- 3 files changed, 34 insertions(+), 22 deletions(-) diff --git a/usps/address.py b/usps/address.py index 6ed3667..33589f6 100644 --- a/usps/address.py +++ b/usps/address.py @@ -3,7 +3,7 @@ class Address(object): - def __init__(self, name = '', address_1 = '', city = '', state='', zipcode='', + def __init__(self, name=None, address_1=None, city=None, state=None, zipcode=None, zipcode_ext='', company='', address_2='', phone=''): self.name = name self.company = company @@ -15,32 +15,38 @@ def __init__(self, name = '', address_1 = '', city = '', state='', zipcode='', self.zipcode_ext = zipcode_ext self.phone = phone - def add_to_xml(self, root, prefix='To', validate=False): - if not validate: + def add_to_xml(self, root, prefix='To', validate=False, ziplookup=False): + if not validate or ziplookup: name = etree.SubElement(root, prefix + 'Name') name.text = self.name - company = etree.SubElement(root, prefix + 'Firm' + ('Name' if validate else '')) - company.text = self.company - - address_1 = etree.SubElement(root, prefix + 'Address1') - address_1.text = self.address_1 + if not ziplookup: + company = etree.SubElement(root, prefix + 'Firm' + ('Name' if validate else '')) + company.text = self.company + + if self.address_1 is not None: + address_1 = etree.SubElement(root, prefix + 'Address1') + address_1.text = self.address_1 address_2 = etree.SubElement(root, prefix + 'Address2') address_2.text = self.address_2 or '-' - - city = etree.SubElement(root, prefix + 'City') - city.text = self.city - state = etree.SubElement(root, prefix + 'State') - state.text = self.state + if self.city is not None: + city = etree.SubElement(root, prefix + 'City') + city.text = self.city + + if self.state is not None: + state = etree.SubElement(root, prefix + 'State') + state.text = self.state - zipcode = etree.SubElement(root, prefix + 'Zip5') - zipcode.text = self.zipcode + if self.zipcode is not None: + zipcode = etree.SubElement(root, prefix + 'Zip5') + zipcode.text = self.zipcode - zipcode_ext = etree.SubElement(root, prefix + 'Zip4') - zipcode_ext.text = self.zipcode_ext + if self.zipcode_ext is not None: + zipcode_ext = etree.SubElement(root, prefix + 'Zip4') + zipcode_ext.text = self.zipcode_ext - if not validate: + if not validate or ziplookup: phone = etree.SubElement(root, prefix + 'Phone') phone.text = self.phone diff --git a/usps/tests.py b/usps/tests.py index c0c195c..93c04a2 100644 --- a/usps/tests.py +++ b/usps/tests.py @@ -39,7 +39,7 @@ def test_get_url(self): usps.get_url('validate', 'test'), 'https://secure.shippingapis.com/ShippingAPI.dll?API=Verify&XML=test' ) - + @mock.patch('requests.get') def test_send_request_error(self, requests_mock): requests_mock.return_value.content = b'Test Error' @@ -70,7 +70,7 @@ def test_wrapper_methods(self, address_mock, track_mock, ship_mock): class AddressTestCase(TestCase): - + def test_address_xml(self): address = Address('Test', '123 Test St.', 'Test', 'NE', '55555') root = etree.Element('Test') @@ -95,3 +95,6 @@ class TrackingInfoTestCase(TestCase): class ShippingLabelTestCase(TestCase): pass + +class ZipCodeLookupTestCase(TestCase): + pass diff --git a/usps/usps.py b/usps/usps.py index a290d42..ab8b604 100644 --- a/usps/usps.py +++ b/usps/usps.py @@ -43,6 +43,9 @@ def send_request(self, action, xml): def validate_address(self, *args, **kwargs): return AddressValidate(self, *args, **kwargs) + def zipcode_lookup(self, *args, **kwargs): + return ZipCodeLookup(self, *args, **kwargs) + def track(self, *args, **kwargs): return TrackingInfo(self, *args, **kwargs) @@ -62,11 +65,11 @@ def __init__(self, usps, address): class ZipCodeLookup(object): - def __int__(self, usps, address): + def __init__(self, usps, address): xml = etree.Element('ZipCodeLookupRequest', {'USERID': usps.api_user_id}) _address = etree.SubElement(xml, 'Address', {'ID': '0'}) address.add_to_xml(_address, prefix='', validate=True) - self.request = usps.send_request('zipcode', xml) + self.result = usps.send_request('zipcode', xml) class TrackingInfo(object):