Skip to content

Commit 14eea65

Browse files
committed
added address validation v4
1 parent a8dd4cf commit 14eea65

File tree

4 files changed

+80
-1252
lines changed

4 files changed

+80
-1252
lines changed

examples/address_validation.py

Lines changed: 71 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -7,51 +7,92 @@ class can handle up to 100 addresses for validation.
77
from example_config import CONFIG_OBJ
88
from fedex.services.address_validation_service import FedexAddressValidationRequest
99

10+
# NOTE: TO USE ADDRESS VALIDATION SERVICES, YOU NEED TO REQUEST FEDEX TO ENABLE THIS SERVICE FOR YOUR ACCOUNT.
11+
# BY DEFAULT, THE SERVICE IS DISABLED AND YOU WILL RECEIVE AUTHENTICATION FAILED, 1000 RESPONSE.
12+
1013
# Set this to the INFO level to see the response from Fedex printed in stdout.
1114
logging.basicConfig(level=logging.INFO)
1215

1316
# This is the object that will be handling our tracking request.
1417
# We're using the FedexConfig object from example_config.py in this dir.
15-
connection = FedexAddressValidationRequest(CONFIG_OBJ)
16-
17-
# The AddressValidationOptions are created with default values of None, which
18-
# will cause WSDL validation errors. To make things work, each option needs to
19-
# be explicitly set or deleted.
20-
21-
## Set the flags we want to True (or a value).
22-
connection.AddressValidationOptions.CheckResidentialStatus = True
23-
connection.AddressValidationOptions.VerifyAddresses = True
24-
connection.AddressValidationOptions.RecognizeAlternateCityNames = True
25-
connection.AddressValidationOptions.MaximumNumberOfMatches = 3
26-
27-
## Delete the flags we don't want.
28-
del connection.AddressValidationOptions.ConvertToUpperCase
29-
del connection.AddressValidationOptions.ReturnParsedElements
30-
31-
## *Accuracy fields can be TIGHT, EXACT, MEDIUM, or LOOSE. Or deleted.
32-
connection.AddressValidationOptions.StreetAccuracy = 'LOOSE'
33-
del connection.AddressValidationOptions.DirectionalAccuracy
34-
del connection.AddressValidationOptions.CompanyNameAccuracy
35-
36-
## Create some addresses to validate
37-
address1 = connection.create_wsdl_object_of_type('AddressToValidate')
38-
address1.CompanyName = 'International Paper'
18+
customer_transaction_id = "*** AddressValidation Request v4 using Python ***" # Optional transaction_id
19+
# Optional locale & language client data
20+
client_language_code = 'EN'
21+
client_locale_code = 'US'
22+
avs_request = FedexAddressValidationRequest(CONFIG_OBJ, customer_transaction_id=customer_transaction_id,
23+
client_locale_code=client_locale_code,
24+
client_language_code=client_language_code)
25+
26+
# Create some addresses to validate
27+
address1 = avs_request.create_wsdl_object_of_type('AddressToValidate')
28+
address1.ClientReferenceId = "Your ID for the Recipient"
3929
address1.Address.StreetLines = ['155 Old Greenville Hwy', 'Suite 103']
4030
address1.Address.City = 'Clemson'
4131
address1.Address.StateOrProvinceCode = 'SC'
4232
address1.Address.PostalCode = 29631
4333
address1.Address.CountryCode = 'US'
4434
address1.Address.Residential = False
45-
connection.add_address(address1)
4635

47-
address2 = connection.create_wsdl_object_of_type('AddressToValidate')
36+
address1.Contact.PersonName = 'Recipient Name'
37+
address1.Contact.CompanyName = 'Company Name'
38+
address1.Contact.PhoneNumber = '999-123-5343'
39+
address1.Contact.EMailAddress = 'example_recipient@email.com'
40+
avs_request.add_address(address1)
41+
42+
address2 = avs_request.create_wsdl_object_of_type('AddressToValidate')
4843
address2.Address.StreetLines = ['320 S Cedros', '#200']
4944
address2.Address.City = 'Solana Beach'
5045
address2.Address.StateOrProvinceCode = 'CA'
5146
address2.Address.PostalCode = 92075
5247
address2.Address.CountryCode = 'US'
53-
connection.add_address(address2)
48+
avs_request.add_address(address2)
49+
50+
51+
# If you'd like to see some documentation on the ship service WSDL, un-comment
52+
# this line. (Spammy).
53+
#print avs_request.client
54+
55+
# Un-comment this to see your complete, ready-to-send request as it stands
56+
# before it is actually sent. This is useful for seeing what values you can
57+
# change.
58+
#print avs_request.AddressesToValidate
59+
#print avs_request.ClientDetail
60+
#print avs_request.TransactionDetail
61+
62+
# Fires off the request, sets the 'response' attribute on the object.
63+
avs_request.send_request()
64+
65+
# good to un-comment to see the variables returned by the Fedex reply.
66+
print avs_request.response
67+
#print avs_request.client.last_received()
68+
69+
# See the request printed out.
70+
#print avs_request.client.last_sent()
71+
72+
# Overall end result of the query
73+
for i in range(len(avs_request.response.AddressResults)):
74+
75+
print "Details for Address", i + 1
76+
print "The validated street is:", avs_request.response.AddressResults[i].EffectiveAddress.StreetLines
77+
print "The validated city is:", avs_request.response.AddressResults[i].EffectiveAddress.City
78+
print "The validated state code is:", avs_request.response.AddressResults[i].EffectiveAddress.StateOrProvinceCode
79+
print "The validated postal code is:", avs_request.response.AddressResults[i].EffectiveAddress.PostalCode
80+
print "The validated country code is:", avs_request.response.AddressResults[i].EffectiveAddress.CountryCode
81+
82+
# Can be used to determine the address classification to figure out if Residential fee should apply.
83+
# MIXED, RESIDENTIAL, UNKNOWN, BUSINESS
84+
print "The validated address is residential:", avs_request.response.AddressResults[i].Classification != 'BUSINESS'
5485

