From 5acca599a23264f4a425250cb974ecea2d463807 Mon Sep 17 00:00:00 2001
From: Tanner Prestegard <tanner.prestegard@ligo.org>
Date: Wed, 27 Jun 2018 09:06:39 -0500
Subject: [PATCH] Adding new 'latest' page for events/superevents

New /latest/ page includes events and superevents. We also
move the old events 'latest' page to /events/latest/, changed the
view name, and fixed reverses to that page appropriately.
---
 config/settings/base.py                      |   3 +
 config/urls.py                               |   2 +-
 gracedb/events/urls.py                       |   6 +-
 gracedb/search/views.py                      |  48 +++++++
 gracedb/templates/gracedb/event_list.html    |   8 +-
 gracedb/templates/gracedb/latest.html        |   2 +-
 gracedb/templates/gracedb/latest_public.html |   2 +-
 gracedb/templates/search/latest.html         | 140 +++++++++++++++++++
 gracedb/templates/search/query.html          |   2 +-
 9 files changed, 204 insertions(+), 9 deletions(-)
 create mode 100644 gracedb/templates/search/latest.html

diff --git a/config/settings/base.py b/config/settings/base.py
index 5af015b57..de9fe50ab 100644
--- a/config/settings/base.py
+++ b/config/settings/base.py
@@ -25,6 +25,9 @@ DEBUG = False
 # Set to off by default
 MAINTENANCE_MODE = False
 
+# Number of results to show on latest page
+LATEST_RESULTS_NUMBER = 50
+
 # Used for running unit tests
 TEST_RUNNER = 'django.test.runner.DiscoverRunner'
 
