From a996e829fa8e6b65bbf9335b134ac06701a8a672 Mon Sep 17 00:00:00 2001 From: Branson Stephens <stephenb@uwm.edu> Date: Mon, 14 Jan 2013 16:38:45 -0600 Subject: [PATCH] added fileurl method to slot model --- gracedb/models.py | 8 + templates/gracedb/event_detail.html | 404 ++++++++++++++++++++++++++-- 2 files changed, 393 insertions(+), 19 deletions(-) diff --git a/gracedb/models.py b/gracedb/models.py index d4629b170..5fa451b8a 100644 --- a/gracedb/models.py +++ b/gracedb/models.py @@ -246,3 +246,11 @@ class Slot(models.Model): event = models.ForeignKey(Event) name = models.CharField(max_length=100) value = models.CharField(max_length=100) + + # In case the slot value is not a filename, this will just return None. + def fileurl(self): + if self.value: + return reverse('file', args=[self.event.graceid(), self.value]) + else: + return None + diff --git a/templates/gracedb/event_detail.html b/templates/gracedb/event_detail.html index 114cc8311..a2497a879 100644 --- a/templates/gracedb/event_detail.html +++ b/templates/gracedb/event_detail.html @@ -18,11 +18,12 @@ <link rel="stylesheet" href="{{MEDIA_URL}}css/labeltips.css"> <script type="text/javascript"> var bb = null; - + require(["dijit/Editor", "dojox/editor/plugins/Save", "dojox/editor/plugins/Preview", "dijit/form/Button", + "dijit/TitlePane", "dojox/image/LightboxNano", "dijit/_editor/plugins/TextColor", "dijit/_editor/plugins/LinkDialog", @@ -30,13 +31,14 @@ "dijit/_editor/plugins/NewPage", "dijit/_editor/plugins/FullScreen", "dojo/parser", - "dojo/domReady!"], function (Editor, Save, Preview, Button) { + "dojo/domReady!"], function (Editor, Save, Preview, Button, TitlePane) { dojo.parser.parse(); //var newlogdiv = dojo.byId("newlogdiv"); var logtitle = dojo.byId("logmessagetitle"); var logtext = dojo.byId("newlogtext"); + var usertitle = dojo.byId("usermessagetitle"); var editor_div = dojo.byId("editor"); var preview_div = dojo.byId("previewer"); @@ -44,6 +46,31 @@ dojo.style(preview_div, { 'display':'none'}); dojo.style(editor_div, { 'display':'none'}); + // The new Log entry button. + // XXX We want to get rid of this eventually. + var button_element = dojo.create('button'); + dojo.place(button_element, logtitle, "right"); + var button = new Button({ + label: "Add Log Entry", + state: "add", + onClick: function(){ + if (this.state == 'add') { + dojo.style(editor_div, {'display':'block'}); + button.set('label', "Cancel Log Entry"); + button.set('state', 'cancel'); + editor.focus(); + } + else { + dojo.style(editor_div, {'display':'none'}); + dojo.style(preview_div, {'display':'none'}); + button.set('label', "Add Log Entry"); + button.set('state', 'add'); + editor.set('value',''); + } + }, + }, button_element); + + // The user info button. var button_element = dojo.create('button'); dojo.place(button_element, logtitle, "right"); var button = new Button({ @@ -112,6 +139,148 @@ 'insertImage','fullscreen','viewsource','newpage', '|', previewbutton, savebutton] }, editor_div); + //---------------------------------------- + // Following section added for TitlePanes. + //---------------------------------------- + + // Load the divs containing individual sets of info. + var pane_holder = dojo.byId("pane_holder"); + var basic_info = dojo.byId("basic_info"); + var neighbors = dojo.byId("neighbors"); + var sky_loc = dojo.byId("sky_loc"); + var sngl_inspiral = dojo.byId("sngl_inspiral"); + var strain_data = dojo.byId("strain_data"); + var noise_curves = dojo.byId("noise_curves"); + var tf_plots = dojo.byId("tf_plots"); + var additional_plots = dojo.byId("additional_plots"); + var cal_info = dojo.byId("cal_info"); + var event_log = dojo.byId("event_log"); + + // This dictionary object will determine the order in which the + // panes are displayed. + var paneDict = { + BAS: { + sourceNode: basic_info, + paneTitle: 'Event Basic Info', + openOnLoad: true, + nonEmpty: true + }, +// SNG: { +// sourceNode: sngl_inspiral, +// paneTitle: 'Individual Detector Info', +// openOnLoad: false, +// nonEmpty: false, +// }, + NEI: { + sourceNode: neighbors, + paneTitle: 'Neighbors', + openOnLoad: false, + {% if nearby %} + nonEmpty: true + {% else %} + nonEmpty: false + {% endif %} + }, + SKY: { + sourceNode: sky_loc, + paneTitle: 'Sky Location', + openOnLoad: false, + {% if object|slot:'^sky' %} + nonEmpty: true + {% else %} + nonEmpty: false + {% endif %} + }, + STR: { + sourceNode: strain_data, + paneTitle: 'Strain Data', + openOnLoad: true, + {% if object|slot:'^strain_plot' or object|slot:'^strain_data' %} + nonEmpty: true + {% else %} + nonEmpty: false + {% endif %} + + }, + NOI: { + sourceNode: noise_curves, + paneTitle: 'Noise Curves', + openOnLoad: false, + {% if object|slot:'^noise_plot' %} + nonEmpty: true + {% else %} + nonEmpty: false + {% endif %} + }, + TIM: { + sourceNode: tf_plots, + paneTitle: 'Time-Frequency Plots', + openOnLoad: false, + {% if object|slot:'^tfplot' %} + nonEmpty: true + {% else %} + nonEmpty: false + {% endif %} + }, + ADD: { + sourceNode: additional_plots, + paneTitle: 'Additional Plots', + openOnLoad: false, + {% if object|slot:'^misc_plot' %} + nonEmpty: true + {% else %} + nonEmpty: false + {% endif %} + }, +// CAL: { +// sourceNode: cal_info, +// paneTitle: 'Calibration Information', +// openOnLoad: false, +// nonEmpty: false +// }, + EVE: { + sourceNode: event_log, + paneTitle: 'Event Log Messages', + openOnLoad: false, + // This guy is always non-empty. Besides, we don't have a slot to check. + nonEmpty: true + } + } + + // Count how many divs actually contain something interesting. + // Decide how many (and which) panes to open based on that. + var openAllNonEmpty = false; + var numNonEmpty = 0; + for (var key in paneDict) { + var obj = paneDict[key]; + if (obj.nonEmpty) { ++numNonEmpty; } + } + if (numNonEmpty < 4) { openAllNonEmpty = true; } + console.debug("numNonEmpty = %d", numNonEmpty); + console.debug("openAllNonEmpty = %s", openAllNonEmpty); + + // Loop over dictionary elements. + // As you can see, the key names aren't that important + // Test variable openAllNonEmpty. + for (var key in paneDict) { + var obj = paneDict[key]; + + var openSwitch = false; + if (openAllNonEmpty && obj.nonEmpty) { + openSwitch = true; + } else if (obj.nonEmpty) { + openSwitch = obj.openOnLoad; + } + + tp = new dijit.TitlePane({title:obj.paneTitle, + content:obj.sourceNode.innerHTML, + open:openSwitch}); + console.debug("appending for key=%s", key); + pane_holder.appendChild(tp.domNode); + // Already extracted the content. So now we can destroy the node. + dojo.destroy(obj.sourceNode); + } + }); </script> @@ -151,6 +320,13 @@ padding: 6px; width: 24px; } + + .dijitTitlePaneTitle { + font-size: 115%; + font-family: "Century Schoolbook L", Georgia, serif; + font-weight: bold; + } + </style> {% endblock %} @@ -158,8 +334,18 @@ <p>{{ message }}</p> <table> +<!-- XXX Branson. Set width="70%" here --> <tr><td valign="top"> +<!-- The pane_holder div basically spans the whole left side of the table. --> +<div id="pane_holder"> + +<!-- ********************************************************************* --> +<!-- Basic Event Info --> +<!-- ********************************************************************* --> +<div id="basic_info"> +{% block basic_info %} + <table class="event"> {% if skyalert_authorized %} <tr><td colspan="4"> @@ -207,9 +393,19 @@ </table> +{% endblock %} +</div> <!-- Here endeth the basic_info div. --> + +<!-- ********************************************************************* --> +<!-- Neighbors --> +<!-- ********************************************************************* --> +<div id="neighbors"> +{% block neighbors %} + {% if nearby %} - <p/> - <h3>Neighbors</h3> + + <!-- <p/> + <h3>Neighbors</h3> --> <table class="event"> <tr> <th valign="top">UID</th> @@ -250,6 +446,170 @@ </table> {% endif %} +{% endblock %} +</div> <!-- End of neighbors div. --> + +<!-- ********************************************************************* --> +<!-- Individual detector info ? Does Brian extract any of this? --> +<!-- Nope. He doesn't. Might be better to leave this as a user --> +<!-- Log entry --> +<!-- ********************************************************************* --> + +<!-- ********************************************************************* --> +<!-- Skymaps --> +<!-- ********************************************************************* --> +<div id="sky_loc"> +{% block sky_loc %} + +{% if object|slot:'^sky' %} <!-- XXX note that this will break if the skymap is a + fits or something and not a plot.--> + <table> <!-- XXX need width="70%" on all these? --> + <tbody> + <tr> + {% for slot in object|slot:'^sky' %} + <!-- absolute width here==bad idea? --> + <td> <img src="{{ slot.fileurl }}" width="350"> </td> + {% endfor %} + </tr> + </tbody> + </table> +{% else %} + <!-- No skymaps available. --> + <p> None available. </p> +{% endif %} +{% endblock %} +</div> <!-- End of sky_loc div. --> + +<!-- ********************************************************************* --> +<!-- Strain data --> +<!-- ********************************************************************* --> +<div id="strain_data"> +{% block strain_data %} + +{% if object|slot:'^strain_plot' %} + <table> + <tbody> + <tr> + <!-- Check for strain plots first --> + {% for slot in object|slot:'^strain_plot' %} + <td><img src="{{slot.fileurl}}" width="350"></td> + {% endfor %} + </tr> + {% if objects|slot:'^strain_data' %} + <tr> + {% for slot in object|slot:'^strain_data' %} + <td><a href="{{slot.fileurl}}">{{slot.value}}</a></td> + {% endfor %} + </tr> + {% endif %} + </tbody> + </table> +{% else %} + <!-- perhaps there are data files even if no plots? --> + {% if objects|slot:'^strain_data' %} + <tr> + {% for slot in object|slot:'^strain_data' %} + <td><a href="{{slot.fileurl}}">{{slot.value}}</a></td> + {% endfor %} + </tr> + {% else %} + <p> None available. </p> + {% endif %} + +{% endif %} +{% endblock %} +</div> <!-- End of strain_data div. --> + +<!-- ********************************************************************* --> +<!-- Noise Curves --> +<!-- ********************************************************************* --> +<div id="noise_curves"> +{% block noise_curves %} + +{% if object|slot:'^noise_plot' %} + <table> + <tbody> + <tr> + {% for slot in object|slot:'^noise_plot' %} + <td><img src="{{slot.fileurl}}" width="350"></td> + {% endfor %} + </tr> + </tbody> + </table> +{% else %} + <p> None available. </p> +{% endif %} + +{% endblock %} +</div> <!-- End of noise_curves div. --> + +<!-- ********************************************************************* --> +<!-- Time-frequency plots --> +<!-- ********************************************************************* --> +<div id="tf_plots"> +{% block tf_plots %} + +{% if object|slot:'^tfplot' %} + <table> + <tbody> + <tr> + {% for slot in object|slot:'^tfplot' %} + <td><img src="{{slot.fileurl}}" width="350"></td> + {% endfor %} + </tr> + </tbody> + </table> +{% else %} + <p> None available. </p> +{% endif %} + +{% endblock %} +</div> <!-- End of tf_plots div. --> + +<!-- ********************************************************************* --> +<!-- Additional plots --> +<!-- ********************************************************************* --> +<div id="additional_plots"> +{% block additional_plots %} + +{% if object|slot:'^misc_plot' %} + <table> + <tbody> + <tr> + {% for slot in object|slot:'^misc_plot' %} + <td><img src="{{slot.fileurl}}" width="350"></td> + {% endfor %} + </tr> + </tbody> + </table> +{% else %} + <p> None available. </p> +{% endif %} + +{% endblock %} +</div> <!-- End of additional_plots div. --> + +<!-- ********************************************************************* --> +<!-- Calibration Info --> +<!-- ********************************************************************* --> +<!-- Use Javascript file API to read in the file and parse it somehow? --> +<div id="cal_info"> +{% block cal_info %} + +{% if object|slot:'^cal_data' %} + <p> Calibration table not implemented yet. </p> +{% endif %} + +{% endblock %} +</div> <!-- End of additional_plots div. --> + +<!-- ********************************************************************* --> +<!-- Event Log Messages --> +<!-- ********************************************************************* --> + +<div id="event_log"> +{% block event_log %} + <noscript> <h3>Create a new log entry</h3> <form id="newlog" action="{% url logentry object.graceid "" %}" method="POST"> @@ -258,9 +618,10 @@ </form> </noscript> - - <p/> - <h3 id="logmessagetitle">Event Log Messages</h3> + <!-- <p/> + <h3 id="logmessagetitle">Event Log Messages</h3> --> + <!-- Empty div here serves as a marker for the button location --> + <div id="logmessagetitle"></div> <div id="previewer"></div> <div id="editor"></div> @@ -292,28 +653,33 @@ </table> {% endif %} +{% endblock %} +</div> <!--End of log messages div--> + +</div> <!--Here ends the pane_holder div--> + </td> + +<!-- ********************************************************************* --> +<!-- ********************************************************************* --> +<!-- Right hand side of table: User-submitted info. --> +<!-- ********************************************************************* --> +<!-- ********************************************************************* --> <td rowspan="2" valign="top"> -{% if eventdesc %} +<!-- Subsuming this info into tables. Now redundant. --> +<!-- {% if eventdesc %} <h3>Event Log File</h3> {{ eventdesc }} <br/> -{% endif %} +{% endif %} --> -{% if userdesc %} - <br/> +{# {% if userdesc %} #} +<!-- <br/> --> <h3>User Info</h3> {{ userdesc }} <br/> -{% endif %} - -<!-- Branson messing around --!> -<br/><br/> -{% if object|slot:"skymap" %} -<h3>The skymap file name is</h3> -{{ object|slot:"skymap" }} -{% endif %} +{# {% endif %} #} </td></tr></table> {% endblock %} -- GitLab