From 60cd88a35e6e7f222a5cf9566e7d8105b6b6f171 Mon Sep 17 00:00:00 2001 From: Heather Schovanec <hschovanec@usgs.gov> Date: Thu, 25 Jan 2018 16:05:28 -0700 Subject: [PATCH] Add more examples and usage parameter in web service --- geomagio/WebService.py | 7 +-- geomagio/WebServiceUsage.py | 102 ++++++++++++++++++++++++++++-------- 2 files changed, 84 insertions(+), 25 deletions(-) diff --git a/geomagio/WebService.py b/geomagio/WebService.py index b7a0ef04..29e26cea 100644 --- a/geomagio/WebService.py +++ b/geomagio/WebService.py @@ -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'])) diff --git a/geomagio/WebServiceUsage.py b/geomagio/WebServiceUsage.py index d297caa9..0a17eefa 100644 --- a/geomagio/WebServiceUsage.py +++ b/geomagio/WebServiceUsage.py @@ -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 -- GitLab