Skip to content

Commit

Permalink
Add metadata.conditions model and routes - Merge #90
Browse files Browse the repository at this point in the history
  • Loading branch information
Guts committed Aug 24, 2019
2 parents 8c726d5 + 5c51da8 commit b5c573f
Show file tree
Hide file tree
Showing 17 changed files with 765 additions and 103 deletions.
1 change: 1 addition & 0 deletions isogeo_pysdk/api/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
from .routes_account import ApiAccount # noqa: F401
from .routes_catalog import ApiCatalog # noqa: F401
from .routes_contact import ApiContact # noqa: F401
from .routes_condition import ApiCondition # noqa: F401
from .routes_coordinate_systems import ApiCoordinateSystem # noqa: F401
from .routes_datasource import ApiDatasource # noqa: F401
from .routes_directives import ApiDirective # noqa: F401
Expand Down
2 changes: 1 addition & 1 deletion isogeo_pysdk/api/routes_catalog.py
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@
# ########## Classes ###############
# ##################################
class ApiCatalog:
"""Routes as methods of Isogeo API used to manipulate catalogs (conditions).
"""Routes as methods of Isogeo API used to manipulate catalogs.
"""

def __init__(self, api_client=None):
Expand Down
248 changes: 248 additions & 0 deletions isogeo_pysdk/api/routes_condition.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,248 @@
# -*- coding: UTF-8 -*-
#! python3

"""
Isogeo API v1 - API Routes for Conditions entities
See: http://help.isogeo.com/api/complete/index.html
"""

# #############################################################################
# ########## Libraries #############
# ##################################

# Standard library
import logging
from functools import lru_cache

# 3rd party
from requests import Response

# submodules
from isogeo_pysdk.checker import IsogeoChecker
from isogeo_pysdk.decorators import ApiDecorators
from isogeo_pysdk.models import Condition, Metadata, License
from isogeo_pysdk.utils import IsogeoUtils

# #############################################################################
# ########## Global #############
# ##################################

logger = logging.getLogger(__name__)
checker = IsogeoChecker()
utils = IsogeoUtils()


# #############################################################################
# ########## Classes ###############
# ##################################
class ApiCondition:
"""Routes as methods of Isogeo API used to manipulate conditions.
"""

def __init__(self, api_client=None):
if api_client is not None:
self.api_client = api_client

# store API client (Request [Oauthlib] Session) and pass it to the decorators
self.api_client = api_client
ApiDecorators.api_client = api_client

# ensure platform and others params to request
self.platform, self.api_url, self.app_url, self.csw_url, self.mng_url, self.oc_url, self.ssl = utils.set_base_url(
self.api_client.platform
)
# initialize
super(ApiCondition, self).__init__()

@lru_cache()
@ApiDecorators._check_bearer_validity
def list(self, metadata_id: str) -> list:
"""List metadata's conditions with complete information.
:param str metadata_id: metadata UUID
:returns: the list of conditions associated with the metadata
:rtype: list
"""
# check metadata UUID
if not checker.check_is_uuid(metadata_id):
raise ValueError(
"Metadata ID is not a correct UUID: {}".format(metadata_id)
)
else:
pass

# URL
url_metadata_conditions = utils.get_request_base_url(
route="resources/{}/conditions/".format(metadata_id)
)

# request
req_metadata_conditions = self.api_client.get(
url=url_metadata_conditions,
headers=self.api_client.header,
proxies=self.api_client.proxies,
verify=self.api_client.ssl,
timeout=self.api_client.timeout,
)

# checking response
req_check = checker.check_api_response(req_metadata_conditions)
if isinstance(req_check, tuple):
return req_check

# end of method
return req_metadata_conditions.json()

@lru_cache()
@ApiDecorators._check_bearer_validity
def get(self, metadata_id: str, condition_id: str) -> Condition:
"""Get details about a specific condition.
:param str metadata_id: identifier of the owner workgroup
:param str condition_id: condition UUID
"""
# check workgroup UUID
if not checker.check_is_uuid(metadata_id):
raise ValueError(
"Metadata ID is not a correct UUID: {}".format(metadata_id)
)
else:
pass
# check condition UUID
if not checker.check_is_uuid(condition_id):
raise ValueError(
"Condition ID is not a correct UUID: {}".format(condition_id)
)
else:
pass

# condition route
url_condition = utils.get_request_base_url(
route="resources/{}/conditions/{}".format(metadata_id, condition_id)
)

# request
req_condition = self.api_client.get(
url=url_condition,
headers=self.api_client.header,
proxies=self.api_client.proxies,
verify=self.api_client.ssl,
timeout=self.api_client.timeout,
)

# checking response
req_check = checker.check_api_response(req_condition)
if isinstance(req_check, tuple):
return req_check

# extend response with uuid of prent metadata
condition_returned = req_condition.json()
condition_returned["parent_resource"] = metadata_id

# end of method
return Condition(**condition_returned)

@ApiDecorators._check_bearer_validity
def create(self, metadata: Metadata, condition: Condition) -> Condition:
"""Add a new condition (license + specific description) to a metadata.
:param Metadata metadata: metadata object to update
:param Condition condition: condition to create
"""
# check metadata UUID
if not checker.check_is_uuid(metadata._id):
raise ValueError(
"Metadata ID is not a correct UUID: {}".format(metadata._id)
)
else:
pass

# check license UUID
if not checker.check_is_uuid(condition.license._id):
raise ValueError(
"License ID is not a correct UUID: {}".format(condition.license._id)
)
else:
pass

# URL
url_condition_create = utils.get_request_base_url(
route="resources/{}/conditions".format(metadata._id)
)

# request
req_condition_create = self.api_client.post(
url=url_condition_create,
json=condition.to_dict_creation(),
headers=self.api_client.header,
proxies=self.api_client.proxies,
verify=self.api_client.ssl,
timeout=self.api_client.timeout,
)

# checking response
req_check = checker.check_api_response(req_condition_create)
if isinstance(req_check, tuple):
return req_check

# extend response with uuid of prent metadata
condition_returned = req_condition_create.json()
condition_returned["parent_resource"] = metadata._id

# end of method
return Condition(**condition_returned)

@ApiDecorators._check_bearer_validity
def delete(self, metadata: Metadata, condition: Condition) -> Response:
"""Removes a condition from a metadata.
:param Metadata metadata: metadata object to update
:param Condition condition: license model object to associate
"""
# check metadata UUID
if not checker.check_is_uuid(metadata._id):
raise ValueError(
"Metadata ID is not a correct UUID: {}".format(metadata._id)
)
else:
pass

# check license UUID
if not checker.check_is_uuid(condition._id):
raise ValueError(
"Condition ID is not a correct UUID: {}".format(condition._id)
)
else:
pass

# URL
url_condition_delete = utils.get_request_base_url(
route="resources/{}/conditions/{}".format(metadata._id, condition._id)
)

# request
req_condition_delete = self.api_client.delete(
url=url_condition_delete,
headers=self.api_client.header,
proxies=self.api_client.proxies,
verify=self.api_client.ssl,
timeout=self.api_client.timeout,
)

# checking response
req_check = checker.check_api_response(req_condition_delete)
if isinstance(req_check, tuple):
return req_check

# end of method
return req_condition_delete


# ##############################################################################
# ##### Stand alone program ########
# ##################################
if __name__ == "__main__":
""" standalone execution """
api_condition = ApiCondition()
2 changes: 1 addition & 1 deletion isogeo_pysdk/api/routes_contact.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@
# ########## Classes ###############
# ##################################
class ApiContact:
"""Routes as methods of Isogeo API used to manipulate contacts (conditions).
"""Routes as methods of Isogeo API used to manipulate contacts.
"""

