From cf9cbf4e855db2a11ab3b0458921beb19f4c166f Mon Sep 17 00:00:00 2001
From: Brian Moe <brian.moe@ligo.org>
Date: Wed, 22 Jul 2009 16:59:19 -0500
Subject: [PATCH] Time display modifications. Changed display of all date/time
 data to be UTC. GPS times display UTC times when cursor hovers over them.

---
 gracedb/templatetags/__init__.py        |  0
 gracedb/templatetags/timeutil.py        | 65 +++++++++++++++++++++++++
 settings.py                             |  4 +-
 settings_dev.py                         |  2 +
 templates/feeds/latest_description.html |  3 +-
 templates/gracedb/event_detail.html     |  9 ++--
 templates/gracedb/event_list.html       |  5 +-
 7 files changed, 82 insertions(+), 6 deletions(-)
 create mode 100644 gracedb/templatetags/__init__.py
 create mode 100644 gracedb/templatetags/timeutil.py

diff --git a/gracedb/templatetags/__init__.py b/gracedb/templatetags/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/gracedb/templatetags/timeutil.py b/gracedb/templatetags/timeutil.py
new file mode 100644
index 000000000..07f1827cd
--- /dev/null
+++ b/gracedb/templatetags/timeutil.py
@@ -0,0 +1,65 @@
+
+from django import template
+from django.conf import settings
+from django.utils import dateformat
+
+import pytz
+
+# DATETIME_SETTINGS is guaranteed to be set.  GRACE_DATETIME_FORMAT is not.
+FORMAT = getattr(settings, 'GRACE_DATETIME_FORMAT', settings.DATETIME_FORMAT)
+
+LOCAL_TZ = pytz.timezone(settings.TIME_ZONE)
+
+register = template.Library()
+
+@register.filter(name='utc')
+def utc(dt, format=FORMAT):
+    if not dt.tzinfo:
+        dt = LOCAL_TZ.localize(dt)
+    dt = dt.astimezone(pytz.utc)
+    return dateformat.format(dt, format)
+
+@register.filter(name='gpsdate')
+def gpsdate(gpstime, format=FORMAT):
+    return dateformat.format(gpsToUTC(gpstime), format)
+
+
+
+# GPS time conversion
+
+# This is kind of awful in that leapSeconds
+# are hard coded and needs to be kept up to date.
+# Also, this should be somewhere else.
+
+import calendar, datetime
+
+gpsEpoch = calendar.timegm((1980, 1, 6, 0,  0,  0,  0,  0,  0))
+
+leapSeconds = map(calendar.timegm, [
+    (1981, 7, 0, 0, 0, 0, 0, 0, 0),
+    (1982, 7, 0, 0, 0, 0, 0, 0, 0),
+    (1983, 7, 0, 0, 0, 0, 0, 0, 0),
+    (1985, 7, 0, 0, 0, 0, 0, 0, 0),
+    (1988, 1, 0, 0, 0, 0, 0, 0, 0),
+    (1990, 1, 0, 0, 0, 0, 0, 0, 0),
+    (1991, 1, 0, 0, 0, 0, 0, 0, 0),
+    (1992, 7, 0, 0, 0, 0, 0, 0, 0),
+    (1993, 7, 0, 0, 0, 0, 0, 0, 0),
+    (1994, 7, 0, 0, 0, 0, 0, 0, 0),
+    (1996, 1, 0, 0, 0, 0, 0, 0, 0),
+    (1997, 7, 0, 0, 0, 0, 0, 0, 0),
+    (1999, 1, 0, 0, 0, 0, 0, 0, 0),
+    (2006, 1, 0, 0, 0, 0, 0, 0, 0),
+    (2009, 1, 0, 0, 0, 0, 0, 0, 0),
+])
+
+def gpsToPosixTime(gpsTime):
+    t = gpsEpoch + gpsTime
+    for leap in leapSeconds:
+        if t >= leap:
+            t = t - 1
+    return t
+
+def gpsToUTC(gpsTime):
+    t = gpsToPosixTime(gpsTime)
+    return datetime.datetime.fromtimestamp(t, pytz.utc)
diff --git a/settings.py b/settings.py
index 52f5f0d08..67740dd45 100644
--- a/settings.py
+++ b/settings.py
@@ -39,7 +39,9 @@ DATABASE_PORT = ''             # Set to empty string for default.
 # although not all choices may be available on all operating systems.
 # If running in a Windows environment this must be set to the same as your
 # system time zone.
+
 TIME_ZONE = 'America/Chicago'
+GRACE_DATETIME_FORMAT = 'Y-m-d H:i:s T'
 
 # Language code for this installation. All choices can be found here:
 # http://www.i18nguy.com/unicode/language-identifiers.html
