Skip to content

Commit cd676f3

Browse files
author
Greg Taylor
committed
Re-arranging to more intelligently name stuff. Handle Fedex server errors. Beginnings of the Shipment module.
1 parent f3295fb commit cd676f3

File tree

6 files changed

+134
-36
lines changed

6 files changed

+134
-36
lines changed

examples/track_shipment.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
This example shows how to track shipments.
44
"""
55
import logging
6-
from fedex.services.ship_service import FedexTrackRequest
6+
from fedex.services.track_service import FedexTrackRequest
77
from fedex.config import FedexConfig
88

99
# Set this to the INFO level to see the response from Fedex printed in stdout.

fedex/base_service.py

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,24 @@
1010
import logging
1111
from suds.client import Client
1212

13+
class FedexBaseServiceException(Exception):
14+
"""
15+
Serves as the base exception that other service-related exception objects
16+
are sub-classed from.
17+
"""
18+
def __init__(self, value):
19+
self.value = value
20+
def __str__(self):
21+
return repr(self.value)
22+
23+
class FedexFailure(FedexBaseServiceException):
24+
"""
25+
The request could not be handled at this time. This is generally a server
26+
problem.
27+
"""
28+
def __init__(self):
29+
self.value = "Your request could not be handled at this time. This is likely Fedex server problems, try again later."
30+
1331
class FedexBaseService(object):
1432
"""
1533
This class is the master class for all Fedex request objects. It gets all
@@ -124,10 +142,19 @@ def __set_version_id(self):
124142
self.logger.debug(VersionId)
125143
self.VersionId = VersionId
126144

145+
def __check_response_for_fedex_error(self):
146+
"""
147+
This checks the response for general Fedex errors that aren't related
148+
to any one WSDL.
149+
"""
150+
if self.response.HighestSeverity == "FAILURE":
151+
raise FedexFailure()
152+
127153
def send_request(self):
128154
"""
129155
Sends the assembled request on the child object.
130156
"""
131157
self.response = self._assemble_and_send_request()
158+
self.__check_response_for_fedex_error()
132159
self.logger.info("== FEDEX QUERY RESULT ==")
133160
self.logger.info(self.response)

fedex/services/ship_service.py

Lines changed: 18 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
"""
22
Ship Service Module
33
===================
4-
This package contains the shipping and tracking methods defined by Fedex's
4+
This package contains the shipping methods defined by Fedex's
55
ShipService WSDL file. Each is encapsulated in a class for easy access.
66
For more details on each, refer to the respective class's documentation.
77
"""
88
from .. base_service import FedexBaseService
99

10-
class FedexTrackRequest(FedexBaseService):
10+
class FedexShipRequest(FedexBaseService):
1111
"""
1212
This class allows you to track shipments by providing a tracking
1313
number or other identifying features. By default, you
@@ -35,31 +35,19 @@ def __init__(self, config_obj, tracking_value,
3535
self._config_obj = config_obj
3636

3737
# Holds version info for the VersionId SOAP object.
38-
self._version_info = {'service_id': 'trck', 'major': '4',
38+
self._version_info = {'service_id': 'trck', 'major': '7',
3939
'intermediate': '0', 'minor': '0'}
4040
# Call the parent FedexBaseService class for basic setup work.
41-
super(FedexTrackRequest, self).__init__(self._config_obj,
42-
'TrackService_v4.wsdl',
41+
super(FedexShipRequest, self).__init__(self._config_obj,
42+
'ShipService_v7.wsdl',
4343
*args, **kwargs)
44-
45-
# Important request-specific instance variables.
46-
self.package_identifier = package_identifier
47-
"""@ivar: Determines what L{tracking_value} is, be it a tracking number,
48-
purchase order, or other things."""
49-
self.tracking_value = tracking_value
50-
"""@ivar: This is typically a Fedex tracking number, but setting
51-
L{package_identifier} to other values makes this change."""
5244

53-
def __set_track_package_identifier(self):
45+
def __set_transactional_detail(self):
5446
"""
55-
This sets the package identifier information. This may be a tracking
56-
number or a few different things as per the Fedex spec.
5747
"""
58-
TrackPackageIdentifier = self.client.factory.create('TrackPackageIdentifier')
59-
TrackPackageIdentifier.Type = self.package_identifier
60-
TrackPackageIdentifier.Value = self.tracking_value
61-
self.logger.debug(TrackPackageIdentifier)
62-
self.TrackPackageIdentifier = TrackPackageIdentifier
48+
TransactionDetail = self.client.factory.create('TransactionDetail')
49+
self.logger.info(TransactionDetail)
50+
self.TransactionDetail = TransactionDetail
6351

6452
def _assemble_and_send_request(self):
6553
"""
@@ -68,13 +56,14 @@ def _assemble_and_send_request(self):
6856
@warning: NEVER CALL THIS METHOD DIRECTLY. CALL send_request(), WHICH RESIDES
6957
ON FedexBaseService AND IS INHERITED.
7058
"""
71-
self.__set_track_package_identifier()
59+
self.__set_transactional_detail()
7260
client = self.client
7361
# Fire off the query.
74-
response = client.service.track(WebAuthenticationDetail=self.WebAuthenticationDetail,
75-
ClientDetail=self.ClientDetail,
76-
TransactionDetail=self.TransactionDetail,
77-
Version=self.VersionId,
78-
CarrierCodeType=self.CarrierCodeType,
79-
PackageIdentifier=self.TrackPackageIdentifier)
80-
return response
62+
"""
63+
processShipment(WebAuthenticationDetail WebAuthenticationDetail,
64+
ClientDetail ClientDetail,
65+
TransactionDetail TransactionDetail,
66+
VersionId Version,
67+
RequestedShipment RequestedShipment)
68+
"""
69+
#return response

fedex/services/track_service.py

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
"""
2+
Tracking Service Module
3+
=======================
4+
This package contains the shipment tracking methods defined by Fedex's
5+
TrackService WSDL file. Each is encapsulated in a class for easy access.
6+
For more details on each, refer to the respective class's documentation.
7+
"""
8+
import logging
9+
from .. base_service import FedexBaseService
10+
11+
class FedexTrackRequest(FedexBaseService):
12+
"""
13+
This class allows you to track shipments by providing a tracking
14+
number or other identifying features. By default, you
15+
can simply pass a tracking number to the constructor. If you would like
16+
to query shipments based on something other than tracking number, you will
17+
want to read the documentation for the L{__init__} method.
18+
Particularly, the tracking_value and package_identifier arguments.
19+
"""
20+
def __init__(self, config_obj, tracking_value,
21+
package_identifier='TRACKING_NUMBER_OR_DOORTAG',
22+
*args, **kwargs):
23+
"""
24+
Sends a shipment tracking request. The optional keyword args
25+
detailed on L{FedexBaseService} apply here as well.
26+
27+
@type tracking_value: L{str}
28+
@param tracking_value: Based on the value of package_identifier,
29+
this will be anything from a tracking number to a purchase order
30+
number.
31+
@type package_identifier: L{str}
32+
@keyword package_identifier: Determines what you are using to query for
33+
the shipment. The default assumes that tracking_value will be a Fedex
34+
tracking number.
35+
"""
36+
self._config_obj = config_obj
37+
38+
# Holds version info for the VersionId SOAP object.
39+
self._version_info = {'service_id': 'trck', 'major': '4',
40+
'intermediate': '0', 'minor': '0'}
41+
# Call the parent FedexBaseService class for basic setup work.
42+
super(FedexTrackRequest, self).__init__(self._config_obj,
43+
'TrackService_v4.wsdl',
44+
*args, **kwargs)
45+
46+
# Important request-specific instance variables.
47+
self.package_identifier = package_identifier
48+
"""@ivar: Determines what L{tracking_value} is, be it a tracking number,
49+
purchase order, or other things."""
50+
self.tracking_value = tracking_value
51+
"""@ivar: This is typically a Fedex tracking number, but setting
52+
L{package_identifier} to other values makes this change."""
53+
54+
def __set_track_package_identifier(self):
55+
"""
56+
This sets the package identifier information. This may be a tracking
57+
number or a few different things as per the Fedex spec.
58+
"""
59+
TrackPackageIdentifier = self.client.factory.create('TrackPackageIdentifier')
60+
TrackPackageIdentifier.Type = self.package_identifier
61+
TrackPackageIdentifier.Value = self.tracking_value
62+
self.logger.debug(TrackPackageIdentifier)
63+
self.TrackPackageIdentifier = TrackPackageIdentifier
64+
65+
def _assemble_and_send_request(self):
66+
"""
67+
Fires off the Fedex request.
68+
69+
@warning: NEVER CALL THIS METHOD DIRECTLY. CALL send_request(), WHICH RESIDES
70+
ON FedexBaseService AND IS INHERITED.
71+
"""
72+
self.__set_track_package_identifier()
73+
client = self.client
74+
# Fire off the query.
75+
response = client.service.track(WebAuthenticationDetail=self.WebAuthenticationDetail,
76+
ClientDetail=self.ClientDetail,
77+
TransactionDetail=self.TransactionDetail,
78+
Version=self.VersionId,
79+
CarrierCodeType=self.CarrierCodeType,
80+
PackageIdentifier=self.TrackPackageIdentifier)
81+
82+
return response

test_runner.py

100644100755
Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,12 @@
44
this before any release and after patch submissions.
55
"""
66
import unittest
7-
from tests import t_ship_service
7+
from tests import t_track_service
88

99
# A list of the modules under the tests package that should be ran.
10-
test_modules = [t_ship_service]
10+
test_modules = [t_track_service]
1111

1212
# Fire off all of the tests.
1313
for mod in test_modules:
1414
suite = unittest.TestLoader().loadTestsFromModule(mod)
15-
unittest.TextTestRunner(verbosity=2).run(suite)
15+
unittest.TextTestRunner(verbosity=3).run(suite)
Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,13 @@
22
Test module for the Fedex ShipService WSDL.
33
"""
44
import unittest
5-
from fedex.services.ship_service import FedexTrackRequest
5+
from fedex.services.track_service import FedexTrackRequest
66
import common
77

88
# Common global config object for testing.
99
CONFIG_OBJ = common.get_test_config()
1010

11-
class ShipServiceTests(unittest.TestCase):
11+
class TrackServiceTests(unittest.TestCase):
1212
"""
1313
These tests verify that the shipping service WSDL is in good shape.
1414
"""
@@ -19,7 +19,7 @@ def test_track(self):
1919
"""
2020
track_request = FedexTrackRequest(CONFIG_OBJ, '1777768882')
2121
track_request.send_request()
22-
22+
2323
for match in track_request.response.TrackDetails:
2424
# This should be the same tracking number on the response that we
2525
# asked for in the request.

0 commit comments

Comments
 (0)