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 — 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>< {{ 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>< {{ 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