Skip to content
Snippets Groups Projects
Commit 60cd88a3 authored by Hunsinger, Heather Elizabeth's avatar Hunsinger, Heather Elizabeth
Browse files

Add more examples and usage parameter in web service

parent 6649b8aa
No related branches found
No related tags found
No related merge requests found
......@@ -73,16 +73,17 @@ def _get_param(params, key, required=False):
class WebService(object):
def __init__(self, factory=None, version=None, metadata=None):
def __init__(self, factory=None, version=None, metadata=None,
usage_documentation=None):
self.factory = factory or EdgeFactory()
self.metadata = metadata or ObservatoryMetadata().metadata
self.version = version
self.usage_documentation = usage_documentation or WebServiceUsage()
def __call__(self, environ, start_response):
"""Implement WSGI interface"""
if environ['QUERY_STRING'] == '':
usage_page = WebServiceUsage().set_usage_page(start_response)
return[usage_page]
return self.usage_documentation.__call__(environ, start_response)
try:
# parse params
query = self.parse(parse_qs(environ['QUERY_STRING']))
......
......@@ -4,24 +4,47 @@ from geomagio.ObservatoryMetadata import ObservatoryMetadata
class WebServiceUsage(object):
def __init__(self, metadata=None):
def __init__(self, metadata=None, mount_path=None, host_prefix=None):
metadata = metadata or ObservatoryMetadata().metadata.keys()
self.date = datetime.utcnow().strftime("%Y-%m-%dT%H:%M:%SZ")
self.metadata = ', '.join(sorted(metadata))
self.mount_path = mount_path
self.host_prefix = host_prefix
def set_usage_page(self, start_response):
"""Set body of Web Service Usage Documentation Page"""
def __call__(self, environ, start_response):
"""Implement documentation page"""
start_response('200 OK',
[
("Content-Type", "text/html")
])
if self.mount_path is None:
self.mount_path = '/ws/edge'
if self.host_prefix is None:
self.host_prefix = environ['HTTP_HOST']
usage_page = self.set_usage_page()
return [usage_page]
def set_usage_page(self):
"""Set body of Web Service Usage Documentation Page"""
stylesheet = "https://geomag.usgs.gov/theme/site/geomag/index.css"
ids = ""
observatories = self.metadata.split(", ")
for idx, obs_id in enumerate(observatories):
ids += "<code>" + obs_id + "</code>"
if idx != len(observatories) - 1:
ids += ", "
if idx % 9 == 0 and idx is not 0:
ids += "<br/>"
usage_body = """
<!doctype html>
<html>
<head>
<title>Geomag Web Service Usage</title>
<base href={host_prefix}>
<meta charset="utf-8"/>
<meta name="viewport" content="width=device-width,
initial-scale=1"/>
<link href="/theme/site/geomag/index.scss" type="text/css">
<link rel="stylesheet" href={stylesheet} type="text/css">
<style>
code,
pre {{
......@@ -33,7 +56,7 @@ class WebServiceUsage(object):
</style>
</head>
<body>
<body style="font-size:135%">
<main role="main" class="page" aria-labelledby="page-header">
<header class="page-header" id="page-header">
<h1>Geomag Web Service Usage</h1>
......@@ -42,24 +65,36 @@ class WebServiceUsage(object):
<h2>Example Requests</h3>
<dl>
<b>BOU observatory data for current UTC day in IAGA2002
format</b>
<dt>BOU observatory data for current UTC day in IAGA2002
format</dt>
<dd>
<a href="http://geomag.usgs.gov/ws/edge/?id=BOU">
http://geomag.usgs.gov/ws/edge/?id=BOU</a>
<a href="{link1}">
{link1}</a>
</dd>
<dt>BOU observatory data for current UTC day in JSON
format</dt>
<dd>
<a href="{link2}">
{link2}</a>
</dd>
<dt>BOU electric field data for current UTC day in
IAGA2002 format</dt>
<dd>
<a href="{link3}">
{link3}</a>
</dd>
<h2>Parameters</h2>
<dl>
<b>id</b>
<dt>id</dt>
<dd>
Observatory code.
Required.<br/>
Valid values: <code>{metadata}</code>
Valid values:<br/>
{metadata}
</dd>
<b>starttime</b>
<dt>starttime</dt>
<dd>
Time of first requested data.<br/>
Default: start of current UTC day<br/>
......@@ -68,7 +103,7 @@ class WebServiceUsage(object):
Example: <code>{date}</code>
</dd>
<b>endtime</b>
<dt>endtime</dt>
<dd>
Time of last requested data.<br/>
Default: starttime + 24 hours<br/>
......@@ -77,15 +112,23 @@ class WebServiceUsage(object):
Example: <code>{date}</code>
</dd>
<b>elements</b>
<dt>elements</dt>
<dd>
Comma separated list of requested elements.<br/>
Default: <code>X,Y,Z,F</code><br/>
Valid values: <code>D, DIST, DST, E, E-E, E-N, F, G,
H, SQ, SV, UK1, UK2, UK3, UK4, X, Y, Z</code>
Default: <code>X</code>,<code>Y</code>,<code>Z</code>,
<code>F</code><br/>
Valid values: <code>D</code>, <code>DIST</code>,
<code>DST</code>, <code>E</code>,
<code>E-E</code>, <code>E-N</code>,
<code>F</code>, <code>G</code>,
<code>H</code>, <code>SQ</code>,
<code>SV</code>, <code>UK1</code>,
<code>UK2</code>, <code>UK3</code>,
<code>UK4</code>, <code>X</code>,
<code>Y</code>, <code>Z</code>
<br/>
</dd>
<b>sampling_period</b>
<dt>sampling_period</dt>
<dd>
Interval in seconds between values.<br/>
Default: <code>60</code><br/>
......@@ -94,7 +137,7 @@ class WebServiceUsage(object):
<code>60</code>
</dd>
<b>type</b>
<dt>type</dt>
<dd>
Type of data.<br/>
Default: <code>variation</code><br/>
......@@ -103,9 +146,16 @@ class WebServiceUsage(object):
<code>adjusted</code>,
<code>quasi-definitive</code>,
<code>definitive</code><br/>
<small>
NOTE: the USGS web service also supports specific
EDGE location codes.
For example:
<code>R0</code> is "internet variation",
<code>R1</code> is "satellite variation".
</small>
</dd>
<b>format</b>
<dt>format</dt>
<dd>
Output format.<br/>
Default: <code>iaga2002</code><br/>
......@@ -131,5 +181,13 @@ class WebServiceUsage(object):
</form>
</nav>
</body>
""".format(metadata=self.metadata, date=self.date)
</html>
""".format(metadata=ids, date=self.date,
host_prefix=self.host_prefix,
stylesheet=stylesheet,
link1=self.host_prefix + self.mount_path + "/?id=BOU",
link2=self.host_prefix + self.mount_path +
"/?id=BOU&format=json",
link3=self.host_prefix + self.mount_path +
"/?id=BOU&elements=E-N,E-E",)
return usage_body
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment