Skip to content

Commit b5559fd

Browse files
committed
add doc helper method, response work, modify error functions to work with new DOM object
1 parent 06cc6b5 commit b5559fd

8 files changed

Lines changed: 155 additions & 59 deletions

File tree

ebaysdk/connection.py

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,9 @@
99
from ebaysdk import log
1010

1111
import re
12-
import json
1312
import time
1413
import uuid
14+
import webbrowser
1515

1616
from requests import Request, Session
1717
from requests.adapters import HTTPAdapter
@@ -85,6 +85,7 @@ def _reset(self):
8585
self.verb = None
8686
self._list_nodes = []
8787
self._request_id = None
88+
self._request_dict = {}
8889
self._time = time.time()
8990
self._response_content = None
9091
self._response_dom = None
@@ -128,6 +129,7 @@ def execute(self, verb, data=None, list_nodes=[]):
128129
def build_request(self, verb, data):
129130

130131
self.verb = verb
132+
self._request_dict = data
131133
self._request_id = uuid.uuid4()
132134

133135
url = "%s://%s%s" % (
@@ -221,12 +223,14 @@ def response_soup(self):
221223
return self._response_soup
222224

223225
def response_obj(self):
226+
log.warn('response_obj() DEPRECATED, use response.reply instead')
224227
return self.response.reply
225228

226229
def response_dom(self):
227230
""" Deprecated: use self.response.dom() instead
228231
Returns the response DOM (xml.dom.minidom).
229232
"""
233+
log.warn('response_dom() DEPRECATED, use response.dom instead')
230234

231235
if not self._response_dom:
232236
dom = None
@@ -252,13 +256,15 @@ def response_dom(self):
252256

253257
def response_dict(self):
254258
"Returns the response dictionary."
259+
log.warn('response_dict() DEPRECATED, use response.dict() or response.reply instead')
255260

256261
return self.response.reply
257262

258263
def response_json(self):
259264
"Returns the response JSON."
265+
log.warn('response_json() DEPRECATED, use response.json() instead')
260266

261-
return json.dumps(self.response.dict())
267+
return self.response.json()
262268

263269
def _get_resp_body_errors(self):
264270
"""Parses the response content to pull errors.
@@ -277,7 +283,7 @@ def _get_resp_body_errors(self):
277283
if self.verb is None:
278284
return errors
279285

280-
dom = self.response_dom()
286+
dom = self.response.dom()
281287
if dom is None:
282288
return errors
283289

@@ -298,3 +304,7 @@ def error(self):
298304
return error_string
299305

300306
return None
307+
308+
def opendoc(self):
309+
webbrowser.open(self.config.get('doc_url'))
310+

ebaysdk/exception.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,3 +11,9 @@ class ConnectionError(Exception):
1111

1212
class ConnectionResponseError(Exception):
1313
pass
14+
15+
class RequestPaginationError(Exception):
16+
pass
17+
18+
class PaginationLimit(Exception):
19+
pass

ebaysdk/finding/__init__.py

Lines changed: 40 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,9 @@
1010

1111
from ebaysdk import log
1212
from ebaysdk.connection import BaseConnection
13+
from ebaysdk.exception import RequestPaginationError, PaginationLimit
1314
from ebaysdk.config import Config
14-
from ebaysdk.utils import getNodeText, dict2xml
15+
from ebaysdk.utils import dict2xml
1516

1617
class Connection(BaseConnection):
1718
"""Connection class for the Finding service
@@ -85,6 +86,7 @@ def __init__(self, **kwargs):
8586
self.config.set('version', '1.12.0')
8687
self.config.set('compatibility', '1.0.0')
8788
self.config.set('service', 'FindingService')
89+
self.config.set('doc_url', 'http://developer.ebay.com/DevZone/finding/CallRef/index.html')
8890

8991
self.datetime_nodes = ['starttimefrom', 'timestamp', 'starttime',
9092
'endtime']
@@ -231,19 +233,27 @@ def _get_resp_body_errors(self):
231233
eMsg = None
232234
eId = None
233235

234-
if e.getElementsByTagName('severity'):
235-
eSeverity = getNodeText(e.getElementsByTagName('severity')[0])
236+
try:
237+
eSeverity = e.findall('severity')[0].text
238+
except IndexError:
239+
pass
236240

237-
if e.getElementsByTagName('domain'):
238-
eDomain = getNodeText(e.getElementsByTagName('domain')[0])
241+
try:
242+
eDomain = e.findall('domain')[0].text
243+
except IndexError:
244+
pass
239245

240-
if e.getElementsByTagName('errorId'):
241-
eId = getNodeText(e.getElementsByTagName('errorId')[0])
246+
try:
247+
eId = e.findall('errorId')[0].text
242248
if int(eId) not in resp_codes:
243249
resp_codes.append(int(eId))
250+
except IndexError:
251+
pass
244252

245-
if e.getElementsByTagName('message'):
246-
eMsg = getNodeText(e.getElementsByTagName('message')[0])
253+
try:
254+
eMsg = e.findall('message')[0].text
255+
except IndexError:
256+
pass
247257

248258
msg = "Domain: %s, Severity: %s, errorId: %s, %s" \
249259
% (eDomain, eSeverity, eId, eMsg)
@@ -261,7 +271,7 @@ def _get_resp_body_errors(self):
261271
log.warn("%s: %s\n\n" % (self.verb, "\n".join(warnings)))
262272

263273
try:
264-
if self.response_dict().ack == 'Success' and len(errors) > 0 and self.config.get('errors'):
274+
if self.response.reply.ack == 'Success' and len(errors) > 0 and self.config.get('errors'):
265275
log.error("%s: %s\n\n" % (self.verb, "\n".join(errors)))
266276
elif len(errors) > 0:
267277
if self.config.get('errors'):
@@ -271,3 +281,23 @@ def _get_resp_body_errors(self):
271281
pass
272282

273283
return []
284+
285+
def next_page(self):
286+
if type(self._request_dict) is not dict:
287+
raise RequestPaginationError("request data is not of type dict")
288+
289+
epp = self._request_dict.get('paginationInput', {}).get('enteriesPerPage', None)
290+
num = int(self.response.reply.paginationOutput.pageNumber)
291+
292+
if num >= int(self.response.reply.paginationOutput.totalPages):
293+
raise PaginationLimit("no more pages to process")
294+
return None
295+
296+
self._request_dict['paginationInput'] = {}
297+
298+
if epp:
299+
self._request_dict['paginationInput']['enteriesPerPage'] = epp
300+
301+
self._request_dict['paginationInput']['pageNumber'] = int(num) + 1
302+
303+
self.execute(self.verb, self._request_dict)

ebaysdk/merchandising/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ def __init__(self, **kwargs):
5757

5858
self.config.set('uri', '/MerchandisingService', force=True)
5959
self.config.set('service', 'MerchandisingService', force=True)
60+
self.config.set('doc_url', 'http://developer.ebay.com/Devzone/merchandising/docs/CallRef/index.html')
6061

6162
self.datetime_nodes = ['endtimeto', 'endtimefrom', 'timestamp']
6263
self.base_list_nodes = [

ebaysdk/response.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,11 @@ def __init__(self, obj, verb=None, list_nodes=[], datetime_nodes=[]):
132132
self._dom = self._parse_xml(obj.content)
133133
self._dict = self._etree_to_dict(self._dom)
134134

135-
if verb:
135+
if verb and 'Envelope' in self._dict.keys():
136+
self._dom = self._dom.find('Body').find('%sResponse' % verb)
137+
self._dict = self._dict['Envelope']['Body'].get('%sResponse' % verb, self._dict)
138+
elif verb:
139+
self._dom = self._dom.find('%sResponse' % verb)
136140
self._dict = self._dict.get('%sResponse' % verb, self._dict)
137141

138142
self.reply = ResponseDataObject(self._dict,

ebaysdk/shopping/__init__.py

Lines changed: 32 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@ def __init__(self, **kwargs):
8181
self.config.set('version', '799')
8282
self.config.set('trackingid', None)
8383
self.config.set('trackingpartnercode', None)
84+
self.config.set('doc_url', 'http://developer.ebay.com/DevZone/Shopping/docs/CallRef/index.html')
8485

8586
if self.config.get('https') and self.debug:
8687
print("HTTPS is not supported on the Shopping API.")
@@ -184,36 +185,51 @@ def _get_resp_body_errors(self):
184185
if self.verb is None:
185186
return errors
186187

187-
dom = self.response_dom()
188+
dom = self.response.dom()
188189
if dom is None:
189190
return errors
190191

191-
for e in dom.getElementsByTagName("Errors"):
192+
for e in dom.findall('Errors'):
192193
eSeverity = None
193194
eClass = None
194195
eShortMsg = None
195196
eLongMsg = None
196197
eCode = None
197198

198-
if e.getElementsByTagName('SeverityCode'):
199-
eSeverity = getNodeText(e.getElementsByTagName('SeverityCode')[0])
200-
201-
if e.getElementsByTagName('ErrorClassification'):
202-
eClass = getNodeText(e.getElementsByTagName('ErrorClassification')[0])
203-
204-
if e.getElementsByTagName('ErrorCode'):
205-
eCode = float(getNodeText(e.getElementsByTagName('ErrorCode')[0]))
199+
try:
200+
eSeverity = e.findall('SeverityCode')[0].text
201+
except IndexError:
202+
pass
203+
204+
try:
205+
eClass = e.findall('ErrorClassification')[0].text
206+
except IndexError:
207+
pass
208+
209+
try:
210+
eCode = e.findall('ErrorCode')[0].text
211+
except IndexError:
212+
pass
213+
214+
try:
215+
eShortMsg = e.findall('ShortMessage')[0].text
216+
except IndexError:
217+
pass
218+
219+
try:
220+
eLongMsg = e.findall('LongMessage')[0].text
221+
except IndexError:
222+
pass
223+
224+
try:
225+
eCode = float(e.findall('ErrorCode')[0])
206226
if eCode.is_integer():
207227
eCode = int(eCode)
208228

209229
if eCode not in resp_codes:
210230
resp_codes.append(eCode)
211-
212-
if e.getElementsByTagName('ShortMessage'):
213-
eShortMsg = getNodeText(e.getElementsByTagName('ShortMessage')[0])
214-
215-
if e.getElementsByTagName('LongMessage'):
216-
eLongMsg = getNodeText(e.getElementsByTagName('LongMessage')[0])
231+
except IndexError:
232+
pass
217233

218234
msg = "Class: %s, Severity: %s, Code: %s, %s%s" \
219235
% (eClass, eSeverity, eCode, eShortMsg, eLongMsg)

ebaysdk/soa/__init__.py

Lines changed: 24 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,9 @@ def load_from_app_config(self, app_config):
5151
# It used to return None in some cases. If you get an empty dict,
5252
# you can use the .error() method to look for the cause.
5353
def response_dict(self):
54+
return self.response.dict()
55+
56+
'''
5457
if self._response_dict:
5558
return self._response_dict
5659
@@ -66,6 +69,7 @@ def response_dict(self):
6669
self._response_dict = mydict.get(self.verb + 'Response', mydict)
6770
6871
return self._response_dict
72+
'''
6973

7074
def build_request_headers(self, verb):
7175
return {
@@ -144,29 +148,38 @@ def _get_resp_body_errors(self):
144148
if self.verb is None:
145149
return errors
146150

147-
dom = self.response_dom()
151+
dom = self.response.dom()
148152
if dom is None:
149153
return errors
150154

151-
for e in dom.getElementsByTagName("error"):
155+
for e in dom.findall('error'):
156+
152157
eSeverity = None
153158
eDomain = None
154159
eMsg = None
155160
eId = None
156161

157-
if e.getElementsByTagName('severity'):
158-
eSeverity = getNodeText(e.getElementsByTagName('severity')[0])
162+
try:
163+
eSeverity = e.findall('severity')[0].text
164+
except IndexError:
165+
pass
159166

160-
if e.getElementsByTagName('domain'):
161-
eDomain = getNodeText(e.getElementsByTagName('domain')[0])
167+
try:
168+
eDomain = e.findall('domain')[0].text
169+
except IndexError:
170+
pass
162171

163-
if e.getElementsByTagName('errorId'):
164-
eId = getNodeText(e.getElementsByTagName('errorId')[0])
172+
try:
173+
eId = e.findall('errorId')[0].text
165174
if int(eId) not in resp_codes:
166175
resp_codes.append(int(eId))
176+
except IndexError:
177+
pass
167178

168-
if e.getElementsByTagName('message'):
169-
eMsg = getNodeText(e.getElementsByTagName('message')[0])
179+
try:
180+
eMsg = e.findall('message')[0].text
181+
except IndexError:
182+
pass
170183

171184
msg = "Domain: %s, Severity: %s, errorId: %s, %s" \
172185
% (eDomain, eSeverity, eId, eMsg)
@@ -184,7 +197,7 @@ def _get_resp_body_errors(self):
184197
log.warn("%s: %s\n\n" % (self.verb, "\n".join(warnings)))
185198

186199
try:
187-
if self.response_dict().ack == 'Success' and len(errors) > 0 and self.config.get('errors'):
200+
if self.response.reply.ack == 'Success' and len(errors) > 0 and self.config.get('errors'):
188201
log.error("%s: %s\n\n" % (self.verb, "\n".join(errors)))
189202
elif len(errors) > 0:
190203
if self.config.get('errors'):

0 commit comments

Comments
 (0)