Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 10 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,15 @@ For OSDU on AWS, this client is useful in the case where you may want to perform
- add_group_member
- delete_group_member
- create_group
- [legal](osdu/services/legal.py)
- get_legaltag
- create_legaltag
- delete_legaltag
- get_legaltags
- update_legaltag
- batch_retrive_legaltags
- validate_legaltags
- get_legaltag_properties

## Installation

Expand Down Expand Up @@ -342,4 +351,4 @@ query = {
"role": "OWNER",
}
result = osdu_client.entitlements.delete_group_member('service.search.admin@osdu.example.com',query)
```
```
9 changes: 6 additions & 3 deletions osdu/client/_base.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
from ..services.storage import StorageService
from ..services.dataset import DatasetService
from ..services.entitlements import EntitlementsService
from ..services.legal import LegalService


class BaseOsduClient:
Expand Down Expand Up @@ -39,6 +40,10 @@ def delivery(self):
@property
def dataset(self):
return self._dataset

@property
def legal(self):
return self.__legal

@property
def data_partition_id(self):
Expand All @@ -65,8 +70,7 @@ def __init__(self, data_partition_id, api_url: str = None):
self._storage = StorageService(self)
self._dataset = DatasetService(self)
self._entitlements = EntitlementsService(self)
# TODO: Implement these services.
# self.__legal = LegaService(self)
self.__legal = LegalService(self)

def _need_update_token(self):
return hasattr(self, "_token_expiration") and self._token_expiration < time() or self._access_token is None
Expand All @@ -93,4 +97,3 @@ def _ensure_valid_token(self):

def _update_token(self):
pass #each client has their own update_token method

98 changes: 98 additions & 0 deletions osdu/services/legal.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,98 @@
""" Provides a simple Python interface to the OSDU Legal API.
"""
from typing import List
import requests
from .base import BaseService


class LegalService(BaseService):

def __init__(self, client):
super().__init__(client, service_name='legal', service_version=1)

def get_legaltag(self, legaltag_name: str):
"""Returns information about the given legaltag.

param legaltag_name: the name of the legaltag of interest
"""
url = f'{self._service_url}/legaltags/{legaltag_name}'
response = self.__execute_request('get', url)

return response.json()

def create_legaltag(self, legaltag: dict):
"""Create a new legaltag.

param legaltag: a JSON representation of a legaltag
"""
url = f'{self._service_url}/legaltags'
response = self.__execute_request('post', url, json=legaltag)

return response.json()

def delete_legaltag(self, legaltag_name: str) -> bool:
"""Deletes the given legaltag. This operation cannot be reverted (except by re-creating the legaltag).

:param legaltag_name: the name of the legaltag to delete
:returns: True if legaltag deleted successfully. Otherwise False.
"""
url = f'{self._service_url}/legaltags/{legaltag_name}'
response = self.__execute_request('delete', url)

return response.status_code == 204

def get_legaltags(self, valid: bool = True):
"""Fetches all matching legaltags.

:param valid: Boolean to restrict results to only valid legaltags (true) or only invalid legal tags (false). Default is true
"""
url = f'{self._service_url}/legaltags/' + ('?valid=true' if valid else '?valid=false')
response = self.__execute_request('get', url)

return response.json()

def update_legaltag(self, legaltag: dict):
"""Updates a legaltag. Empty properties are ignored, not deleted.

:param legaltag: dictionary of properties to add/change to an existing legaltag
"""
url = f'{self._service_url}/legaltags'
response = self.__execute_request('put', url, json=legaltag)

return response.json()

def batch_retrive_legaltags(self, legaltag_names: List[str]):
"""Retrieves information about a list of legaltags

:param legaltag_names: List of legaltag names to fetch information about
"""
url = f'{self._service_url}/legaltags:batchRetrieve'
payload = {'names': legaltag_names}
response = self.__execute_request('post', url, json=payload)

return response.json()

def validate_legaltags(self, legaltag_names: List[str]):
"""Validates the given legaltags--returning a list of which legaltags are invalid.

:param legaltag_names: List of legaltag names to validate
"""
url = f'{self._service_url}/legaltags:validate'
payload = {'names': legaltag_names}
response = self.__execute_request('post', url, json=payload)

return response.json()

def get_legaltag_properties(self):
"""Fetch information about possible values for legaltag properties"""
url = f'{self._service_url}/legaltags:properties'
response = self.__execute_request('get', url)

return response.json()

def __execute_request(self, method: str, url: str, json=None):
headers = self._headers()
response = requests.request(method, url, headers=headers, json=json)
response.raise_for_status()

return response
58 changes: 58 additions & 0 deletions tests/integration.py
Original file line number Diff line number Diff line change
Expand Up @@ -324,3 +324,61 @@ def tearDownClass(cls):
for record_id in cls.test_records:
cls.osdu.storage.purge_record(record_id)
super().tearDownClass()

class TestLegalService(TestOsduServiceBase):

def test_get_legaltags(self):
result = self.osdu.legal.get_legaltags()

self.assertTrue(len(result['legalTags']) > 0)

def test_validate_legaltags(self):
legaltag_names = ["osdu-public-usa-dataset", "osdu-testing-legal-tag"]
result = self.osdu.legal.validate_legaltags(legaltag_names)

self.assertIsNotNone(result['invalidLegalTags'])

def test_get_legaltag_properties(self):
result = self.osdu.legal.get_legaltag_properties()

self.assertIsNotNone(result['dataTypes'])

class TestLegalService_WithSideEffects(TestOsduServiceBase):

@classmethod
def setUpClass(cls):
super().setUpClass()
create_legaltag_data_file = 'tests/test_data/test_create_legaltag.json'
with open(create_legaltag_data_file, 'r') as _file:
cls.legaltag_to_create = json.load(_file)

update_legaltag_data_file = 'tests/test_data/test_update_legaltag.json'
with open(update_legaltag_data_file, 'r') as _file:
cls.legaltag_to_update = json.load(_file)

def test_001_create_legaltag(self):
result = self.osdu.legal.create_legaltag(self.legaltag_to_create)

self.assertIsNotNone(result["name"])

def test_002_get_legaltag(self):
legaltag = self.osdu.legal.get_legaltag(self.legaltag_to_create['name'])

self.assertIsNotNone(legaltag["name"])

def test_003_batch_retrieve_legaltag(self):
legaltag_names = ["osdu-public-usa-dataset", self.legaltag_to_create['name']]
result = self.osdu.legal.batch_retrive_legaltags(legaltag_names)

self.assertTrue(len(result['legalTags']) > 0)

def test_004_update_legaltag(self):
result = self.osdu.legal.update_legaltag(self.legaltag_to_update)

self.assertEqual(result['description'], self.legaltag_to_update['description'])

def test_005_delete_legaltag(self):
tag_was_deleted = self.osdu.legal.delete_legaltag(self.legaltag_to_create['name'])

self.assertTrue(tag_was_deleted)

16 changes: 16 additions & 0 deletions tests/test_data/test_create_legaltag.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
{
"name": "osdu-testing-legal-tag",
"description": "Another default legal tag",
"properties": {
"countryOfOrigin": [
"US"
],
"contractId": "A1234",
"expirationDate": "2040-06-02",
"originator": "Default",
"dataType": "Public Domain Data",
"securityClassification": "Public",
"personalData": "No Personal Data",
"exportClassification": "EAR99"
}
}
6 changes: 6 additions & 0 deletions tests/test_data/test_update_legaltag.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
{
"name": "osdu-testing-legal-tag",
"contractId":"A1234",
"expirationDate":"2040-06-12",
"description": "new description"
}