def __init__(self, api_client=None):
Expand Down
2 changes: 1 addition & 1 deletion isogeo_pysdk/api/routes_invitation.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@
# ########## Classes ###############
# ##################################
class ApiInvitation:
"""Routes as methods of Isogeo API used to manipulate invitations (conditions).
"""Routes as methods of Isogeo API used to manipulate invitations.
"""

def __init__(self, api_client=None):
Expand Down
2 changes: 1 addition & 1 deletion isogeo_pysdk/api/routes_keyword.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@
# ########## Classes ###############
# ##################################
class ApiKeyword:
"""Routes as methods of Isogeo API used to manipulate keywords (conditions).
"""Routes as methods of Isogeo API used to manipulate keywords.
"""

def __init__(self, api_client=None):
Expand Down
75 changes: 7 additions & 68 deletions isogeo_pysdk/api/routes_license.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@
# submodules
from isogeo_pysdk.checker import IsogeoChecker
from isogeo_pysdk.decorators import ApiDecorators
from isogeo_pysdk.models import License, Metadata
from isogeo_pysdk.models import Condition, License, Metadata
from isogeo_pysdk.utils import IsogeoUtils

# #############################################################################
Expand Down Expand Up @@ -323,7 +323,8 @@ def update(self, license: License, caching: bool = 1) -> License:
def associate_metadata(
self, metadata: Metadata, license: License, description: str, force: bool = 0
) -> Response:
"""Associate a condition (license + specific description) to a metadata. Wehn a license is associated to a metadata, it become a condition.
"""Associate a condition (license + specific description) to a metadata.
When a license is associated to a metadata, it becomes a condition.
By default, if the specified license is already associated, the method won't duplicate the association.
Use `force` option to overpass this behavior.
Expand Down Expand Up @@ -405,76 +406,14 @@ def associate_metadata(
"Force option enabled. Ignoring existing associated licenses. Risk of duplicated association."
)

# URL
url_license_association = utils.get_request_base_url(
route="resources/{}/conditions".format(metadata._id)
)

# request
req_license_association = self.api_client.post(
url=url_license_association,
json={"description": description, "license": license.to_dict()},
headers=self.api_client.header,
proxies=self.api_client.proxies,
verify=self.api_client.ssl,
timeout=self.api_client.timeout,
)

# checking response
req_check = checker.check_api_response(req_license_association)
if isinstance(req_check, tuple):
return req_check
# pass it to the conditions route
condition_to_create = Condition(description=description, license=license)

# end of method
return req_license_association

@ApiDecorators._check_bearer_validity
def dissociate_metadata(self, metadata: Metadata, condition_id: str) -> Response:
"""Removes the association between a metadata and a license.
If the specified license is not associated, the response is 404.
:param Metadata metadata: metadata object to update
:param License license: license model object to associate
"""
# check metadata UUID
if not checker.check_is_uuid(metadata._id):
raise ValueError(
"Metadata ID is not a correct UUID: {}".format(metadata._id)
)
else:
pass

# check license UUID
if not checker.check_is_uuid(condition_id):
raise ValueError(
"Condition ID is not a correct UUID: {}".format(condition_id)
)
else:
pass

# URL
url_license_dissociation = utils.get_request_base_url(
route="resources/{}/conditions/{}".format(metadata._id, condition_id)
)

# request
req_license_dissociation = self.api_client.delete(
url=url_license_dissociation,
headers=self.api_client.header,
proxies=self.api_client.proxies,
verify=self.api_client.ssl,
timeout=self.api_client.timeout,
return self.api_client.metadata.conditions.create(
metadata=metadata, condition=condition_to_create
)

# checking response
req_check = checker.check_api_response(req_license_dissociation)
if isinstance(req_check, tuple):
return req_check

# end of method
return req_license_dissociation


# ##############################################################################
# ##### Stand alone program ########
Expand Down

0 comments on commit b5c573f

Please sign in to comment.