From 2406a08440b90e8998f18e9017750c0c1a0c1389 Mon Sep 17 00:00:00 2001 From: Roger Barker Date: Sat, 12 Feb 2022 15:25:36 -0600 Subject: [PATCH] Updated client.py to use oauth when Granted access tokens are used to connect to the versioneone server. Modified methods: get_asset_xml; get_query_xml; execute_operation; get_attr; create_asset; and update_asset Updated query.py to accept a token_flag which indicates that the user is using Access token authentication as opposed to user/pw credential management. Also modified run_single_query method to check the token param in the V1Query object to determine if it should use oauth in the URL path for the query. --- v1pysdk/client.py | 30 ++++++++++++++++++++++++------ v1pysdk/query.py | 9 +++++++-- 2 files changed, 31 insertions(+), 8 deletions(-) diff --git a/v1pysdk/client.py b/v1pysdk/client.py index 08e4aa1..ddbaa9a 100644 --- a/v1pysdk/client.py +++ b/v1pysdk/client.py @@ -187,11 +187,17 @@ def get_xml(self, path, query='', postdata=None): return document def get_asset_xml(self, asset_type_name, oid, moment=None): - path = '/rest-1.v1/Data/{0}/{1}/{2}'.format(asset_type_name, oid, moment) if moment else '/rest-1.v1/Data/{0}/{1}'.format(asset_type_name, oid) + if self.token: + path = '/rest-1.oauth.v1/Data/{0}/{1}/{2}'.format(asset_type_name, oid, moment) if moment else '/rest-1.oauth.v1/Data/{0}/{1}'.format(asset_type_name, oid) + else: + path = '/rest-1.v1/Data/{0}/{1}/{2}'.format(asset_type_name, oid, moment) if moment else '/rest-1.v1/Data/{0}/{1}'.format(asset_type_name, oid) return self.get_xml(path) def get_query_xml(self, asset_type_name, where=None, sel=None): - path = '/rest-1.v1/Data/{0}'.format(asset_type_name) + if self.token: + path = '/rest-1..oauth.v1/Data/{0}'.format(asset_type_name) + else: + path = '/rest-1.v1/Data/{0}'.format(asset_type_name) query = {} if where is not None: query['Where'] = where @@ -204,12 +210,18 @@ def get_meta_xml(self, asset_type_name): return self.get_xml(path) def execute_operation(self, asset_type_name, oid, opname): - path = '/rest-1.v1/Data/{0}/{1}'.format(asset_type_name, oid) + if self.token: + path = '/rest-1.oauth.v1/Data/{0}/{1}'.format(asset_type_name, oid) + else: + path = '/rest-1.v1/Data/{0}/{1}'.format(asset_type_name, oid) query = {'op': opname} return self.get_xml(path, query=query, postdata={}) def get_attr(self, asset_type_name, oid, attrname, moment=None): - path = '/rest-1.v1/Data/{0}/{1}/{3}/{2}'.format(asset_type_name, oid, attrname, moment) if moment else '/rest-1.v1/Data/{0}/{1}/{2}'.format(asset_type_name, oid, attrname) + if self.token: + path = '/rest-1.oauth.v1/Data/{0}/{1}/{3}/{2}'.format(asset_type_name, oid, attrname, moment) if moment else '/rest-1.oauth.v1/Data/{0}/{1}/{2}'.format(asset_type_name, oid, attrname) + else: + path = '/rest-1.v1/Data/{0}/{1}/{3}/{2}'.format(asset_type_name, oid, attrname, moment) if moment else '/rest-1.v1/Data/{0}/{1}/{2}'.format(asset_type_name, oid, attrname) return self.get_xml(path) def create_asset(self, asset_type_name, xmldata, context_oid=''): @@ -217,12 +229,18 @@ def create_asset(self, asset_type_name, xmldata, context_oid=''): query = {} if context_oid: query = {'ctx': context_oid} - path = '/rest-1.v1/Data/{0}'.format(asset_type_name) + if self.token: + path = '/rest-1.oauth.v1/Data/{0}'.format(asset_type_name) + else: + path = '/rest-1.v1/Data/{0}'.format(asset_type_name) return self.get_xml(path, query=query, postdata=body) def update_asset(self, asset_type_name, oid, update_doc): newdata = ElementTree.tostring(update_doc, encoding='utf-8') - path = '/rest-1.v1/Data/{0}/{1}'.format(asset_type_name, oid) + if self.token: + path = '/rest-1.oauth.v1/Data/{0}/{1}'.format(asset_type_name, oid) + else: + path = '/rest-1.v1/Data/{0}/{1}'.format(asset_type_name, oid) return self.get_xml(path, postdata=newdata) diff --git a/v1pysdk/query.py b/v1pysdk/query.py index 9471626..253b004 100644 --- a/v1pysdk/query.py +++ b/v1pysdk/query.py @@ -6,7 +6,7 @@ class V1Query(object): select list and the query criteria, then iterate over the object to execute and use the query results.""" - def __init__(self, asset_class, sel_string=None, filterexpr=None): + def __init__(self, asset_class, sel_string=None, filterexpr=None, tokenFlag=False): "Takes the asset class we will be querying" self.asset_class = asset_class self.where_terms = {} @@ -17,6 +17,7 @@ def __init__(self, asset_class, sel_string=None, filterexpr=None): self.sel_string = sel_string self.empty_sel = sel_string is None self.where_string = filterexpr + self.token = tokenFlag def __iter__(self): "Iterate over the results." @@ -39,7 +40,11 @@ def get_where_string(self): def run_single_query(self, url_params={}, api="Data"): urlquery = urlencode(url_params) - urlpath = '/rest-1.v1/{1}/{0}'.format(self.asset_class._v1_asset_type_name, api) + # need to determine if using access token how to od for /rest-1.oauth.v1/.... + if self.token: + urlpath = '/rest-1.oauth.v1/{1}/{0}'.format(self.asset_class._v1_asset_type_name, api) + else: + urlpath = '/rest-1.v1/{1}/{0}'.format(self.asset_class._v1_asset_type_name, api) # warning: tight coupling ahead xml = self.asset_class._v1_v1meta.server.get_xml(urlpath, query=urlquery) return xml