Skip to content
This repository was archived by the owner on Nov 6, 2025. It is now read-only.

Commit 8ff0562

Browse files
committed
Update docstring and add missing endpoints
1 parent 7098dbb commit 8ff0562

1 file changed

Lines changed: 68 additions & 32 deletions

File tree

postnl_api/postnl_api.py

Lines changed: 68 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
1-
"""
2-
Python wrapper for the PostNL API
3-
"""
1+
""" Python wrapper for the PostNL API """
42

53
import logging
64
from datetime import datetime
@@ -16,12 +14,10 @@
1614
LETTERS_URL = BASE_URL + '/mobile/api/letters'
1715

1816
class PostNL_API(object):
19-
20-
"""
21-
Interface class for the PostNL API
22-
"""
17+
""" Interface class for the PostNL API """
2318

2419
def __init__(self, user, password):
20+
""" Constructor """
2521

2622
self._user = user
2723
self._password = password
@@ -39,19 +35,26 @@ def __init__(self, user, password):
3935
'content-type': "application/x-www-form-urlencoded",
4036
}
4137

42-
response = requests.request(
43-
'POST', AUTHENTICATE_URL, data=payload, headers=headers)
38+
try:
39+
response = requests.request(
40+
'POST', AUTHENTICATE_URL, data=payload, headers=headers)
4441

45-
data = response.json()
42+
data = response.json()
43+
44+
except Exception:
45+
_LOGGER.exception('Credentials are wrong')
46+
# return False
47+
48+
# if response['error']:
49+
# raise Exception(response['error']['error_description'])
4650

4751
self._access_token = data['access_token']
4852
self._refresh_token = data['refresh_token']
49-
self._token_expires_in = data['expires_in'] # TODO Add logic to refresh on invalidate
53+
# TODO Add logic to refresh on invalidate
54+
self._token_expires_in = data['expires_in']
5055

51-
"""
52-
Refresh access_token
53-
"""
5456
def refresh_token(self):
57+
""" Refresh access_token """
5558

5659
payload = {
5760
'grant_type': 'refresh_token',
@@ -72,10 +75,8 @@ def refresh_token(self):
7275

7376
self._access_token = data['access_token']
7477

75-
"""
76-
Retrieve shipments
77-
"""
7878
def get_shipments(self):
79+
""" Retrieve shipments """
7980

8081
headers = {
8182
'api-version': '4.6',
@@ -94,10 +95,28 @@ def get_shipments(self):
9495

9596
return shipments
9697

97-
"""
98-
Retrieve profile
99-
"""
98+
def get_shipment(self, shipment_id):
99+
""" Retrieve single shipment by id """
100+
101+
headers = {
102+
'api-version': '4.6',
103+
'user-agent': 'PostNL/1 CFNetwork/889.3 Darwin/17.2.0',
104+
'authorization': 'Bearer ' + self._access_token
105+
}
106+
107+
response = requests.request(
108+
'GET', SHIPMENTS_URL + '/' + shipment_id, headers=headers)
109+
110+
if response.status_code == 401:
111+
self.refresh_token()
112+
shipments = self.get_shipment(shipment_id)
113+
else:
114+
shipments = response.json()
115+
116+
return shipments
117+
100118
def get_profile(self):
119+
""" Retrieve profile """
101120

102121
headers = {
103122
'api-version': '4.6',
@@ -116,10 +135,8 @@ def get_profile(self):
116135

117136
return profile
118137

119-
"""
120-
Retrieve letters
121-
"""
122138
def get_letters(self):
139+
""" Retrieve letters """
123140

124141
headers = {
125142
'api-version': '4.6',
@@ -136,16 +153,35 @@ def get_letters(self):
136153
else:
137154
letters = response.json()
138155

139-
if letters['type'] == 'ProfileValidationFeatureMissing':
140-
_LOGGER.error(letters['message'])
141-
return []
156+
# TODO Add validation / exception handling
157+
# if letters['type'] == 'ProfileValidationFeatureMissing':
158+
# _LOGGER.error(letters['message'])
159+
# return []
142160

143161
return letters
144162

145-
"""
146-
Retrieve relevant shipments
147-
"""
163+
def get_letter(self, letter_id):
164+
""" Retrieve single letter by id """
165+
166+
headers = {
167+
'api-version': '4.6',
168+
'user-agent': 'PostNL/1 CFNetwork/889.3 Darwin/17.2.0',
169+
'authorization': 'Bearer ' + self._access_token
170+
}
171+
172+
response = requests.request(
173+
'GET', LETTERS_URL + '/' + letter_id, headers=headers)
174+
175+
if response.status_code == 401:
176+
self.refresh_token()
177+
letter = self.get_letter(letter_id)
178+
else:
179+
letter = response.json()
180+
181+
return letter
182+
148183
def get_relevant_shipments(self):
184+
""" Retrieve not delivered shipments and shipments delivered today """
149185

150186
shipments = self.get_shipments()
151187
relevant_shipments = []
@@ -159,10 +195,10 @@ def get_relevant_shipments(self):
159195

160196
# Check if package has been delivered today
161197
if shipment['status']['delivery']:
162-
delivery_date = datetime.strptime( shipment['status']['delivery']['deliveryDate'][:19], "%Y-%m-%dT%H:%M:%S" )
198+
delivery_date = datetime.strptime(
199+
shipment['status']['delivery']['deliveryDate'][:19], "%Y-%m-%dT%H:%M:%S")
163200

164201
if delivery_date.date() == datetime.today().date():
165202
relevant_shipments.append(shipment)
166-
continue
167203

168-
return relevant_shipments
204+
return relevant_shipments

0 commit comments

Comments
 (0)