55 import httplib
66 from urlparse import parse_qsl
77
8- from .exceptions import QuickbooksException , SevereException
8+ from .exceptions import QuickbooksException , SevereException , AuthorizationException
99
1010try :
1111 from rauth import OAuth1Session , OAuth1Service
@@ -52,41 +52,64 @@ class QuickBooks(object):
5252 ]
5353
5454 __instance = None
55+ __use_global = True
5556
5657 def __new__ (cls , ** kwargs ):
57- if QuickBooks .__instance is None :
58- QuickBooks .__instance = object .__new__ (cls )
58+ """
59+ If global is disabled, don't set global client instance.
60+ """
61+ if QuickBooks .__use_global :
62+ if QuickBooks .__instance is None :
63+ QuickBooks .__instance = object .__new__ (cls )
64+ instance = QuickBooks .__instance
65+ else :
66+ instance = object .__new__ (cls )
5967
6068 if 'consumer_key' in kwargs :
61- cls .consumer_key = kwargs ['consumer_key' ]
69+ instance .consumer_key = kwargs ['consumer_key' ]
6270
6371 if 'consumer_secret' in kwargs :
64- cls .consumer_secret = kwargs ['consumer_secret' ]
72+ instance .consumer_secret = kwargs ['consumer_secret' ]
6573
6674 if 'access_token' in kwargs :
67- cls .access_token = kwargs ['access_token' ]
75+ instance .access_token = kwargs ['access_token' ]
6876
6977 if 'access_token_secret' in kwargs :
70- cls .access_token_secret = kwargs ['access_token_secret' ]
78+ instance .access_token_secret = kwargs ['access_token_secret' ]
7179
7280 if 'company_id' in kwargs :
73- cls .company_id = kwargs ['company_id' ]
81+ instance .company_id = kwargs ['company_id' ]
7482
7583 if 'callback_url' in kwargs :
76- cls .callback_url = kwargs ['callback_url' ]
84+ instance .callback_url = kwargs ['callback_url' ]
7785
7886 if 'sandbox' in kwargs :
79- cls .sandbox = kwargs ['sandbox' ]
87+ instance .sandbox = kwargs ['sandbox' ]
8088
8189 if 'minorversion' in kwargs :
82- cls .minorversion = kwargs ['minorversion' ]
90+ instance .minorversion = kwargs ['minorversion' ]
8391
84- return QuickBooks . __instance
92+ return instance
8593
8694 @classmethod
8795 def get_instance (cls ):
8896 return cls .__instance
8997
98+ @classmethod
99+ def disable_global (cls ):
100+ """
101+ Disable use of singleton pattern.
102+ """
103+ QuickBooks .__use_global = False
104+ QuickBooks .__instance = None
105+
106+ @classmethod
107+ def enable_global (cls ):
108+ """
109+ Allow use of singleton pattern.
110+ """
111+ QuickBooks .__use_global = True
112+
90113 def _drop (self ):
91114 QuickBooks .__instance = None
92115
@@ -157,7 +180,6 @@ def get_access_tokens(self, oauth_verifier):
157180 return session
158181
159182 def make_request (self , request_type , url , request_body = None , content_type = 'application/json' ):
160-
161183 params = {}
162184
163185 if self .minorversion :
@@ -175,14 +197,19 @@ def make_request(self, request_type, url, request_body=None, content_type='appli
175197 }
176198
177199 req = self .session .request (request_type , url , True , self .company_id , headers = headers , params = params , data = request_body )
200+ if req .status_code == httplib .UNAUTHORIZED :
201+ raise AuthorizationException ("Application authentication failed" , detail = req .text )
178202
179203 try :
180204 result = req .json ()
181205 except :
182206 raise QuickbooksException ("Error reading json response: {0}" .format (req .text ), 10000 )
183207
184- if req . status_code is not httplib . OK or "Fault" in result :
208+ if "Fault" in result :
185209 self .handle_exceptions (result ["Fault" ])
210+ elif not req .status_code == httplib .OK :
211+ raise QuickbooksException ("Error returned with status code '{0}': {1}" .format (
212+ req .status_code , req .text ), 10000 )
186213 else :
187214 return result
188215
0 commit comments