diff --git a/doc_src/services.rst b/doc_src/services.rst index 5498c5b..7fad30d 100755 --- a/doc_src/services.rst +++ b/doc_src/services.rst @@ -68,10 +68,14 @@ Validates the postal codes for a given address. Pickup Service -------------- -Creates a fedex pickup request. +Creates a FedEx pickup request. .. autoclass:: fedex.services.pickup_service.FedexCreatePickupRequest +Queries pickup availability. + +.. autoclass:: fedex.services.pickup_service.FedexPickupAvailabilityRequest + Package Movement Service ------------------------ diff --git a/fedex/services/pickup_service.py b/fedex/services/pickup_service.py index e071b0e..1ac1202 100644 --- a/fedex/services/pickup_service.py +++ b/fedex/services/pickup_service.py @@ -65,3 +65,81 @@ def _assemble_and_send_request(self): CountryRelationship=self.CountryRelationship ) + +class FedexPickupAvailabilityRequest(FedexBaseService): + + def __init__(self, config_obj, *args, **kwargs): + self._config_obj = config_obj + # Holds version info for the VersionId SOAP object. + self._version_info = { + 'service_id': 'disp', + 'major': '17', + 'intermediate': '0', + 'minor': '0' + } + self.PickupType = None + self.AccountNumber = None + self.PickupAddress = None + self.PickupRequestType = None + self.DispatchDate = None + self.NumberOfBusinessDays = None + self.PackageReadyTime = None + self.CustomerCloseTime = None + self.Carriers = None + self.ShipmentAttributes = None + self.PackageDetails = None + super(FedexPickupAvailabilityRequest, self).__init__(self._config_obj, 'PickupService_v17.wsdl', *args, **kwargs) + + def _prepare_wsdl_objects(self): + self.Carriers = 'FDXE' + + self.AccountNumber = self.client.factory.create('AssociatedAccount') + self.AccountNumber.Type = None + self.AccountNumber.AccountNumber = None + + self.PickupAddress = self.client.factory.create('Address') + + self.ShipmentAttributes = self.client.factory.create('PickupShipmentAttributes') + self.ShipmentAttributes.ServiceType = None + self.ShipmentAttributes.PackagingType = None + + self.ShipmentAttributes.Dimensions = self.client.factory.create('Dimensions') + self.ShipmentAttributes.Dimensions.Length = None + self.ShipmentAttributes.Dimensions.Width = None + self.ShipmentAttributes.Dimensions.Height = None + self.ShipmentAttributes.Dimensions.Units = None + + self.ShipmentAttributes.Weight = self.client.factory.create('Weight') + self.ShipmentAttributes.Weight.Units = None + self.ShipmentAttributes.Weight.Value = None + + self.PackageDetails = self.client.factory.create('RequestedPickupPackageDetail') + self.PackageDetails.PackageSpecialServices = self.client.factory.create('PickupPackageSpecialServicesRequested') + self.PackageDetails.Weight = self.client.factory.create('Weight') + + def _assemble_and_send_request(self): + """ + Fires off the Fedex request. + + @warning: NEVER CALL THIS METHOD DIRECTLY. CALL send_request(), + WHICH RESIDES ON FedexBaseService AND IS INHERITED. + """ + + # Fire off the query. + return self.client.service.getPickupAvailability( + WebAuthenticationDetail=self.WebAuthenticationDetail, + ClientDetail=self.ClientDetail, + TransactionDetail=self.TransactionDetail, + Version=self.VersionId, + PickupType=self.PickupType, + AccountNumber=self.AccountNumber, + PickupAddress=self.PickupAddress, + PickupRequestType=self.PickupRequestType, + DispatchDate=self.DispatchDate, + NumberOfBusinessDays=self.NumberOfBusinessDays, + PackageReadyTime=self.PackageReadyTime, + CustomerCloseTime=self.CustomerCloseTime, + Carriers=self.Carriers, + ShipmentAttributes=self.ShipmentAttributes, + PackageDetails=self.PackageDetails + ) diff --git a/tests/test_pickup_service.py b/tests/test_pickup_service.py index 5dcc39c..ef6a408 100644 --- a/tests/test_pickup_service.py +++ b/tests/test_pickup_service.py @@ -8,7 +8,7 @@ import datetime sys.path.insert(0, '..') -from fedex.services.pickup_service import FedexCreatePickupRequest +from fedex.services.pickup_service import FedexCreatePickupRequest, FedexPickupAvailabilityRequest # Common global config object for testing. from tests.common import get_fedex_config @@ -77,6 +77,43 @@ def test_pickup_request(self): assert pickup_service.response.HighestSeverity == 'SUCCESS', pickup_service.response.Notifications[0].Message + def test_pickup_availability(self): + availability = FedexPickupAvailabilityRequest(self.config_obj) + + availability.PickupType = 'ON_CALL' + + availability.AccountNumber.Type = 'FEDEX_EXPRESS' + availability.AccountNumber.AccountNumber = self._get_config().account_number + + availability.DispatchDate = datetime.datetime.now().strftime('%Y-%m-%d') + availability.PackageReadyTime = datetime.datetime.now().strftime('%H:%M:%S') + availability.CustomerCloseTime = '17:00:00' + + availability.NumberOfBusinessDays = 2 + + availability.PickupAddress.PostalCode = 'M5V 3A4' + availability.PickupAddress.CountryCode = 'CA' + availability.PickupAddress.CountryName = 'Canada' + + availability.PickupRequestType = 'SAME_DAY' + + availability.ShipmentAttributes.ServiceType = 'PRIORITY_OVERNIGHT' + availability.ShipmentAttributes.PackagingType = 'YOUR_PACKAGING' + + availability.ShipmentAttributes.Dimensions.Length = 12 + availability.ShipmentAttributes.Dimensions.Width = 9 + availability.ShipmentAttributes.Dimensions.Height = 1 + availability.ShipmentAttributes.Dimensions.Units = 'IN' + + availability.ShipmentAttributes.Weight.Units = 'KG' + availability.ShipmentAttributes.Weight.Value = 0.25 + + availability.send_request() + + availability.send_request() + + assert availability.response.HighestSeverity == 'SUCCESS', availability.response.Notifications[0].Message + if __name__ == "__main__": logging.basicConfig(stream=sys.stdout, level=logging.INFO)