55-
## Send the request and print the response
56-
connection.send_request()
57-
print connection.response
86+
# Getting the optional attributes if available
87+
for j in range(len(avs_request.response.AddressResults[i].Attributes)):
88+
cur_attribute = avs_request.response.AddressResults[i].Attributes[j]
89+
if cur_attribute.Name == "CountrySupported":
90+
print "Supported Country:", cur_attribute.Value == 'true'
91+
if cur_attribute.Name == "SuiteRequiredButMissing":
92+
print "Missing Suite:", cur_attribute.Value == 'true'
93+
if cur_attribute.Name == "CountrySupported":
94+
print "Invalid Suite:", cur_attribute.Value == 'true'
95+
if cur_attribute.Name == "MultipleMatches":
96+
print "Multiple Matches:", cur_attribute.Value == 'true'
97+
if cur_attribute.Name == "POBox":
98+
print "Is POBox:", cur_attribute.Value == 'true'

fedex/services/address_validation_service.py

Lines changed: 9 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -28,30 +28,24 @@ def __init__(self, config_obj, *args, **kwargs):
2828
# Holds version info for the VersionId SOAP object.
2929
self._version_info = {
3030
'service_id': 'aval',
31-
'major': '2',
31+
'major': '4',
3232
'intermediate': '0',
3333
'minor': '0'
3434
}
3535

36-
self.AddressValidationOptions = None
36+
# self.AddressValidationOptions = None
3737
"""@ivar: Holds the AddressValidationOptions WSDL object."""
38-
self.addresses_to_validate = []
38+
self.AddressesToValidate = []
3939
"""@ivar: Holds the AddressToValidate WSDL object."""
4040
# Call the parent FedexBaseService class for basic setup work.
4141
super(FedexAddressValidationRequest, self).__init__(
42-
self._config_obj, 'AddressValidationService_v2.wsdl', *args, **kwargs)
42+
self._config_obj, 'AddressValidationService_v4.wsdl', *args, **kwargs)
4343

4444
def _prepare_wsdl_objects(self):
4545
"""
4646
Create the data structure and get it ready for the WSDL request.
4747
"""
48-
49-
# This holds some optional options for the request..
50-
self.AddressValidationOptions = self.client.factory.create('AddressValidationOptions')
51-
52-
# This is good to review if you'd like to see what the data structure
53-
# looks like.
54-
self.logger.debug(self.AddressValidationOptions)
48+
pass
5549

5650
def _assemble_and_send_request(self):
5751
"""
@@ -75,13 +69,12 @@ def _assemble_and_send_request(self):
7569
ClientDetail=self.ClientDetail,
7670
TransactionDetail=self.TransactionDetail,
7771
Version=self.VersionId,
78-
RequestTimestamp=datetime.now(),
79-
Options=self.AddressValidationOptions,
80-
AddressesToValidate=self.addresses_to_validate)
72+
InEffectAsOfTimestamp=datetime.now(),
73+
AddressesToValidate=self.AddressesToValidate)
8174

8275
def add_address(self, address_item):
8376
"""
84-
Adds an address to self.addresses_to_validate.
77+
Adds an address to self.AddressesToValidate.
8578
8679
@type address_item: WSDL object, type of AddressToValidate WSDL object.
8780
@keyword address_item: A AddressToValidate, created by
@@ -90,4 +83,4 @@ def add_address(self, address_item):
9083
See examples/create_shipment.py for more details.
9184
"""
9285

93-
self.addresses_to_validate.append(address_item)
86+
self.AddressesToValidate.append(address_item)

0 commit comments

Comments
 (0)