Skip to content

Commit 8622f65

Browse files
committed
Add support for fulfilling an order
1 parent 2afce06 commit 8622f65

File tree

2 files changed

+72
-3
lines changed

2 files changed

+72
-3
lines changed

squarespace.py

Lines changed: 46 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
import logging
2+
from time import strftime, gmtime
3+
24
import requests
35

46

@@ -21,10 +23,11 @@ class Squarespace(object):
2123
The version of the Squarespace API to target. If you change this
2224
without making any code changes you may break this library.
2325
"""
24-
def __init__(self, api_key, api_baseurl=api_baseurl, api_version=api_version):
26+
def __init__(self, api_key, api_baseurl=api_baseurl, api_version=api_version, tracking_baseurl='https://tools.usps.com/go/TrackConfirmAction?tLabels='):
2527
self.api_key = api_key
2628
self.api_baseurl = api_baseurl
2729
self.api_version = api_version
30+
self.tracking_baseurl = tracking_baseurl
2831

2932
# Setup our HTTP session
3033
self.http = requests.Session()
@@ -48,6 +51,16 @@ def useragent(self, agent_string):
4851
self._useragent = agent_string
4952
self.http.headers.update({'User-Agent': self._useragent})
5053

54+
def post(self, path, object):
55+
"""Post an `object` to the Squarespace API.
56+
57+
:object:
58+
A dictionary containing JSON compatible key/value combinations.
59+
"""
60+
url = '%s/%s/%s' % (self.api_baseurl, self.api_version, path)
61+
logging.debug('url:%s object:%s', url, object)
62+
return self.process_request(self.http.post(url, json=object))
63+
5164
def get(self, path, args=None):
5265
"""Retrieve an endpoint from the Squarespace API.
5366
"""
@@ -56,8 +69,11 @@ def get(self, path, args=None):
5669

5770
url = '%s/%s/%s' % (self.api_baseurl, self.api_version, path)
5871
logging.debug('url:%s args:%s', url, args)
59-
request = self.http.get(url, params=args)
72+
return self.process_request(self.http.get(url, params=args))
6073

74+
def process_request(self, request):
75+
"""Process a request and return the data.
76+
"""
6177
if request.status_code in [200, 201]:
6278
return request.json()
6379
elif request.status_code == 204:
@@ -113,3 +129,31 @@ def all_orders(self):
113129

114130
return orders
115131

132+
def fulfill(self, order_id, tracking_number, carrier_name, service_name, tracking_baseurl=None):
133+
"""Mark an order as shipped.
134+
135+
:param tracking_number:
136+
The shipping carrier's tracking number.
137+
:param carrier_name:
138+
The name of the shipping carrier, EG 'USPS'.
139+
:param service_name:
140+
The shipping service used, EG "First Class Package"
141+
"""
142+
if not tracking_baseurl:
143+
tracking_baseurl = self.tracking_baseurl
144+
145+
uri = 'orders/%s/fulfillments' % order_id
146+
fulfillment = {
147+
"shouldSendNotification": True,
148+
"shipments": [
149+
{
150+
'shipDate': strftime('%Y-%m-%dT%H:%M:%SZ', gmtime()),
151+
"carrierName": carrier_name,
152+
"service": service_name,
153+
"trackingNumber": tracking_number,
154+
"trackingUrl": tracking_baseurl + tracking_number
155+
}
156+
]
157+
}
158+
159+
return self.post(uri, fulfillment)

test_squarespace_api.py

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,34 @@ def test_squarespace_api_pagination():
3131

3232
store = Squarespace(api_key)
3333
orders = store.orders()
34-
assert len(orders) == 20
34+
assert len(orders) == 50
3535
next = store.next_page()
3636
assert len(next) > 0
3737
assert orders[0]['id'] != orders[1]['id']
3838
return True
3939

40+
def test_squarespace_api_fulfillment():
41+
"""Test fulfillment. This requires both an `api_key` and an `order_info`
42+
file.
43+
44+
`api_key`:
45+
A file containing only the squarespace API key.
46+
47+
`order_info`:
48+
A file containing a single line consisting of:
49+
`order_id`,`tracking_number`
50+
"""
51+
open_order = open('order_info').read().strip() if exists('order_info') else None
52+
53+
if not api_key:
54+
logging.warning('Missing "api_key" file.')
55+
return True
56+
57+
if not open_order:
58+
logging.warning('Missing "order_info" file.')
59+
return True
60+
61+
order_id, tracking_number = open_order.split(',', 2)
62+
63+
store = Squarespace(api_key)
64+
return store.fulfill(order_id, tracking_number, 'USPS', 'First Class')

0 commit comments

Comments
 (0)