diff --git a/config/urls.py b/config/urls.py
index 34f7aebe9..4ea8f2ff0 100644
--- a/config/urls.py
+++ b/config/urls.py
@@ -36,7 +36,7 @@ urlpatterns = [
     url(r'^reports/$', events.reports.histo, name="reports"),
     url(r'^reports/cbc_report/(?P<format>(json|flex))?$',
         events.reports.cbc_report, name="cbc_report"),
-    url(r'^latest', events.views.latest, name="latest"),
+    url(r'^latest/$', search.views.latest, name="latest"),
     #(r'^reports/(?P<path>.+)$', 'django.views.static.serve',
     #        {'document_root': settings.LATENCY_REPORT_DEST_DIR}),
     url(r'^search/$', search.views.search, name="mainsearch"),
diff --git a/gracedb/events/urls.py b/gracedb/events/urls.py
index 8102840e8..fedad1a4a 100644
--- a/gracedb/events/urls.py
+++ b/gracedb/events/urls.py
@@ -10,7 +10,6 @@ from . import views
 urlpatterns = [
     url(r'^$', views.index, name="home-events"),
     url(r'^create/$', views.create, name="create"),
-    url(r'^search/(?P<format>(json|flex))?$', views.search, name="search"),
     url(r'^(?P<graceid>[GEHMT]\d+)/view/$', views.view, name="view"),
     url(r'^(?P<graceid>[GEHMT]\d+)/voevent/$', views.voevent, name="voevent"),
     #url (r'^skyalert/(?P<graceid>[GEHMT]\d+)', 'skyalert', name="skyalert"),
@@ -35,6 +34,11 @@ urlpatterns = [
     url(r'^(?P<graceid>[GEHMT]\d+)/log/(?P<num>\d+)/tag/(?P<tagname>.*)$',
         views.taglogentry, name="taglogentry"),
 
+    # old event-only searches
+    url(r'^latest/$', views.latest, name="eventlatest"),
+    url(r'^search/(?P<format>(json|flex))?$', views.search,
+        name="eventsearch"),
+
     # Legacy URLs
     url(r'^view/(?P<graceid>[GEHMT]\d+)', views.view, name="legacyview"),
     url(r'^(?P<graceid>[GEHMT]\d+)$', views.view, name="legacyview2"),
diff --git a/gracedb/search/views.py b/gracedb/search/views.py
index 82e087ea8..c5a143ce3 100644
--- a/gracedb/search/views.py
+++ b/gracedb/search/views.py
@@ -1,3 +1,5 @@
+from django import forms
+from django.conf import settings
 from django.http import HttpResponse, HttpResponseRedirect
 from django.shortcuts import render
 from django.urls import reverse
@@ -8,9 +10,12 @@ from .forms import MainSearchForm
 from .utils import get_search_results_as_ligolw
 from core.http import check_and_serve_file
 
+from events.models import Event
 from events.view_utils import flexigridResponse as events_flex
+from superevents.models import Superevent
 from superevents.search_flex import flexigridResponse as superevents_flex
 
+
 import os
 import logging
 logger = logging.getLogger(__name__)
@@ -64,3 +69,46 @@ def search(request):
     context['form'] = form
 
     return render(request, 'search/query.html', context=context)
+
+
+@require_GET
+def latest(request):
+
+    # Set up context
+    context = {}
+
+    if "query" in request.GET:
+        form = MainSearchForm(request.GET)
+    else:
+        form = MainSearchForm({'query': "", 'query_type': 'E'})
+
+    # Hide get_neighbors widget
+    form.fields['get_neighbors'].widget = forms.HiddenInput()
+
+    if form.is_valid():
+        objects = form.cleaned_data.get('query')
+        query_type = form.cleaned_data.get('query_type')
+        get_neighbors = form.cleaned_data.get('get_neighbors')
+
+        # TODO
+        # Add some select_related stuff here!!
+
+        # TODO:
+        # Filter objects for user
+        context['title'] = "Query results"
+        context['raw_query'] = request.GET.get('query')
+        context['get_neighbors'] = get_neighbors
+
+        # Determine object type and order by id (equivalent to
+        # ordering by creation time and might be faster)
+        if query_type == 'E':
+            objects_key = 'events'
+        elif query_type == 'S':
+            objects_key = 'superevents'
+        context[objects_key] = \
+            objects.order_by('-id')[:settings.LATEST_RESULTS_NUMBER]
+
+    # Update form to have query and errors (if they exist)
+    context['form'] = form
+
+    return render(request, 'search/latest.html', context=context)
diff --git a/gracedb/templates/gracedb/event_list.html b/gracedb/templates/gracedb/event_list.html
index 20d52a468..67b137003 100644
--- a/gracedb/templates/gracedb/event_list.html
+++ b/gracedb/templates/gracedb/event_list.html
@@ -50,9 +50,9 @@
             {
             sortable: true,
             {% if get_neighbors %}
-            url: '{% url "search" %}flex?query={{rawquery|urlencode}}&get_neighbors=true',
+            url: '{% url "eventsearch" %}flex?query={{rawquery|urlencode}}&get_neighbors=true',
             {% else %}
-            url: '{% url "search" %}flex?query={{rawquery|urlencode}}',
+            url: '{% url "eventsearch" %}flex?query={{rawquery|urlencode}}',
             {% endif %}
             datatype: 'json',
             mtype: "GET",
@@ -121,8 +121,8 @@
             <td>
                 <a onClick="toggle_visibility('hints');">Hints on querying</a>
                 {% if rawquery %}
-                    | <a href="{% url "search" %}?query={{rawquery|urlencode}}">Link to current query</a>
-                    | <a href="{% url "search" %}?query={{rawquery|urlencode}}&ligolw">Download LIGOLW File</a>
+                    | <a href="{% url "eventsearch" %}?query={{rawquery|urlencode}}">Link to current query</a>
+                    | <a href="{% url "eventsearch" %}?query={{rawquery|urlencode}}&ligolw">Download LIGOLW File</a>
                 {% endif %}
             </td>
         </tr>
diff --git a/gracedb/templates/gracedb/latest.html b/gracedb/templates/gracedb/latest.html
index 0023f3be9..c4098c5fc 100644
--- a/gracedb/templates/gracedb/latest.html
+++ b/gracedb/templates/gracedb/latest.html
@@ -11,7 +11,7 @@
 {% block jscript %}
 
 {% if not error %}
-    <meta http-equiv="refresh" content="300;url={% url "latest" %}/?query={{rawquery|urlencode}}">
+    <meta http-equiv="refresh" content="300;url={% url "eventlatest" %}/?query={{rawquery|urlencode}}">
 {% endif %}
 
     {# http/https depending on this pages' protocol #}
diff --git a/gracedb/templates/gracedb/latest_public.html b/gracedb/templates/gracedb/latest_public.html
index 833eef2d0..152b40f6d 100644
--- a/gracedb/templates/gracedb/latest_public.html
+++ b/gracedb/templates/gracedb/latest_public.html
@@ -11,7 +11,7 @@
 {% block jscript %}
 
 {% if not error %}
-    <meta http-equiv="refresh" content="300;url={% url "latest" %}/?query={{rawquery|urlencode}}">
+    <meta http-equiv="refresh" content="300;url={% url "eventlatest" %}/?query={{rawquery|urlencode}}">
 {% endif %}
 
     {# http/https depending on this pages' protocol #}
diff --git a/gracedb/templates/search/latest.html b/gracedb/templates/search/latest.html
new file mode 100644
index 000000000..958ab8a71
--- /dev/null
+++ b/gracedb/templates/search/latest.html
@@ -0,0 +1,140 @@
+{% extends "base.html" %}
+
+{% load timeutil %}
+{% load scientific %}
+
+{% block title %}Latest{% endblock %}
+{% block heading %}Latest &mdash; as of {% now "j F Y H:i:s T" %}{% endblock %}
+{% block pageid %}latest{% endblock %}
+
+
+{% block headcontents %}
+    {{ block.super }}
+{% if not form.errors %}
+    <meta http-equiv="refresh" content="300;url={{ request.build_absolute_uri }}">
+{% endif %}
+{% endblock %}
+
+{% block content %}
+<!-- Search form -->
+<form method="GET" name="search_form">
+    <table>
+        {{ form.as_table }}
+    <tr><td></td><td><input type="Submit" value="Search" class="searchButtonClass"></td></tr>
+    </table>
+</form>
+
+{% if events %}
+<!-- Event listing -->
+<table class="event">
+    <tr>
+        <th valign="top">UID</th>
+        <th>Labels</th>
+        <th>Group</th>
+        <th>Pipeline</th>
+        <th>Search</th>
+        <th>
+            {{ "gps"|timeselect:"gps" }}
+            Event Time
+        </th>
+        <th>Instruments</th>
+        <th>FAR (Hz)</th>
+        <th>Latency (sec)</th>
+        <th>
+            {{"created"|timeselect:"utc" }}
+            Created
+        </th>
+    </tr>
+
+{% for ev in events %}
+    <tr class={% cycle 'odd' 'even' %}>
+        <td><a href="{% url "view" ev.graceid %}">{{ ev.graceid }}</a></td>
+        <td>
+             {% for labelling in ev.labelling_set.all %}
+                <span title="{{labelling.creator.name}}  {{labelling.created|utc}}" style="color: {{labelling.label.defaultColor}}">{{ labelling.label.name }}</span>
+             {% endfor %}
+        </td>
+        <td>{{ ev.group.name }} </td>
+        <td>{{ ev.pipeline.name }} </td>
+        <td>{{ ev.search.name }} </td>
+        <td>{% if ev.gpstime%}
+                <!-- <span title="{{ ev.gpstime|gpsdate }}">{{ ev.gpstime }}</span> -->
+                {{ ev.gpstime|multiTimeMicroSeconds:"gps" }}
+            {% endif %}</td>
+        <!-- this is a bug. The far should be floored for display purposes. --> 
+        <td>{{ ev.instruments }}</td>
+        {% if user_is_external %}
+            {% if ev.far and ev.far < far_floor %} 
+            <td>&lt; {{ far_floor|scientific }}</td>
+            {% else %}
+            <td>{{ ev.far|scientific }}</td>
+            {% endif %}
+        {% else %}
+        <td>{{ ev.far|scientific }}</td>
+        {% endif %}
+        <td style="text-align:center">{{ ev.reportingLatency }}</td>
+        <td>{{ ev.created|multiTime:"created" }}</td>
+    </tr>
+
+{% endfor %}
+</table>
+
+{% elif superevents %}
+<!-- Superevent listing -->
+<table class="event">
+    <tr>
+        <th valign="top">UID</th>
+        <th>Labels</th>
+        <th>Preferred Event</th>
+        <th>GW Events</th>
+        <th>t_start</th>
+        <th>t_0</th>
+        <th>t_end</th>
+        <th>Preferred event's FAR (Hz)</th>
+        <th>
+            {{"created"|timeselect:"utc" }}
+            Created
+        </th>
+    </tr>
+
+{% for s in superevents %}
+    <tr class={% cycle 'odd' 'even' %}>
+        <td><a href="{% url "superevents:view" s.superevent_id %}">{{ s.superevent_id }}</a></td>
+        <td>
+             {% for labelling in s.labelling_set.all %}
+                <span title="{{labelling.creator.name}}  {{labelling.created|utc}}" style="color: {{labelling.label.defaultColor}}">{{ labelling.label.name }}</span>
+             {% endfor %}
+        </td>
+        <td><a href="{% url "view" s.preferred_event.graceid %}">{{ s.preferred_event.graceid }}</a></td>
+        <td>
+        {% for ev in s.get_internal_events %}
+            {% if forloop.last %}
+                <a href="{% url "view" ev.graceid %}">{{ ev.graceid }}</a>
+            {% else %}
+                <a href="{% url "view" ev.graceid %}">{{ ev.graceid }}</a>,
+            {% endif %}
+        {% endfor %}
+        </td>
+        <td>{{ s.t_start }} </td>
+        <td>{{ s.t_0 }} </td>
+        <td>{{ s.t_end }} </td>
+        {% if user_is_external %}
+            {% if s.preferred_event.far and s.preferred_event.far < far_floor %} 
+            <td>&lt; {{ far_floor|scientific }}</td>
+            {% else %}
+            <td>{{ s.preferred_event.far|scientific }}</td>
+            {% endif %}
+        {% else %}
+        <td>{{ s.preferred_event.far|scientific }}</td>
+        {% endif %}
+        <td>{{ s.created|multiTime:"created" }}</td>
+    </tr>
+
+{% endfor %}
+</table>
+
+{% else %} <!-- !events -->
+<h1>No results.</h1>
+{% endif %} <!-- if eventss -->
+
+{% endblock %}
diff --git a/gracedb/templates/search/query.html b/gracedb/templates/search/query.html
index fcf3d91e9..f35916c72 100644
--- a/gracedb/templates/search/query.html
+++ b/gracedb/templates/search/query.html
@@ -144,7 +144,7 @@ onload="document.search_form.query.focus();"
         {{ form.as_table }}
         <tr><td></td><td><input type="Submit" value="Search" class="searchButtonClass"></td></tr>
         <tr><td></td><td><a onClick="toggle_visibility('hints');">Query help</a>
-        | <a href="{% url "search" %}">Link to old search page</a>
+        | <a href="{% url "eventsearch" %}">Link to old search page</a>
         {% if raw_query %}
             | <a href="{{ request.build_absolute_uri }}">Link to current query</a>
             {% if query_type == 'E' %}
-- 
GitLab