From c00eb748abf095b01fb60f1b319d001e287c3008 Mon Sep 17 00:00:00 2001
From: Tanner Prestegard <tanner.prestegard@ligo.org>
Date: Fri, 25 May 2018 11:29:57 -0500
Subject: [PATCH] adding file list and file download views for superevents

---
 gracedb/superevents/urls.py                  |  6 ++++
 gracedb/superevents/views.py                 | 30 +++++++++++++++++++-
 gracedb/templates/superevents/file_list.html | 15 ++++++++++
 gracedb/templates/superevents/view.html      |  8 ++++--
 4 files changed, 55 insertions(+), 4 deletions(-)
 create mode 100644 gracedb/templates/superevents/file_list.html

diff --git a/gracedb/superevents/urls.py b/gracedb/superevents/urls.py
index 20f051016..d15d0fc3e 100644
--- a/gracedb/superevents/urls.py
+++ b/gracedb/superevents/urls.py
@@ -12,4 +12,10 @@ urlpatterns = [
         regex=Superevent.ID_REGEX), views.webview, name="view"),
     url(r'^create_log/(?P<superevent_id>{regex})/$'.format(
         regex=Superevent.ID_REGEX), views.web_create_log, name="create-log"),
+
+    # Files
+    url(r'^(?P<superevent_id>{regex})/files/$'.format(
+        regex=Superevent.ID_REGEX), views.file_list, name="file-list"),
+    url(r'^(?P<superevent_id>{regex})/files/(?P<filename>.*)$'.format(
+        regex=Superevent.ID_REGEX), views.file_download, name="file-download"),
 ]
diff --git a/gracedb/superevents/views.py b/gracedb/superevents/views.py
index 5d6dfbcfd..1e5d5016b 100644
--- a/gracedb/superevents/views.py
+++ b/gracedb/superevents/views.py
@@ -2,12 +2,13 @@ from django.http import HttpResponse, HttpResponseRedirect, Http404
 from django.shortcuts import render
 from django.urls import reverse
 from django.utils.html import escape
-from django.views.decorators.http import require_POST
+from django.views.decorators.http import require_POST, require_GET
 
 from .models import Superevent, Log
 from .forms import LogCreateForm
 from .utils import get_superevent_by_date_id_or_404
 
+from core.http import check_and_serve_file
 from core.vfile import VersionedFile
 from events.permission_utils import internal_user_required, is_external
 
@@ -135,3 +136,30 @@ def web_create_log(request, superevent_id):
     # Return to superevent page
     return HttpResponseRedirect(reverse('superevents:view',
         args=[superevent_id]))
+
+
+# TODO:
+# filter files for external users (see how this is done for events)
+def file_list(request, superevent_id):
+    superevent = get_superevent_by_date_id_or_404(request, superevent_id)
+    file_list = superevent.list_files(absolute_paths=False)
+
+    context = {
+        'file_list': file_list,
+        'title': 'Files for {0}'.format(superevent.superevent_id),
+        'superevent_id': superevent.superevent_id,
+    }
+    return render(request, 'superevents/file_list.html', context=context)
+
+# TODO:
+# add permission checking
+def file_download(request, superevent_id, filename):
+
+    # Get superevent
+    superevent = get_superevent_by_date_id_or_404(request, superevent_id)
+
+    # Construct absolute path to file
+    file_path = os.path.join(superevent.datadir, filename)
+
+    # Check file and serve it
+    return check_and_serve_file(request, file_path, ResponseClass=HttpResponse)
diff --git a/gracedb/templates/superevents/file_list.html b/gracedb/templates/superevents/file_list.html
new file mode 100644
index 000000000..347ca2c48
--- /dev/null
+++ b/gracedb/templates/superevents/file_list.html
@@ -0,0 +1,15 @@
+{% extends "base.html" %}
+{% block title %}{{ title }}{% endblock %}
+{% block heading %}{{ title }}{% endblock %}
+{% block pageid %}Superevent files{% endblock %}
+
+{% block content %}
+<p>{{ message }}</p>
+
+<ul>
+{% for filename in file_list %}
+<li><a href="{% url "superevents:file-download" superevent_id filename %}">{{ filename }}</a></li>
+{% endfor %}
+</ul>
+
+{% endblock %}
diff --git a/gracedb/templates/superevents/view.html b/gracedb/templates/superevents/view.html
index 23f3f8565..bd0099376 100644
--- a/gracedb/templates/superevents/view.html
+++ b/gracedb/templates/superevents/view.html
@@ -13,9 +13,9 @@
 
 TBD:
 <ul style="padding-bottom: 30px;">
-<li>javascript update for labels</li>
-<li>link for log message files, make sure to link to correct file version</li>
-<li>event log tagging</li>
+<li>Javascript update for labels</li>
+<li>Log messages should display links for files (make sure to link to correct version)</li>
+<li>Event log tagging from web interface</li>
 </ul>
 
 <div id='event_detail_content'>
@@ -29,6 +29,7 @@ TBD:
         <th>Preferred Event</th>
         <th>GW events</th>
         <th>External events</th>
+        <th>Links</th>
     </tr>
     <tr>
         <td>{{ superevent.superevent_id }}</td>
@@ -56,6 +57,7 @@ TBD:
             {% endfor %}
             </div>
         </td>
+        <td><a href="{% url "superevents:file-list" superevent.superevent_id %}">Data</a></td>
     </tr>
 </table>
 {% endblock %}
-- 
GitLab