analysis/webservice/algorithms/doms/insitu.py (55 lines of code) (raw):
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements. See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
"""
Module for querying CDMS In-Situ API
"""
import logging
import requests
from datetime import datetime
from webservice.algorithms.doms import config as insitu_endpoints
def query_insitu_schema():
"""
Query the "cdms_schema" insitu endpoint. This will return the JSON
schema used to construct the data, which will contain useful
metadata
"""
schema_endpoint = insitu_endpoints.getSchemaEndpoint()
if schema_endpoint is None:
logging.warning('No insitu schema endpoint defined. Skipping.')
return {}
logging.info("Querying schema")
response = requests.get(schema_endpoint)
response.raise_for_status()
return response.json()
def query_insitu(dataset, variable, start_time, end_time, bbox, platform, depth_min, depth_max,
items_per_page=20000, session=None):
"""
Query insitu API, page through results, and aggregate
"""
try:
start_time = datetime.utcfromtimestamp(start_time).strftime('%Y-%m-%dT%H:%M:%SZ')
except TypeError:
# Assume we were passed a properly formatted string
pass
try:
end_time = datetime.utcfromtimestamp(end_time).strftime('%Y-%m-%dT%H:%M:%SZ')
except TypeError:
# Assume we were passed a properly formatted string
pass
provider = insitu_endpoints.get_provider_name(dataset)
project = insitu_endpoints.get_project_name(dataset)
params = {
'itemsPerPage': items_per_page,
'startTime': start_time,
'endTime': end_time,
'bbox': bbox,
'minDepth': depth_min,
'maxDepth': depth_max,
'provider': provider,
'project': project,
'platform': platform,
}
if variable is not None:
params['variable'] = variable
insitu_response = {}
# Page through all insitu results
next_page_url = insitu_endpoints.getEndpoint(provider, dataset)
while next_page_url is not None and next_page_url != 'NA':
if session is not None:
response = session.get(next_page_url, params=params)
else:
response = requests.get(next_page_url, params=params)
logging.info(f'Insitu request {response.url}')
response.raise_for_status()
insitu_page_response = response.json()
if not insitu_response:
insitu_response = insitu_page_response
else:
insitu_response['results'].extend(insitu_page_response['results'])
next_page_url = insitu_page_response.get('next', None)
params = {} # Remove params, they are already included in above URL
return insitu_response