Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
101 changes: 71 additions & 30 deletions examples/address_validation.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,51 +7,92 @@ class can handle up to 100 addresses for validation.
from example_config import CONFIG_OBJ
from fedex.services.address_validation_service import FedexAddressValidationRequest

# NOTE: TO USE ADDRESS VALIDATION SERVICES, YOU NEED TO REQUEST FEDEX TO ENABLE THIS SERVICE FOR YOUR ACCOUNT.
# BY DEFAULT, THE SERVICE IS DISABLED AND YOU WILL RECEIVE AUTHENTICATION FAILED, 1000 RESPONSE.

# Set this to the INFO level to see the response from Fedex printed in stdout.
logging.basicConfig(level=logging.INFO)

# This is the object that will be handling our tracking request.
# We're using the FedexConfig object from example_config.py in this dir.
connection = FedexAddressValidationRequest(CONFIG_OBJ)

# The AddressValidationOptions are created with default values of None, which
# will cause WSDL validation errors. To make things work, each option needs to
# be explicitly set or deleted.

## Set the flags we want to True (or a value).
connection.AddressValidationOptions.CheckResidentialStatus = True
connection.AddressValidationOptions.VerifyAddresses = True
connection.AddressValidationOptions.RecognizeAlternateCityNames = True
connection.AddressValidationOptions.MaximumNumberOfMatches = 3

## Delete the flags we don't want.
del connection.AddressValidationOptions.ConvertToUpperCase
del connection.AddressValidationOptions.ReturnParsedElements

## *Accuracy fields can be TIGHT, EXACT, MEDIUM, or LOOSE. Or deleted.
connection.AddressValidationOptions.StreetAccuracy = 'LOOSE'
del connection.AddressValidationOptions.DirectionalAccuracy
del connection.AddressValidationOptions.CompanyNameAccuracy

## Create some addresses to validate
address1 = connection.create_wsdl_object_of_type('AddressToValidate')
address1.CompanyName = 'International Paper'
customer_transaction_id = "*** AddressValidation Request v4 using Python ***" # Optional transaction_id
# Optional locale & language client data
client_language_code = 'EN'
client_locale_code = 'US'
avs_request = FedexAddressValidationRequest(CONFIG_OBJ, customer_transaction_id=customer_transaction_id,
client_locale_code=client_locale_code,
client_language_code=client_language_code)

# Create some addresses to validate
address1 = avs_request.create_wsdl_object_of_type('AddressToValidate')
address1.ClientReferenceId = "Your ID for the Recipient"
address1.Address.StreetLines = ['155 Old Greenville Hwy', 'Suite 103']
address1.Address.City = 'Clemson'
address1.Address.StateOrProvinceCode = 'SC'
address1.Address.PostalCode = 29631
address1.Address.CountryCode = 'US'
address1.Address.Residential = False
connection.add_address(address1)

address2 = connection.create_wsdl_object_of_type('AddressToValidate')
address1.Contact.PersonName = 'Recipient Name'
address1.Contact.CompanyName = 'Company Name'
address1.Contact.PhoneNumber = '999-123-5343'
address1.Contact.EMailAddress = 'example_recipient@email.com'
avs_request.add_address(address1)

address2 = avs_request.create_wsdl_object_of_type('AddressToValidate')
address2.Address.StreetLines = ['320 S Cedros', '#200']
address2.Address.City = 'Solana Beach'
address2.Address.StateOrProvinceCode = 'CA'
address2.Address.PostalCode = 92075
address2.Address.CountryCode = 'US'
connection.add_address(address2)
avs_request.add_address(address2)


# If you'd like to see some documentation on the ship service WSDL, un-comment
# this line. (Spammy).
#print avs_request.client

# Un-comment this to see your complete, ready-to-send request as it stands
# before it is actually sent. This is useful for seeing what values you can
# change.
#print avs_request.AddressesToValidate
#print avs_request.ClientDetail
#print avs_request.TransactionDetail

# Fires off the request, sets the 'response' attribute on the object.
avs_request.send_request()

# good to un-comment to see the variables returned by the Fedex reply.
print avs_request.response
#print avs_request.client.last_received()

# See the request printed out.
#print avs_request.client.last_sent()

# Overall end result of the query
for i in range(len(avs_request.response.AddressResults)):

print "Details for Address", i + 1
print "The validated street is:", avs_request.response.AddressResults[i].EffectiveAddress.StreetLines
print "The validated city is:", avs_request.response.AddressResults[i].EffectiveAddress.City
print "The validated state code is:", avs_request.response.AddressResults[i].EffectiveAddress.StateOrProvinceCode
print "The validated postal code is:", avs_request.response.AddressResults[i].EffectiveAddress.PostalCode
print "The validated country code is:", avs_request.response.AddressResults[i].EffectiveAddress.CountryCode

# Can be used to determine the address classification to figure out if Residential fee should apply.
# MIXED, RESIDENTIAL, UNKNOWN, BUSINESS
print "The validated address is residential:", avs_request.response.AddressResults[i].Classification != 'BUSINESS'

## Send the request and print the response
connection.send_request()
print connection.response
# Getting the optional attributes if available
for j in range(len(avs_request.response.AddressResults[i].Attributes)):
cur_attribute = avs_request.response.AddressResults[i].Attributes[j]
if cur_attribute.Name == "CountrySupported":
print "Supported Country:", cur_attribute.Value == 'true'
if cur_attribute.Name == "SuiteRequiredButMissing":
print "Missing Suite:", cur_attribute.Value == 'true'
if cur_attribute.Name == "CountrySupported":
print "Invalid Suite:", cur_attribute.Value == 'true'
if cur_attribute.Name == "MultipleMatches":
print "Multiple Matches:", cur_attribute.Value == 'true'
if cur_attribute.Name == "POBox":
print "Is POBox:", cur_attribute.Value == 'true'
25 changes: 9 additions & 16 deletions fedex/services/address_validation_service.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,30 +28,24 @@ def __init__(self, config_obj, *args, **kwargs):
# Holds version info for the VersionId SOAP object.
self._version_info = {
'service_id': 'aval',
'major': '2',
'major': '4',
'intermediate': '0',
'minor': '0'
}

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

def _prepare_wsdl_objects(self):
"""
Create the data structure and get it ready for the WSDL request.
"""

# This holds some optional options for the request..
self.AddressValidationOptions = self.client.factory.create('AddressValidationOptions')

# This is good to review if you'd like to see what the data structure
# looks like.
self.logger.debug(self.AddressValidationOptions)
pass

def _assemble_and_send_request(self):
"""
Expand All @@ -75,13 +69,12 @@ def _assemble_and_send_request(self):
ClientDetail=self.ClientDetail,
TransactionDetail=self.TransactionDetail,
Version=self.VersionId,
RequestTimestamp=datetime.now(),
Options=self.AddressValidationOptions,
AddressesToValidate=self.addresses_to_validate)
InEffectAsOfTimestamp=datetime.now(),
AddressesToValidate=self.AddressesToValidate)

def add_address(self, address_item):
"""
Adds an address to self.addresses_to_validate.
Adds an address to self.AddressesToValidate.

@type address_item: WSDL object, type of AddressToValidate WSDL object.
@keyword address_item: A AddressToValidate, created by
Expand All @@ -90,4 +83,4 @@ def add_address(self, address_item):
See examples/create_shipment.py for more details.
"""

self.addresses_to_validate.append(address_item)
self.AddressesToValidate.append(address_item)
Loading