Skip to content

Commit add87c7

Browse files
authored
Merge pull request #44 from EasyPost/reports-python
first attempt client lib python for reports
2 parents 0a18470 + bebed27 commit add87c7

File tree

3 files changed

+155
-3
lines changed

3 files changed

+155
-3
lines changed

easypost/__init__.py

Lines changed: 64 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,11 @@ def convert_to_easypost_object(response, api_key, parent=None, name=None):
7777
'PickupRate': PickupRate,
7878
'PostageLabel': PostageLabel,
7979
'CarrierAccount': CarrierAccount,
80-
'User': User
80+
'User': User,
81+
'Report': Report,
82+
'ShipmentReport': Report,
83+
'PaymentLogReport': Report,
84+
'TrackerReport': Report
8185
}
8286

8387
prefixes = {
@@ -98,7 +102,10 @@ def convert_to_easypost_object(response, api_key, parent=None, name=None):
98102
'pickuprate': PickupRate,
99103
'pl': PostageLabel,
100104
'ca': CarrierAccount,
101-
'user': User
105+
'user': User,
106+
'shprep': Report,
107+
'plrep': Report,
108+
'trkrep': Report
102109
}
103110

104111
if isinstance(response, list):
@@ -453,7 +460,7 @@ def __repr__(self):
453460

454461
def __str__(self):
455462
return self.to_json(indent=2)
456-
463+
457464
def to_json(self, indent=None):
458465
return json.dumps(self.to_dict(), sort_keys=True, indent=indent, cls=EasyPostObjectEncoder)
459466

@@ -644,9 +651,11 @@ def verify(self, carrier=None):
644651
class ScanForm(AllResource, CreateResource):
645652
pass
646653

654+
647655
class Insurance(AllResource, CreateResource):
648656
pass
649657

658+
650659
class CustomsItem(AllResource, CreateResource):
651660
pass
652661

@@ -903,6 +912,58 @@ def api_keys(self):
903912
return my_api_keys
904913

905914

915+
class Report(AllResource, CreateResource):
916+
917+
REPORT_TYPES = {'shprep': 'shipment', 'plrep': 'payment_log', 'trkrep': 'tracker'}
918+
919+
@classmethod
920+
def create(cls, api_key=None, **params):
921+
requestor = Requestor(api_key)
922+
url = cls.class_url()
923+
wrapped_params = {cls.class_name(): params}
924+
925+
if str(params['type']) in cls.REPORT_TYPES.values():
926+
url += "/%s" % params['type']
927+
else:
928+
raise Exception("Undertermined Report Type")
929+
930+
response, api_key = requestor.request('post', url, wrapped_params, False)
931+
return convert_to_easypost_object(response, api_key)
932+
933+
@classmethod
934+
def retrieve(cls, easypost_id="", api_key=None, **params):
935+
try:
936+
easypost_id = easypost_id['id']
937+
except (KeyError, TypeError):
938+
pass
939+
940+
url = cls.class_url()
941+
942+
obj_id = easypost_id.split("_")[0]
943+
944+
if obj_id in cls.REPORT_TYPES:
945+
url += "/%s/%s" % (cls.REPORT_TYPES[obj_id], easypost_id)
946+
else:
947+
raise Exception("Undetermined Report Type")
948+
949+
requestor = Requestor(api_key)
950+
response, api_key = requestor.request('get', url)
951+
return convert_to_easypost_object(response, api_key)
952+
953+
@classmethod
954+
def all(cls, api_key=None, **params):
955+
requestor = Requestor(api_key)
956+
url = cls.class_url()
957+
958+
if str(params['type']) in cls.REPORT_TYPES.values():
959+
url += "/%s" % params['type']
960+
else:
961+
raise Exception("Undertemined Report Type")
962+
963+
response, api_key = requestor.request('get', url, params)
964+
return convert_to_easypost_object(response, api_key)
965+
966+
906967
class Blob(AllResource, CreateResource):
907968
@classmethod
908969
def retrieve(cls, easypost_id, api_key=None, **params):

examples/report.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import easypost
2+
easypost.api_key = 'cueqNZUb3ldeWTNX7MU3Mel8UXtaAMUi'
3+
4+
report = easypost.Report.create(
5+
start_date="2012-12-01",
6+
end_date="2013-01-01",
7+
type="shipment"
8+
)
9+
print(report.id)
10+
11+
report1 = easypost.Report.retrieve(report.id)
12+
13+
print(report1.id)
14+
15+
report2 = easypost.Report.create(
16+
start_date="2013-12-02",
17+
end_date="2014-01-01",
18+
type="shipment"
19+
)
20+
21+
reports3 = easypost.Report.all(type="shipment")
22+
23+
print(reports3)

tests/report.py

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
import unittest
2+
import easypost
3+
from constants import API_KEY as api_key
4+
5+
easypost.api_key = api_key
6+
7+
8+
class ReportTests(unittest.TestCase):
9+
10+
def test_shipment_report(self):
11+
report = easypost.Report.create(
12+
start_date="2012-12-01",
13+
end_date="2013-01-01",
14+
type="shipment"
15+
)
16+
17+
assert report.object == "ShipmentReport"
18+
assert report.status == "available"
19+
assert report.__class__ == easypost.Report
20+
21+
report2 = easypost.Report.retrieve(report.id, api_key=api_key)
22+
23+
assert report2.__class__ == easypost.Report
24+
assert report2.id == report.id
25+
26+
reports = easypost.Report.all(api_key=api_key, type="shipment")
27+
assert len(reports["reports"])
28+
assert reports["reports"][0].id == report.id == report2.id
29+
30+
def test_payment_log_report(self):
31+
report = easypost.Report.create(
32+
start_date="2012-12-01",
33+
end_date="2013-01-01",
34+
type="payment_log"
35+
)
36+
37+
assert report.object == "PaymentLogReport"
38+
assert report.status == "available"
39+
assert report.__class__ == easypost.Report
40+
41+
report2 = easypost.Report.retrieve(report.id, api_key=api_key)
42+
43+
assert report2.__class__ == easypost.Report
44+
assert report2.id == report.id
45+
46+
reports = easypost.Report.all(api_key=api_key, type="payment_log")
47+
assert len(reports["reports"])
48+
assert reports["reports"][0].id == report.id == report2.id
49+
50+
def test_tracker_report(self):
51+
report = easypost.Report.create(
52+
start_date="2012-12-01",
53+
end_date="2013-01-01",
54+
type="tracker"
55+
)
56+
57+
assert report.object == "TrackerReport"
58+
# assert report.status == "available" # Not yet implemented for tracker reports
59+
assert report.__class__ == easypost.Report
60+
61+
report2 = easypost.Report.retrieve(report.id, api_key=api_key)
62+
63+
assert report2.__class__ == easypost.Report
64+
assert report2.id == report.id
65+
66+
reports = easypost.Report.all(api_key=api_key, type="tracker")
67+
assert len(reports["reports"])
68+
assert reports["reports"][0].id == report.id == report2.id

0 commit comments

Comments
 (0)