def __init__(self, consumer_key, consumer_secret, connection_params=None): self.scheme = 'http' self.host = 'localhost' #self.host = 'indivo.genepartnership.org' #self.host = 'indivo-staging.informedcohort.org' #self.host = 'indivobig.genepartnership.org' #self.host = 'x-staging.indivo.org' self.port = '8000' if connection_params: if connection_params.has_key('scheme'): self.scheme = connection_params['scheme'] if connection_params.has_key('host'): self.host = connection_params['host'] if connection_params.has_key('port'): self.port = connection_params['port'] if self.scheme and self.host and self.port: self.utils_obj = IUtils(self.scheme, self.host, self.port) else: raise APIConnectorError("Scheme, host, port needed") self.api = API(self.utils_obj) self.ds = DataStore() self.ds.reset() self.ds.app_info['consumer_key'] = consumer_key self.ds.app_info['consumer_secret'] = consumer_secret self.count = 0
class APIConnector: def __init__(self, consumer_key, consumer_secret, connection_params=None): self.scheme = 'http' self.host = 'localhost' #self.host = 'indivo.genepartnership.org' #self.host = 'indivo-staging.informedcohort.org' #self.host = 'indivobig.genepartnership.org' #self.host = 'x-staging.indivo.org' self.port = '8000' if connection_params: if connection_params.has_key('scheme'): self.scheme = connection_params['scheme'] if connection_params.has_key('host'): self.host = connection_params['host'] if connection_params.has_key('port'): self.port = connection_params['port'] if self.scheme and self.host and self.port: self.utils_obj = IUtils(self.scheme, self.host, self.port) else: raise APIConnectorError("Scheme, host, port needed") self.api = API(self.utils_obj) self.ds = DataStore() self.ds.reset() self.ds.app_info['consumer_key'] = consumer_key self.ds.app_info['consumer_secret'] = consumer_secret self.count = 0 def call(self, method, url, options=None): options = options or {} data = {} oauth_token = {} parameters = {} if options.has_key(DATA): data = options[DATA] if options.has_key(PARAMETERS): parameters = options[PARAMETERS] #if options.has_key(OAUTH_TOKEN): oauth_token = options[OAUTH_TOKEN] #if options.has_key(OAUTH_TOKEN_SECRET): oauth_token_secret = options[OAUTH_TOKEN_SECRET] if self.ds.app_info: try: retval = self.utils_obj.http_conn(method, url, self.ds.app_info, parameters=parameters, data=data) except: return False if retval: if isinstance(retval, dict) and retval.has_key(CONTENT): return retval[CONTENT] else: return retval return False def _handle_response(self, response): PRD = 'prd' # SZ: Abstarct this out prd_vals = { 'Account': 'account_id', 'Document': 'document_id', 'Record': 'record_id' } for prd_name, attr in prd_vals.items(): if response \ and response.has_key(PRD) \ and isinstance(response[PRD], dict) \ and response[PRD].has_key(prd_name): id = response[PRD][prd_name] if len(id) > 0 and attr: setattr(self.ds, attr, id[0]) return True def __getattr__(self, func_name): cr = CallRes() def internal_getattr(*args, **kwargs): if hasattr(self.api, func_name): _args, _, _, _defaults = inspect.getargspec( getattr(self.api, func_name)) kw = {} count = 0 for arg in _args[1:]: if kwargs.has_key(arg): kw[arg] = kwargs[arg] elif hasattr(self.ds, arg) \ and not (getattr(self.ds, arg) is None or getattr(self.ds, arg) == ''): kw[arg] = getattr(self.ds, arg) else: kw[arg] = _defaults[_args.index(arg) - (len(_args) - len(_defaults))] count += 1 cr.response = getattr(self.api, func_name)(**kw) self._handle_response(cr.response) return cr return False return internal_getattr def __call__(self, func_name, *args, **kwargs): if hasattr(self.api, func_name): self.count += 1 kw = self._get_kwargs(func_name, args, kwargs) call_res = getattr(self.api, func_name)(**kw) return self.post_call(call_res) else: raise APIConnectorError("No such API call " + func_name) def _get_kwargs(self, func_name, args, kwargs): SELF = 'self' _kw = {} _args, _, _, _defaults = inspect.getargspec( getattr(self.api, func_name)) for arg in _args: # Get passed in kwarg if len(kwargs) > 0 and kwargs.has_key(arg): _kw[arg] = kwargs[arg] # If it is an arg it is required, therefore must be non-empty elif hasattr(self.ds, arg): if not (getattr(self.ds, arg) is None or getattr(self.ds, arg) == ''): _kw[arg] = getattr(self.ds, arg) else: raise APIConnectorError(arg + ' is missing') # Get passed in arg elif len(args) > 1 and args[1].has_key(arg): _kw[arg] = args[1][arg] # Get defaults else: _kw[arg] = _defaults[_args.index(arg) - (len(_args) - len(_defaults))] if _kw.has_key(SELF): del _kw[SELF] return _kw # SZ: Remove this from IndivoClient def post_call(self, call_res): PRD = 'prd' CONTENT = 'content' prd_vals = { 'Account': 'account_id', 'Document': 'document_id', 'Entry': None, 'Measurements': None, 'Record': 'record_id', 'Result': None } if call_res['response_content_type'] == 'text/plain': return call_res[PRD] elif call_res.has_key(PRD) and isinstance(call_res[PRD], dict): for prd_name, attr in prd_vals.items(): if call_res[PRD].has_key(prd_name): id = call_res[PRD][prd_name] if len(id) > 0: if attr: setattr(self.ds, attr, id[0]) #return getattr(self.ds, attr) #else: # return True #else: # return False #if call_res[PRD].has_key(CONTENT): # return call_res[PRD][CONTENT] return call_res else: return call_res #if call_res.has_key(PRD): # raise APIConnectorError(call_res[PRD], include_traceback=True) raise APIConnectorError()
class APIConnector: def __init__(self, consumer_key, consumer_secret, connection_params=None): self.scheme = 'http' self.host = 'localhost' self.port = '8000' if connection_params: if connection_params.has_key('scheme'): self.scheme = connection_params['scheme'] if connection_params.has_key('host'): self.host = connection_params['host'] if connection_params.has_key('port'): self.port = connection_params['port'] if self.scheme and self.host and self.port: self.utils_obj = IUtils(self.scheme, self.host, self.port) else: raise APIConnectorError("Scheme, host, port needed") self.api = API(self.utils_obj) self.ds = DataStore() self.ds.reset() self.ds.app_info['consumer_key'] = consumer_key self.ds.app_info['consumer_secret'] = consumer_secret self.count = 0 def call(self, method, url, options=None): options = options or {} data = {} oauth_token = {} parameters = {} if options.has_key(DATA): data = options[DATA] if options.has_key(PARAMETERS): parameters = options[PARAMETERS] #if options.has_key(OAUTH_TOKEN): oauth_token = options[OAUTH_TOKEN] #if options.has_key(OAUTH_TOKEN_SECRET): oauth_token_secret = options[OAUTH_TOKEN_SECRET] if self.ds.app_info: retval = self.utils_obj.http_conn(method, url, self.ds.app_info, parameters=parameters, data=data) if retval: if isinstance(retval, dict) and retval.has_key(CONTENT): return retval[CONTENT] else: return retval return False # produces a GET call to the server with the given method and the given parameters def get_response(self, method, parameters=None, debug=False): return self.utils_obj.get_response('post_document', 'get', method, [], self.ds.app_info, parameters, debug=debug) def __getattr__(self, func_name): cr = CallRes() def handle_response(response): PRD = 'prd' # SZ: Abstarct this out prd_vals = {'Account' : 'account_id', 'Document' : 'document_id', 'Record' : 'record_id'} for prd_name, attr in prd_vals.items(): if response.has_key(PRD) and \ isinstance(cr.response[PRD], dict) and \ response[PRD].has_key(prd_name): id = response[PRD][prd_name] if len(id) > 0 and attr: setattr(self.ds, attr, id[0]) return True def internal_getattr(*args, **kwargs): if hasattr(self.api, func_name): _args, _, _, _defaults = inspect.getargspec(getattr(self.api, func_name)) kw = {} count = 0 for arg in _args[1:]: if kwargs.has_key(arg): kw[arg] = kwargs[arg] elif hasattr(self.ds, arg) and \ not (getattr(self.ds, arg) is None or getattr(self.ds, arg) == ''): kw[arg] = getattr(self.ds, arg) else: kw[arg] = _defaults[_args.index(arg) - (len(_args) - len(_defaults))] count += 1 cr.response = getattr(self.api, func_name)(**kw) handle_response(cr.response) return cr return False return internal_getattr def __call__(self, func_name, *args, **kwargs): if hasattr(self.api, func_name): self.count += 1 kw = self._get_kwargs(func_name, args, kwargs) call_res = getattr(self.api, func_name)(**kw) return self.post_call(call_res) else: raise APIConnectorError("No such API call " + func_name) def _get_kwargs(self, func_name, args, kwargs): SELF = 'self' _kw = {} _args, _, _, _defaults = inspect.getargspec(getattr(self.api, func_name)) for arg in _args: # Get passed in kwarg if len(kwargs) > 0 and kwargs.has_key(arg): _kw[arg] = kwargs[arg] # If it is an arg it is required, therefore must be non-empty elif hasattr(self.ds, arg): if not (getattr(self.ds, arg) is None or getattr(self.ds, arg) == ''): _kw[arg] = getattr(self.ds, arg) else: raise APIConnectorError(arg + ' is missing') # Get passed in arg elif len(args) > 1 and args[1].has_key(arg): _kw[arg] = args[1][arg] # Get defaults else: _kw[arg] = _defaults[_args.index(arg) - (len(_args) - len(_defaults))] if _kw.has_key(SELF): del _kw[SELF] return _kw def post_call(self, call_res): PRD = 'prd' CONTENT = 'content' prd_vals = {'Account': 'account_id', 'Document': 'document_id', 'Entry': None, 'Measurements': None, 'Record': 'record_id', 'Result': None} if call_res['response_content_type'] == 'text/plain': return call_res[PRD] elif call_res.has_key(PRD) and isinstance(call_res[PRD], dict): for prd_name, attr in prd_vals.items(): if call_res[PRD].has_key(prd_name): id = call_res[PRD][prd_name] if len(id) > 0: if attr: setattr(self.ds, attr, id[0]) #return getattr(self.ds, attr) #else: # return True #else: # return False #if call_res[PRD].has_key(CONTENT): # return call_res[PRD][CONTENT] return call_res else: return call_res #if call_res.has_key(PRD): # raise APIConnectorError(call_res[PRD], include_traceback=True) raise APIConnectorError()