Skip to content

Commit

Permalink
add CSW GetCap and GetRecord URL builders #21
Browse files Browse the repository at this point in the history
  • Loading branch information
Guts committed Apr 4, 2018
1 parent 0c4c5fb commit 0d0872e
Show file tree
Hide file tree
Showing 3 changed files with 110 additions and 74 deletions.
42 changes: 14 additions & 28 deletions isogeo_pysdk/isogeo_sdk.py
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,8 @@ def __init__(self, client_id, client_secret, proxy=None, auth_mode="group",
pass

# platform to request
self.platform, self.base_url, self.ssl = utils.set_base_url(platform)
self.platform, self.api_url, self.app_url, self.csw_url,\
self.mng_url, self.oc_url, self.ssl = utils.set_base_url(platform)

# setting language
if lang.lower() not in ("fr", "en"):
Expand Down Expand Up @@ -184,7 +185,7 @@ def connect(self, client_id=None, client_secret=None):

# passing request to get a 24h bearer
# see: http://tools.ietf.org/html/rfc6750#section-2
id_url = "https://id.{}.isogeo.com/oauth/token".format(self.base_url)
id_url = "https://id.{}.isogeo.com/oauth/token".format(self.api_url)
try:
conn = requests.post(id_url,
auth=(client_id, client_secret),
Expand Down Expand Up @@ -324,7 +325,7 @@ def search(self,
head = {"Authorization": "Bearer " + token[0],
"user-agent": self.app_name}
search_url = "{}://v1.{}.isogeo.com/resources/search".format(prot,
self.base_url)
self.api_url)
try:
search_req = requests.get(search_url,
headers=head,
Expand Down Expand Up @@ -400,7 +401,7 @@ def resource(self, token, id_resource, sub_resources=[], prot="https"):
head = {"Authorization": "Bearer " + token[0],
"user-agent": self.app_name}
md_url = "{}://v1.{}.isogeo.com/resources/{}".format(prot,
self.base_url,
self.api_url,
id_resource)
resource_req = requests.get(md_url,
headers=head,
Expand Down Expand Up @@ -430,7 +431,7 @@ def shares(self, token, prot="https"):
head = {"Authorization": "Bearer " + token[0],
"user-agent": self.app_name}
shares_url = "{}://v1.{}.isogeo.com/shares/".format(prot,
self.base_url)
self.api_url)
shares_req = requests.get(shares_url,
headers=head,
proxies=self.proxies,
Expand All @@ -457,7 +458,7 @@ def share(self, token, share_id, prot="https"):
head = {"Authorization": "Bearer " + token[0],
"user-agent": self.app_name}
share_url = "{}://v1.{}.isogeo.com/shares/{}".format(prot,
self.base_url,
self.api_url,
share_id)
share_req = requests.get(share_url,
headers=head,
Expand Down Expand Up @@ -493,7 +494,7 @@ def licenses(self, token, owner_id, prot="https"):
"user-agent": self.app_name}
licenses_url = "{}://v1.{}.isogeo.com/groups/{}/licenses"\
.format(prot,
self.base_url,
self.api_url,
owner_id
)
licenses_req = requests.get(licenses_url,
Expand Down Expand Up @@ -530,7 +531,7 @@ def license(self, token, license_id, prot="https"):
"user-agent": self.app_name}
license_url = "{}://v1.{}.isogeo.com/licenses/{}"\
.format(prot,
self.base_url,
self.api_url,
license_id
)
license_req = requests.get(license_url,
Expand Down Expand Up @@ -563,7 +564,7 @@ def thesauri(self, token, prot="https"):
head = {"Authorization": "Bearer " + token[0],
"user-agent": self.app_name}
thez_url = "{}://v1.{}.isogeo.com/thesauri".format(prot,
self.base_url)
self.api_url)
thez_req = requests.get(thez_url,
headers=head,
proxies=self.proxies,
Expand Down Expand Up @@ -594,7 +595,7 @@ def thesaurus(self, token, thez_id="1616597fbc4348c8b11ef9d59cf594c8", prot="htt
head = {"Authorization": "Bearer " + token[0],
"user-agent": self.app_name}
thez_url = "{}://v1.{}.isogeo.com/thesauri/{}".format(prot,
self.base_url,
self.api_url,
thez_id)
thez_req = requests.get(thez_url,
headers=head,
Expand Down Expand Up @@ -657,7 +658,7 @@ def keywords(self,
"user-agent": self.app_name}
keywords_url = "{}://v1.{}.isogeo.com/thesauri/{}/keywords/search"\
.format(prot,
self.base_url,
self.api_url,
thez_id)

kwds_req = requests.get(keywords_url,
Expand Down Expand Up @@ -711,7 +712,7 @@ def dl_hosted(self, token, resource_link,

hosted_url = "{}://v1.{}.isogeo.com/{}"\
.format(prot,
self.base_url,
self.api_url,
resource_link.get("url"))

# send stream request
Expand Down Expand Up @@ -775,7 +776,7 @@ def xml19139(self, token, id_resource, proxy_url=None, prot="https"):
head = {"Authorization": "Bearer " + token[0],
"user-agent": self.app_name}
md_url = "{}://v1.{}.isogeo.com/resources/{}.xml".format(prot,
self.base_url,
self.api_url,
id_resource)
xml_req = requests.get(md_url,
headers=head,
Expand Down Expand Up @@ -834,21 +835,6 @@ def get_app_properties(self, token, prot="https"):
else:
pass

# def get_csw_record_by_id(self, id_resource=str):
# """
# TO DOC
# """
# srv_link_xml = "http://services.api.isogeo.com/ows/s/"\
# "{1}/{2}?"\
# "service=CSW&version=2.0.2&request=GetRecordById"\
# "&id=urn:isogeo:metadata:uuid:{0}&"\
# "elementsetname=full&outputSchema="\
# "http://www.isotc211.org/2005/gmd"\
# .format(md_uuid_formatted,
# csw_share_id,
# csw_share_token)
# pass


# ##############################################################################
# ##### Stand alone program ########
Expand Down
87 changes: 55 additions & 32 deletions isogeo_pysdk/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,10 @@ class IsogeoUtils(object):
"qa": "https://qa-isogeo-app.azurewebsites.net",
}

CSW_URLS = {"prod": "https://app.isogeo.com",
"qa": "http://services.api.qa.isogeo.com",
}

MNG_URLS = {"prod": "https://manage.isogeo.com",
"qa": "https://qa-isogeo-manage.azurewebsites.net",
}
Expand All @@ -58,9 +62,23 @@ class IsogeoUtils(object):
"qa": "https://qa-isogeo-open.azurewebsites.net",
}

WEBAPPS = {"oc": {"args": ("md_id", "share_id", "oc_token"),
WEBAPPS = {"csw_getcap": {"args": ("share_id", "share_token"),
"url": "https://services.api.isogeo.com/ows/s/"
"{share_id}/{share_token}?service=CSW"
"&version=2.0.2&request=GetCapabilities"
},
"csw_getrec": {"args": ("md_uuid_urn",
"share_id",
"share_token"),
"url": "https://services.api.isogeo.com/ows/s/"
"{share_id}/{share_token}?service=CSW"
"&version=2.0.2&request=GetRecordById"
"&id={md_uuid_urn}&elementsetname=full"
"&outputSchema=http://www.isotc211.org/2005/gmd"
},
"oc": {"args": ("md_id", "share_id", "share_token"),
"url": "https://open.isogeo.com/s/{share_id}"
"/{oc_token}/r/{md_id}"
"/{share_token}/r/{md_id}"
},
"pixup_portal": {"args": ("md_id", "portal_url", ),
"url": "http://{portal_url}/?muid={md_id}"
Expand All @@ -73,10 +91,42 @@ def __init__(self, proxies=dict()):
:param dict proxies: dictionary of proxy settings as described in
requests. See: http://docs.python-requests.org/en/master/user/advanced/#proxies
"""
self.platform, self.base_url, self.ssl = self.set_base_url()
self.platform, self.api_url, self.app_url, self.csw_url, self.mng_url,\
self.oc_url, self.ssl = self.set_base_url()
self.proxies = proxies
super(IsogeoUtils, self).__init__()

def set_base_url(self, platform="prod"):
"""Set Isogeo base URLs according to platform.
:param str platform: platform to use. Available values:
* prod [DEFAULT]
* qa
* int
"""
platform = platform.lower()
self.platform = platform
if platform == "prod":
ssl = True
logging.debug("Using production platform.")
elif platform == "qa":
ssl = False
logging.debug("Using Quality Assurance platform (reduced perfs).")
else:
logging.error("Platform must be one of: {}"
.format(" | ".join(self.API_URLS.keys())))
raise ValueError(3, "Platform must be one of: {}"
.format(" | ".join(self.API_URLS.keys())))
# method ending
return platform.lower(),\
self.API_URLS.get(platform),\
self.APP_URLS.get(platform),\
self.CSW_URLS.get(platform),\
self.MNG_URLS.get(platform),\
self.OC_URLS.get(platform),\
ssl

def convert_uuid(self, in_uuid=str, mode=0):
"""Convert a metadata UUID to its URI equivalent. And conversely.
Expand Down Expand Up @@ -131,12 +181,12 @@ def get_isogeo_version(self, component="api", prot="https"):
if component == "api":
version_url = "{}://v1.{}.isogeo.com/about"\
.format(prot,
self.base_url
self.api_url
)
elif component == "db":
version_url = "{}://v1.{}.isogeo.com/about/database"\
.format(prot,
self.base_url
self.api_url
)
elif component == "app" and self.platform == "prod":
version_url = "https://app.isogeo.com/about"
Expand All @@ -158,33 +208,6 @@ def get_isogeo_version(self, component="api", prot="https"):
# end of method
return version_req.json().get("version")

def set_base_url(self, platform="prod"):
"""Set API base URLs according to platform.
:param str platform: platform to use. Available values:
* prod [DEFAULT]
* qa
* int
"""
platform = platform.lower()
self.platform = platform
if platform == "prod":
base_url = self.API_URLS.get(platform)
ssl = True
logging.debug("Using production platform.")
elif platform == "qa":
base_url = self.API_URLS.get(platform)
ssl = False
logging.debug("Using Quality Assurance platform (reduced perfs).")
else:
logging.error("Platform must be one of: {}"
.format(" | ".join(self.API_URLS.keys())))
raise ValueError(3, "Platform must be one of: {}"
.format(" | ".join(self.API_URLS.keys())))
# method ending
return platform.lower(), base_url, ssl

# -- URLs builders -------------------------------------------------------
def get_edit_url(self, md_id=str, md_type=str, owner_id=str, tab="identification"):
"""Constructs the edition URL of a metadata.
Expand Down
55 changes: 41 additions & 14 deletions tests/test_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,8 @@ def test_get_isogeo_version_api(self):
version_api_prod = self.utils.get_isogeo_version(component="api")
version_api_naive_prod = self.utils.get_isogeo_version()
# qa
platform, base_url, ssl = self.utils.set_base_url(platform="qa")
platform, api_url, app_url, csw_url, mng_url,\
oc_url, ssl = self.utils.set_base_url(platform="qa")
version_api_qa = self.utils.get_isogeo_version(component="api")
version_api_naive_qa = self.utils.get_isogeo_version()
# check
Expand All @@ -74,7 +75,8 @@ def test_get_isogeo_version_app(self):
# prod
version_app_prod = self.utils.get_isogeo_version(component="app")
# qa
platform, base_url, ssl = self.utils.set_base_url(platform="qa")
platform, api_url, app_url, csw_url, mng_url,\
oc_url, ssl = self.utils.set_base_url(platform="qa")
version_app_qa = self.utils.get_isogeo_version(component="app")
# check
self.assertIsInstance(version_app_prod, str)
Expand All @@ -85,7 +87,8 @@ def test_get_isogeo_version_db(self):
# prod
version_db_prod = self.utils.get_isogeo_version(component="db")
# qa
platform, base_url, ssl = self.utils.set_base_url(platform="qa")
platform, api_url, app_url, csw_url, mng_url,\
oc_url, ssl = self.utils.set_base_url(platform="qa")
version_db_qa = self.utils.get_isogeo_version(component="db")
# check
self.assertIsInstance(version_db_prod, str)
Expand All @@ -100,20 +103,22 @@ def test_get_isogeo_version_bad_parameter(self):
def test_set_base_url(self):
"""Set base URLs"""
# by default platform = prod
platform, base_url, ssl = self.utils.set_base_url()
platform, api_url, app_url, csw_url, mng_url,\
oc_url, ssl = self.utils.set_base_url()
self.assertIsInstance(platform, str)
self.assertIsInstance(base_url, str)
self.assertIsInstance(api_url, str)
self.assertIsInstance(ssl, bool)
self.assertEqual(platform, "prod")
self.assertEqual(base_url, self.utils.API_URLS.get("prod"))
self.assertEqual(api_url, self.utils.API_URLS.get("prod"))
self.assertEqual(ssl, True)
# qa
platform, base_url, ssl = self.utils.set_base_url(platform="qa")
platform, api_url, app_url, csw_url, mng_url,\
oc_url, ssl = self.utils.set_base_url(platform="qa")
self.assertIsInstance(platform, str)
self.assertIsInstance(base_url, str)
self.assertIsInstance(api_url, str)
self.assertIsInstance(ssl, bool)
self.assertEqual(platform, "qa")
self.assertEqual(base_url, self.utils.API_URLS.get("qa"))
self.assertEqual(api_url, self.utils.API_URLS.get("qa"))
self.assertEqual(ssl, False)

def test_set_base_url_bad_parameter(self):
Expand Down Expand Up @@ -174,17 +179,39 @@ def test_get_edit_url_bad_tab(self):
def test_get_view_url_ok(self):
"""Test URL builder for OpenCatalog and PixupPortal links."""
# OpenCatalog
oc_url = self.utils.get_view_url(md_id="0269803d50c446b09f5060ef7fe3e22b",
webapp="oc",
oc_url = self.utils.get_view_url(webapp="oc",
md_id="0269803d50c446b09f5060ef7fe3e22b",
share_id="1e07910d365449b59b6596a9b428ecd9",
oc_token="TokenOhDearToken")
share_token="TokenOhDearToken")
self.assertEqual(oc_url, "https://open.isogeo.com/s/1e07910d365449b59b6596a9b428ecd9/TokenOhDearToken/r/0269803d50c446b09f5060ef7fe3e22b")

# PixUp portal - demo.isogeo.net sample
pixup_url = self.utils.get_view_url(md_id="0269803d50c446b09f5060ef7fe3e22b",
webapp="pixup_portal",
pixup_url = self.utils.get_view_url(webapp="pixup_portal",
md_id="0269803d50c446b09f5060ef7fe3e22b",
portal_url="demo.isogeo.net")
self.assertEqual(pixup_url, "http://demo.isogeo.net/?muid=0269803d50c446b09f5060ef7fe3e22b")

# CSW - GetCapapabilities
csw_getcap_url = self.utils.get_view_url(webapp="csw_getcap",
share_id="1e07910d365449b59b6596a9b428ecd9",
share_token="TokenOhDearToken")
self.assertEqual(csw_getcap_url,
"https://services.api.isogeo.com/ows/s/1e07910d365449b59b6596a9b428ecd9/TokenOhDearToken?"
"service=CSW&version=2.0.2&request=GetCapabilities")

# CSW - GetRecord
csw_getrec_url = self.utils.get_view_url(webapp="csw_getrec",
md_uuid_urn=self.uuid_urnIsogeo,
share_id="1e07910d365449b59b6596a9b428ecd9",
share_token="TokenOhDearToken")
self.assertEqual(csw_getrec_url,
"https://services.api.isogeo.com/ows/s/"
"1e07910d365449b59b6596a9b428ecd9/TokenOhDearToken?service=CSW"
"&version=2.0.2&request=GetRecordById"
"&id=urn:isogeo:metadata:uuid:0269803d-50c4-46b0-9f50-60ef7fe3e22b"
"&elementsetname=full&outputSchema=http://www.isotc211.org/2005/gmd")
print(csw_getrec_url)

def test_get_view_url_bad(self):
"""Test URL builder for web app with bad parameters."""
with self.assertRaises(ValueError):
Expand Down

0 comments on commit 0d0872e

Please sign in to comment.