diff --git a/gracedb/templatetags/timeutil.py b/gracedb/templatetags/timeutil.py index 07f1827cd4a3259796b540092b24d8a91150e334..7a804249a3e3a1bb12d427ca6aabe4bc1a47fdd3 100644 --- a/gracedb/templatetags/timeutil.py +++ b/gracedb/templatetags/timeutil.py @@ -3,33 +3,127 @@ from django import template from django.conf import settings from django.utils import dateformat +from django.utils.html import conditional_escape +from django.utils.safestring import mark_safe + + import pytz +import time +import datetime # 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) +SERVER_TZ = pytz.timezone(settings.TIME_ZONE) + +LLO_TZ = pytz.timezone("America/Chicago") +LHO_TZ = pytz.timezone("America/Los_Angeles") +VIRGO_TZ = pytz.timezone("Europe/Rome") register = template.Library() +# OK. What we're trying to do here is, +# given a time in some time system, gps, posix, datetime, whatever, +# produce something that will render in a desired manner and will +# be javascript-convertible to other formats/timezones/what-have-you. +# +# So... these filters, which are named after their timekeeping system, +# will convert from that time system, to ... +# <time value="POSIX TIME VALUE" [label="LABEL"]>FORMATTED TIME</time> + +@register.filter +def multiTime(t, label, autoescape=None): + format = FORMAT + + if autoescape: + esc = conditional_escape + else: + esc = lambda x: x + + if label is not None: + label_attr = ' name="time-%s"' % esc(label) + else: + label_attr = "" + + if isinstance(t, datetime.datetime): + dt = t + if not dt.tzinfo: + dt = SERVER_TZ.localize(dt) + dt = dt.astimezone(pytz.utc) + posix_time = time.mktime(dt.timetuple()) + gps_time = int(posixToGpsTime(posix_time)) + elif isinstance(t, int) or isinstance(t, long): + gps_time = t + dt = gpsToUtc(t) + posix_time = time.mktime(dt.timetuple()) + else: + raise ValueError("time must be type int, long or datetime, not '%s'" % type(t)) + + # JavaScript -- parsable by Date() object constructor + # "Jan 2, 1985 00:00:00 UTC" + js_parsable_time = esc(dateformat.format(dt, "F j, Y h:i:s")+" UTC") + + lho_time = esc(dateformat.format(dt.astimezone(LHO_TZ), format)) + llo_time = esc(dateformat.format(dt.astimezone(LLO_TZ), format)) + virgo_time = esc(dateformat.format(dt.astimezone(VIRGO_TZ), format)) + utc_time = esc(dateformat.format(dt, format)) + + if isinstance(t, datetime.datetime): + display_time = utc_time + else: + display_time = gps_time + + rv = '<time utc="%s" gps="%s" llo="%s" lho="%s" virgo="%s" jsparsable="%s"%s>%s</time>' % \ + (utc_time, gps_time, llo_time, lho_time, virgo_time, js_parsable_time, label_attr, display_time) + + return mark_safe(rv) +multiTime.needs_autoescape = True + + +@register.filter +def timeselect(label, default, autoescape=None): + if autoescape: + esc = conditional_escape + else: + esc = lambda x: x + rv = """<form><select onChange="changeTime(this, '%s')">""" % esc(label) + for value, displayname in [ + ("gps", "GPS Time"), + ("llo", "LLO Local"), + ("lho", "LHO Local"), + ("virgo", "Virgo Local"), + ("utc", "UTC"),]: + selected = "" + if value == default: + selected = " SELECTED" + rv += '<option value="%s"%s>%s</option>' % (esc(value), selected, esc(displayname)) + rv += "</select></form>" + return mark_safe(rv) +timeselect.needs_autoescape = True + + @register.filter(name='utc') def utc(dt, format=FORMAT): if not dt.tzinfo: - dt = LOCAL_TZ.localize(dt) + dt = SERVER_TZ.localize(dt) dt = dt.astimezone(pytz.utc) return dateformat.format(dt, format) -@register.filter(name='gpsdate') + +@register.filter def gpsdate(gpstime, format=FORMAT): - return dateformat.format(gpsToUTC(gpstime), format) + return dateformat.format(gpsToUtc(gpstime), format) +# TAG that generates stuff that changes time display what-nots. + # 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. +# Also, there are almost certainly failing edge cases at leap second adjustment times. import calendar, datetime @@ -60,6 +154,15 @@ def gpsToPosixTime(gpsTime): t = t - 1 return t -def gpsToUTC(gpsTime): +def posixToGpsTime(posixTime): + change = 0 + for leap in leapSeconds: + if posixTime > leap: + change += 1 + return posixTime + change - gpsEpoch + +def gpsToUtc(gpsTime): t = gpsToPosixTime(gpsTime) return datetime.datetime.fromtimestamp(t, pytz.utc) + + diff --git a/gracedb/translator.py b/gracedb/translator.py index 45ff6b71e3aef72b3dbac5f796231cdbfa56f2cb..7863d02ff5e0a1a630bf43fb947fa990ae28ac1e 100644 --- a/gracedb/translator.py +++ b/gracedb/translator.py @@ -109,7 +109,7 @@ def handle_uploaded_data(event, datafilename, event.save() - if event.analysisType == 'MBTA': + elif event.analysisType == 'MBTA': #here's how it works for inspirals #populate the tables #xmldoc, log_data, temp_data_loc = populate_inspiral_tables("MbtaFake-930909680-16.gwf") @@ -214,7 +214,28 @@ def handle_uploaded_data(event, datafilename, event.coincEvent_id = insert_ligolw_tables(xml_filename) event.save() + elif event.analysisType == 'CWB': + try: + f = open(datafilename, "r") + for line in f.readlines(): + if line.startswith("time:"): + times = line.split() + event.gpstime = int(float(times[1])) + event.save() + break + f.close() + except: + pass + log = EventLog(event=event, + filename=os.path.basename(datafilename), + issuer=event.submitter, + comment="Original Data") + log.save() else: - pass + log = EventLog(event=event, + filename=os.path.basename(datafilename), + issuer=event.submitter, + comment="Original Data") + log.save() return temp_data_loc diff --git a/gracedb/views.py b/gracedb/views.py index b31e7c364a7b5bc3a706725168aef7584c3abe8e..626e8921e7c2ee1befdbdbe46c8c15d8d93c7701 100644 --- a/gracedb/views.py +++ b/gracedb/views.py @@ -90,7 +90,8 @@ def _create(request): #rv['error'] = msg rv['error'] = "" for key in form.errors: - rv['error'] += "%s: %s\n" % (key, "/".join(form.errors[key])) + #rv['error'] += "%s: %s\n" % (key, "/".join(form.errors[key])) + rv['error'] += "%s: %s\n" % (key, form.errors[key]) return rv def _createEventFromForm(request, form): diff --git a/templates/base.html b/templates/base.html index e4762cb093cc2ca570595877c7eb194a137ec49c..551c3140478f9089ee4b0af8d680229aa1b199c0 100644 --- a/templates/base.html +++ b/templates/base.html @@ -4,6 +4,19 @@ <head> <link rel="stylesheet" href="/gracedb-static/css/style.css" /> <title>GraceDb | {% block title %}{% endblock %}</title> +<!-- START TESTING --> +<script type="text/javascript"> +function changeTime(obj, label) { + var timetype= obj[obj.selectedIndex].value; + if (timetype=="") { return; } + var times = document.getElementsByName("time-"+label); + for (i=0; i<times.length; i++) { + newtime = times[i].getAttribute(timetype); + times[i].innerHTML = newtime; + } +} +</script> +<!-- END TESTING --> </head> <body id="{% block pageid %}{% endblock %}"> diff --git a/templates/gracedb/event_detail.html b/templates/gracedb/event_detail.html index 5070ecb80474691fafdf1bdfa667ddffd5b92c6b..ae69f7250f173f758ff13709e6cede59124d8114 100644 --- a/templates/gracedb/event_detail.html +++ b/templates/gracedb/event_detail.html @@ -12,8 +12,10 @@ <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> - <span title="{{ object.gpstime|gpsdate }}">{{ object.gpstime }}</span></td></tr> + <tr><th>Event Time {{ "gps"|timeselect:"gps" }}</th> + <!-- <td><span title="{{ object.gpstime|gpsdate }}">{{ object.gpstime }}</span></td> --> + <td>{{ object.gpstime|multiTime:"gps" }}</td> + </tr> {% endif %} <tr><th>Data</th><td> <a href="{{ object.weburl }}">{{ object.weburl }}</a> @@ -22,7 +24,7 @@ <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|utc }} + <tr><th>Created{{ "created"|timeselect:"utc" }}</th><td>{{ object.created|multiTime:"created" }} </td></tr> <tr><th>Tags</th><td> {% for tag in object.get_tags %} @@ -35,14 +37,14 @@ <h3>Log Entries:</h3> <table> <tr> - <th>Date</th> + <th>Date {{ "logtime"|timeselect:"utc" }}</th> <th>Submitter</th> <th>File</th> <th>Comment</th> </tr> {% for log in object.eventlog_set.iterator %} <tr class={% cycle 'odd' 'even' %}> - <td>{{ log.created|utc }}</td> + <td>{{ log.created|multiTime:"logtime" }}</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 5bdac7bed938cee8e02d1f72c765a517e8e3d3ae..becca4235c4237996e9f225d4f0fc2b3de9e0046 100644 --- a/templates/gracedb/event_list.html +++ b/templates/gracedb/event_list.html @@ -19,7 +19,7 @@ <th>Submitter</th> <th>Group</th> <th>Type</th> - <th>GPS Time</th> + <th>Event Time {{ "gps"|timeselect:"gps" }}</th> <th>Web</th> <th>Wiki</th> </tr> @@ -49,7 +49,8 @@ <td>{{ obj.group }} </td> <td>{{ obj.get_analysisType_display }} </td> <td>{% if obj.gpstime%} - <span title="{{ obj.gpstime|gpsdate }}">{{ obj.gpstime }}</span> + <!-- <span title="{{ obj.gpstime|gpsdate }}">{{ obj.gpstime }}</span> --> + {{ obj.gpstime|multiTime:"gps" }} {% endif %}</td> <td><a href="{{ obj.weburl }}">Web: {{ obj.graceid }}</a></td> <td><a href="{{ obj.wikiurl }}">Wiki: {{ obj.graceid }}</a></td>