@@ -104,9 +106,9 @@ TEMPLATE_DIRS = (
 
 INSTALLED_APPS = (
     'django.contrib.auth',
+    'django.contrib.admin',
     'django.contrib.contenttypes',
     'django.contrib.sessions',
     'django.contrib.sites',
-    'django.contrib.admin',
     'gracedb.gracedb',
 )
diff --git a/settings_dev.py b/settings_dev.py
index 2f764cc87..8baa7da37 100644
--- a/settings_dev.py
+++ b/settings_dev.py
@@ -32,7 +32,9 @@ DATABASE_PORT = ''             # Set to empty string for default.
 # although not all choices may be available on all operating systems.
 # If running in a Windows environment this must be set to the same as your
 # system time zone.
+
 TIME_ZONE = 'America/Chicago'
+GRACE_DATETIME_FORMAT = 'Y-m-d H:i:s T'
 
 # Language code for this installation. All choices can be found here:
 # http://www.i18nguy.com/unicode/language-identifiers.html
diff --git a/templates/feeds/latest_description.html b/templates/feeds/latest_description.html
index 61dd23569..db8d88f78 100644
--- a/templates/feeds/latest_description.html
+++ b/templates/feeds/latest_description.html
@@ -1,6 +1,7 @@
+{% load timeutil %}
 <ul>
     <li><a href="{{ obj.weburl }}">Data</a></li>
     <li><a href="{{ obj.wikiurl }}">TWiki</a></li>
 </ul>
 Sumbmitter: {{ obj.submitter.name }}<br/>
-Created: {{ obj.created }}
+Created: {{ obj.created|utc }}
diff --git a/templates/gracedb/event_detail.html b/templates/gracedb/event_detail.html
index 948220112..c6e8983fa 100644
--- a/templates/gracedb/event_detail.html
+++ b/templates/gracedb/event_detail.html
@@ -1,4 +1,5 @@
 {% extends "base.html" %}
+{% load timeutil %}
 
 {% block title %}View {{ object.graceid }}{% endblock %}
 {% block heading %}View {{ object.graceid }}{% endblock %}
@@ -11,7 +12,8 @@
   <tr><th>Group</th><td>{{ object.group.name }}</td></tr>
   <tr><th>Type</th><td>{{ object.get_analysisType_display }}</td></tr>
 {% if object.gpstime %}
-  <tr><th>GPS Time</th><td>{{ object.gpstime }}</td></tr>
+  <tr><th>GPS Time</th><td>
+        <span title="{{ object.gpstime|gpsdate }}">{{ object.gpstime }}</span></td></tr>
 {% endif %}
   <tr><th>Data</th><td>
     <a href="{{ object.weburl }}">{{ object.weburl }}</a>
@@ -20,7 +22,8 @@
     <a href="{{ object.wikiurl }}">{{ object.wikiurl }}</a>
     </td></tr>
   <tr><th>Sumitter</th><td>{{ object.submitter.name }}</td></tr>
-  <tr><th>Created</th><td>{{ object.created }}</td></tr>
+  <tr><th>Created</th><td>{{ object.created|utc }}
+                          </td></tr>
 </table>
 
 {% if object.eventlog_set.count %}
@@ -34,7 +37,7 @@
     </tr>
   {% for log in object.eventlog_set.iterator %}
     <tr class={% cycle 'odd' 'even' %}>
-        <td>{{ log.created }}</td>
+        <td>{{ log.created|utc }}</td>
         <td>{{ log.issuer }}</td>
         <td><a href="{{ log.fileurl }}">{{ log.filename }}</a></td>
         <td>{{ log.comment }}</td>
diff --git a/templates/gracedb/event_list.html b/templates/gracedb/event_list.html
index f8792f127..5bdac7bed 100644
--- a/templates/gracedb/event_list.html
+++ b/templates/gracedb/event_list.html
@@ -1,4 +1,5 @@
 {% extends "base.html" %}
+{% load timeutil %}
 
 {% block title %}{{ title }}{% endblock %}
 {% block heading %}{{ title }}{% endblock %}
@@ -47,7 +48,9 @@
         <td>{{ obj.submitter }} </td>
         <td>{{ obj.group }} </td>
         <td>{{ obj.get_analysisType_display }} </td>
-        <td>{% if obj.gpstime%}{{ obj.gpstime }}{% endif %}</td>
+        <td>{% if obj.gpstime%}
+                <span title="{{ obj.gpstime|gpsdate }}">{{ obj.gpstime }}</span>
+            {% endif %}</td>
         <td><a href="{{ obj.weburl }}">Web: {{ obj.graceid }}</a></td>
         <td><a href="{{ obj.wikiurl }}">Wiki: {{ obj.graceid }}</a></td>
     </tr>
-- 
GitLab