@@ -123,7 +123,7 @@ def validate_webhook_signature(self, request_body, signature, verifier_token=Non
123123 def get_current_user (self ):
124124 """Get data from the current user endpoint"""
125125 url = self .current_user_url
126- result = self .make_request ( "GET" , url )
126+ result = self .get ( url )
127127 return result
128128
129129 def get_report (self , report_type , qs = None ):
@@ -132,7 +132,7 @@ def get_report(self, report_type, qs=None):
132132 qs = {}
133133
134134 url = self .api_url + "/company/{0}/reports/{1}" .format (self .company_id , report_type )
135- result = self .make_request ( "GET" , url , params = qs )
135+ result = self .get ( url , params = qs )
136136 return result
137137
138138 # TODO: is disconnect url the same for OAuth 1 and OAuth 2?
@@ -142,15 +142,15 @@ def disconnect_account(self):
142142 :return:
143143 """
144144 url = self .disconnect_url
145- result = self .make_request ( "GET" , url )
145+ result = self .get ( url )
146146 return result
147147
148148 def change_data_capture (self , entity_string , changed_since ):
149- url = self . api_url + " /company/{0 }/cdc" .format (self .company_id )
149+ url = "{0} /company/{1 }/cdc" .format (self . api_url , self .company_id )
150150
151151 params = {"entities" : entity_string , "changedSince" : changed_since }
152152
153- result = self .make_request ( "GET" , url , params = params )
153+ result = self .get ( url , params = params )
154154 return result
155155
156156 # TODO: is reconnect url the same for OAuth 1 and OAuth 2?
@@ -160,7 +160,7 @@ def reconnect_account(self):
160160 :return:
161161 """
162162 url = self .reconnect_url
163- result = self .make_request ( "GET" , url )
163+ result = self .get ( url )
164164 return result
165165
166166 def make_request (self , request_type , url , request_body = None , content_type = 'application/json' ,
@@ -236,6 +236,12 @@ def make_request(self, request_type, url, request_body=None, content_type='appli
236236 else :
237237 return result
238238
239+ def get (self , * args , ** kwargs ):
240+ return self .make_request ("GET" , * args , ** kwargs )
241+
242+ def post (self , * args , ** kwargs ):
243+ return self .make_request ("POST" , * args , ** kwargs )
244+
239245 def process_request (self , request_type , url , headers = "" , params = "" , data = "" ):
240246 if self .session_manager is None :
241247 raise QuickbooksException ('No session manager' )
@@ -251,8 +257,8 @@ def process_request(self, request_type, url, headers="", params="", data=""):
251257 headers = headers , params = params , data = data )
252258
253259 def get_single_object (self , qbbo , pk ):
254- url = self . api_url + "/company/ {0}/{1}/{2}/" .format (self .company_id , qbbo .lower (), pk )
255- result = self .make_request ( "GET" , url , {})
260+ url = " {0}/company/ {1}/{2}/{3}/ " .format (self . api_url , self .company_id , qbbo .lower (), pk )
261+ result = self .get ( url , {})
256262
257263 return result
258264
@@ -278,14 +284,14 @@ def handle_exceptions(self, results):
278284 def create_object (self , qbbo , request_body , _file_path = None ):
279285 self .isvalid_object_name (qbbo )
280286
281- url = self . api_url + " /company/{0 }/{1 }" .format (self .company_id , qbbo .lower ())
282- results = self .make_request ( "POST" , url , request_body , file_path = _file_path )
287+ url = "{0} /company/{1 }/{2 }" .format (self . api_url , self .company_id , qbbo .lower ())
288+ results = self .post ( url , request_body , file_path = _file_path )
283289
284290 return results
285291
286292 def query (self , select ):
287- url = self . api_url + " /company/{0 }/query" .format (self .company_id )
288- result = self .make_request ( "POST" , url , select , content_type = 'application/text' )
293+ url = "{0} /company/{1 }/query" .format (self . api_url , self .company_id )
294+ result = self .post ( url , select , content_type = 'application/text' )
289295
290296 return result
291297
@@ -296,35 +302,35 @@ def isvalid_object_name(self, object_name):
296302 return True
297303
298304 def update_object (self , qbbo , request_body , _file_path = None ):
299- url = self . api_url + " /company/{0 }/{1 }" .format (self .company_id , qbbo .lower ())
300- result = self .make_request ( "POST" , url , request_body , file_path = _file_path )
305+ url = "{0} /company/{1 }/{2 }" .format (self .api_url , self . company_id , qbbo .lower ())
306+ result = self .post ( url , request_body , file_path = _file_path )
301307
302308 return result
303309
304310 def delete_object (self , qbbo , request_body , _file_path = None ):
305- url = self . api_url + " /company/{0 }/{1 }" .format (self .company_id , qbbo .lower ())
306- result = self .make_request ( "POST" , url , request_body , params = {'operation' : 'delete' }, file_path = _file_path )
311+ url = "{0} /company/{1 }/{2 }" .format (self . api_url , self .company_id , qbbo .lower ())
312+ result = self .post ( url , request_body , params = {'operation' : 'delete' }, file_path = _file_path )
307313
308314 return result
309315
310316 def batch_operation (self , request_body ):
311- url = self . api_url + " /company/{0 }/batch" .format (self .company_id )
312- results = self .make_request ( "POST" , url , request_body )
317+ url = "{0} /company/{1 }/batch" .format (self . api_url , self .company_id )
318+ results = self .post ( url , request_body )
313319
314320 return results
315321
316322 def misc_operation (self , end_point , request_body ):
317- url = self . api_url + " /company/{0 }/{1 }" .format (self .company_id , end_point )
318- results = self .make_request ( "POST" , url , request_body )
323+ url = "{0} /company/{1 }/{2 }" .format (self . api_url , self .company_id , end_point )
324+ results = self .post ( url , request_body )
319325
320326 return results
321327
322328 def download_pdf (self , qbbo , item_id ):
323329 if self .session_manager is None :
324330 raise QuickbooksException ('No session manager' )
325331
326- url = self . api_url + "/company/ {0}/{1}/{2}/pdf" .format (
327- self .company_id , qbbo .lower (), item_id )
332+ url = " {0}/company/ {1}/{2}/{3 }/pdf" .format (
333+ self .api_url , self . company_id , qbbo .lower (), item_id )
328334
329335 headers = {
330336 'Content-Type' : 'application/pdf' ,
@@ -335,6 +341,11 @@ def download_pdf(self, qbbo, item_id):
335341 response = self .process_request ("GET" , url , headers = headers )
336342
337343 if response .status_code != httplib .OK :
344+
345+ if response .status_code == httplib .UNAUTHORIZED :
346+ # Note that auth errors have different result structure which can't be parsed by handle_exceptions()
347+ raise AuthorizationException ("Application authentication failed" , detail = response .text )
348+
338349 try :
339350 result = response .json ()
340351 except :
0 commit comments