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