Skip to content

Commit 7ea2ca8

Browse files
authored
Merge pull request #107 from danielshorten/pickup-availability
Add support for PickupAvailabilityRequest
2 parents f691dfe + 632ab4a commit 7ea2ca8

File tree

3 files changed

+121
-2
lines changed

3 files changed

+121
-2
lines changed

doc_src/services.rst

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,10 +68,14 @@ Validates the postal codes for a given address.
6868
Pickup Service
6969
--------------
7070

71-
Creates a fedex pickup request.
71+
Creates a FedEx pickup request.
7272

7373
.. autoclass:: fedex.services.pickup_service.FedexCreatePickupRequest
7474

75+
Queries pickup availability.
76+
77+
.. autoclass:: fedex.services.pickup_service.FedexPickupAvailabilityRequest
78+
7579

7680
Package Movement Service
7781
------------------------

fedex/services/pickup_service.py

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,3 +65,81 @@ def _assemble_and_send_request(self):
6565
CountryRelationship=self.CountryRelationship
6666
)
6767

68+
69+
class FedexPickupAvailabilityRequest(FedexBaseService):
70+
71+
def __init__(self, config_obj, *args, **kwargs):
72+
self._config_obj = config_obj
73+
# Holds version info for the VersionId SOAP object.
74+
self._version_info = {
75+
'service_id': 'disp',
76+
'major': '17',
77+
'intermediate': '0',
78+
'minor': '0'
79+
}
80+
self.PickupType = None
81+
self.AccountNumber = None
82+
self.PickupAddress = None
83+
self.PickupRequestType = None
84+
self.DispatchDate = None
85+
self.NumberOfBusinessDays = None
86+
self.PackageReadyTime = None
87+
self.CustomerCloseTime = None
88+
self.Carriers = None
89+
self.ShipmentAttributes = None
90+
self.PackageDetails = None
91+
super(FedexPickupAvailabilityRequest, self).__init__(self._config_obj, 'PickupService_v17.wsdl', *args, **kwargs)
92+
93+
def _prepare_wsdl_objects(self):
94+
self.Carriers = 'FDXE'
95+
96+
self.AccountNumber = self.client.factory.create('AssociatedAccount')
97+
self.AccountNumber.Type = None
98+
self.AccountNumber.AccountNumber = None
99+
100+
self.PickupAddress = self.client.factory.create('Address')
101+
102+
self.ShipmentAttributes = self.client.factory.create('PickupShipmentAttributes')
103+
self.ShipmentAttributes.ServiceType = None
104+
self.ShipmentAttributes.PackagingType = None
105+
106+
self.ShipmentAttributes.Dimensions = self.client.factory.create('Dimensions')
107+
self.ShipmentAttributes.Dimensions.Length = None
108+
self.ShipmentAttributes.Dimensions.Width = None
109+
self.ShipmentAttributes.Dimensions.Height = None
110+
self.ShipmentAttributes.Dimensions.Units = None
111+
112+
self.ShipmentAttributes.Weight = self.client.factory.create('Weight')
113+
self.ShipmentAttributes.Weight.Units = None
114+
self.ShipmentAttributes.Weight.Value = None
115+
116+
self.PackageDetails = self.client.factory.create('RequestedPickupPackageDetail')
117+
self.PackageDetails.PackageSpecialServices = self.client.factory.create('PickupPackageSpecialServicesRequested')
118+
self.PackageDetails.Weight = self.client.factory.create('Weight')
119+
120+
def _assemble_and_send_request(self):
121+
"""
122+
Fires off the Fedex request.
123+
124+
@warning: NEVER CALL THIS METHOD DIRECTLY. CALL send_request(),
125+
WHICH RESIDES ON FedexBaseService AND IS INHERITED.
126+
"""
127+
128+
# Fire off the query.
129+
return self.client.service.getPickupAvailability(
130+
WebAuthenticationDetail=self.WebAuthenticationDetail,
131+
ClientDetail=self.ClientDetail,
132+
TransactionDetail=self.TransactionDetail,
133+
Version=self.VersionId,
134+
PickupType=self.PickupType,
135+
AccountNumber=self.AccountNumber,
136+
PickupAddress=self.PickupAddress,
137+
PickupRequestType=self.PickupRequestType,
138+
DispatchDate=self.DispatchDate,
139+
NumberOfBusinessDays=self.NumberOfBusinessDays,
140+
PackageReadyTime=self.PackageReadyTime,
141+
CustomerCloseTime=self.CustomerCloseTime,
142+
Carriers=self.Carriers,
143+
ShipmentAttributes=self.ShipmentAttributes,
144+
PackageDetails=self.PackageDetails
145+
)

tests/test_pickup_service.py

Lines changed: 38 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
import datetime
99

1010
sys.path.insert(0, '..')
11-
from fedex.services.pickup_service import FedexCreatePickupRequest
11+
from fedex.services.pickup_service import FedexCreatePickupRequest, FedexPickupAvailabilityRequest
1212

1313
# Common global config object for testing.
1414
from tests.common import get_fedex_config
@@ -77,6 +77,43 @@ def test_pickup_request(self):
7777

7878
assert pickup_service.response.HighestSeverity == 'SUCCESS', pickup_service.response.Notifications[0].Message
7979

80+
def test_pickup_availability(self):
81+
availability = FedexPickupAvailabilityRequest(self.config_obj)
82+
83+
availability.PickupType = 'ON_CALL'
84+
85+
availability.AccountNumber.Type = 'FEDEX_EXPRESS'
86+
availability.AccountNumber.AccountNumber = self._get_config().account_number
87+
88+
availability.DispatchDate = datetime.datetime.now().strftime('%Y-%m-%d')
89+
availability.PackageReadyTime = datetime.datetime.now().strftime('%H:%M:%S')
90+
availability.CustomerCloseTime = '17:00:00'
91+
92+
availability.NumberOfBusinessDays = 2
93+
94+
availability.PickupAddress.PostalCode = 'M5V 3A4'
95+
availability.PickupAddress.CountryCode = 'CA'
96+
availability.PickupAddress.CountryName = 'Canada'
97+
98+
availability.PickupRequestType = 'SAME_DAY'
99+
100+
availability.ShipmentAttributes.ServiceType = 'PRIORITY_OVERNIGHT'
101+
availability.ShipmentAttributes.PackagingType = 'YOUR_PACKAGING'
102+
103+
availability.ShipmentAttributes.Dimensions.Length = 12
104+
availability.ShipmentAttributes.Dimensions.Width = 9
105+
availability.ShipmentAttributes.Dimensions.Height = 1
106+
availability.ShipmentAttributes.Dimensions.Units = 'IN'
107+
108+
availability.ShipmentAttributes.Weight.Units = 'KG'
109+
availability.ShipmentAttributes.Weight.Value = 0.25
110+
111+
availability.send_request()
112+
113+
availability.send_request()
114+
115+
assert availability.response.HighestSeverity == 'SUCCESS', availability.response.Notifications[0].Message
116+
80117

81118
if __name__ == "__main__":
82119
logging.basicConfig(stream=sys.stdout, level=logging.INFO)

0 commit comments

Comments
 (0)