From f88ef84999900f99a5b037e611708cb97aa03ab3 Mon Sep 17 00:00:00 2001 From: Brian Moe <lars@moe.phys.uwm.edu> Date: Wed, 16 Dec 2009 15:46:04 -0600 Subject: [PATCH] Query mods -- especially guided query. Guided query - results now display equivalent text query, if possible - results now include number of events listed - initially hidden, becomes visible on click Some display fiddling - hints and current query link more visible, less ugly (imho) - stuff lines up better --- gracedb/models.py | 7 +++++++ gracedb/query.py | 3 ++- gracedb/views.py | 28 +++++++++++++++++++++++++- templates/gracedb/event_list.html | 17 ++++++++++++++-- templates/gracedb/query.html | 10 ++++----- templates/gracedb/query_help_frag.html | 1 - 6 files changed, 55 insertions(+), 11 deletions(-) diff --git a/gracedb/models.py b/gracedb/models.py index 910e8e07a..0fb74fc60 100644 --- a/gracedb/models.py +++ b/gracedb/models.py @@ -112,6 +112,13 @@ class Event(models.Model): gps_time = int(posixToGpsTime(posix_time)) return gps_time - self.gpstime + @classmethod + def getTypeLabel(cls, code): + for key, label in cls.ANALYSIS_TYPE_CHOICES: + if (key == code) or (code == label): + return label + raise KeyError("Unknown analysis type code: %s" % code) + @classmethod def getByGraceid(cls, id): if id[0] not in "GH": diff --git a/gracedb/query.py b/gracedb/query.py index d326b3f6f..2ce6fba52 100644 --- a/gracedb/query.py +++ b/gracedb/query.py @@ -122,7 +122,8 @@ labelQ_ = operatorPrecedence(label, (andop, 2, opAssoc.LEFT, lambda a,b,toks: reduce(Q.__and__, toks[0].asList(), Q())), ]).setParseAction(lambda toks: toks[0]) -labelQ = labelQ_.copy().setParseAction(lambda toks: ("label", toks[0])) +labelQ = (Optional(Suppress(Keyword("label:"))) + labelQ_.copy()) +labelQ.setParseAction(lambda toks: ("label", toks[0])) q = (gidQ | hidQ | atypeQ | groupQ | labelQ | createdQ | gpsQ).setName("query term") diff --git a/gracedb/views.py b/gracedb/views.py index 3ded9ed9d..e2e944c85 100644 --- a/gracedb/views.py +++ b/gracedb/views.py @@ -450,6 +450,8 @@ def oldsearch(request): gpsStart = form.cleaned_data['gpsStart'] gpsEnd = form.cleaned_data['gpsEnd'] + textQuery = [] + if not groupname: # don't show test events unless explicitly requested # Scales? Or should we find test group and do group= ? @@ -474,30 +476,54 @@ def oldsearch(request): objects = objects.filter(id__lte=int(end[1:])) objects = objects.filter(uid="") + if start and end: + textQuery.append("gid: %s..%s" % (start, end)) + if gpsStart != None or gpsEnd != None : if gpsStart == gpsEnd: objects = objects.filter(gpstime=gpsStart) + textQuery.append("gpstime: %s" % gpsStart) else: if gpsStart != None: objects = objects.filter(gpstime__gte=gpsStart) if gpsEnd != None: objects = objects.filter(gpstime__lte=gpsEnd) + if gpsStart and gpsEnd: + textQuery.append("gpstime: %s .. %s" % (gpsStart, gpsEnd)) + elif gpsStart: + textQuery.append("gpstime: %s..2000000000" % gpsStart) + else: + textQuery.append("gpstime: 0..%s" % gpsEnd) if submitter: objects = objects.filter(submitter=submitter) if groupname: group = Group.objects.filter(name=groupname)[0] objects = objects.filter(group=group) + textQuery.append("group: %s" % group.name) if typename: objects = objects.filter(analysisType=typename) + textQuery.append("type: %s" % Event.getTypeLabel(typename)) if labels: objects = objects.filter(labels__in=labels) + textQuery.append("label: %s" % " ".join([ + Label.objects.filter(id=l)[0].name for l in labels])) # Need this because events with multiple labels can appear multiple times! objects = objects.distinct() - return object_list(request, objects, extra_context={'title':"Query Results"}) + extra_context = {'title':"Query Results. %s event(s)" % objects.count()} + if not submitter and (not (start or end) or (start and end)): + # ugh. there is no submitter option in text query + # Also, text query needs both ends of a graceid search + # Sooo.... set up a simple search form... + textQuery = " ".join(textQuery) + extra_context['queryLink'] = reverse(search)+"?query="+escape(textQuery) + simple_form = SimpleSearchForm({'query': textQuery}) + extra_context['form'] = simple_form + + return object_list(request, objects, extra_context=extra_context) return render_to_response('gracedb/query.html', diff --git a/templates/gracedb/event_list.html b/templates/gracedb/event_list.html index 169706f0d..25d5f4529 100644 --- a/templates/gracedb/event_list.html +++ b/templates/gracedb/event_list.html @@ -23,11 +23,24 @@ {% block content %} <p>{{ message }}</p> +{% for field in form %} +{% endfor %} + {% if form %} <form action="{{ formAction }}"method="POST"> - {{ form.as_table }} <a href="{{queryLink}}">Link</a> + <table> + {{ form.as_table }} + <tr><td/> + <td> + <a onClick="toggle_visibility('hints');">Hints on querying</a> + {% if queryLink %} + | <a href="{{queryLink}}">Link to current query</a> + {% endif %} + </td> + </tr> + <tr><td/><td>{% include "gracedb/query_help_frag.html" %}</td></tr> + </table> </form> - {% include "gracedb/query_help_frag.html" %} {% endif %} {% if object_list.count %} diff --git a/templates/gracedb/query.html b/templates/gracedb/query.html index 0c2d57335..b687a59a8 100644 --- a/templates/gracedb/query.html +++ b/templates/gracedb/query.html @@ -23,19 +23,17 @@ <form method="POST"> <table> {{ form.as_table }} - <tr><td></td><td><input type="Submit"/></td></tr> - <tr><td></td> - <td>{% include "gracedb/query_help_frag.html" %}</td> + <tr><td/><td><a onClick="toggle_visibility('hints');">Hints on querying</a></td> </tr> + <tr><td/><td>{% include "gracedb/query_help_frag.html" %}</td></tr> </table> </form> <!-- Old style Query --> {% if form2 %} -<hr/> -<h4>Simple Query</h4> -<div id="hiddenqueryform" class=hideableForm> +<a><h3 onClick="toggle_visibility('hiddenqueryform');">Guided Query</h3></a> +<div id="hiddenqueryform" style="display: none;"> <form method="POST"> <table> {{ form2.as_table }} diff --git a/templates/gracedb/query_help_frag.html b/templates/gracedb/query_help_frag.html index 10e9e8952..6ee13d61b 100644 --- a/templates/gracedb/query_help_frag.html +++ b/templates/gracedb/query_help_frag.html @@ -1,5 +1,4 @@ -<a onClick="toggle_visibility('hints');">Hints on querying:</a> <div id="hints" style="display: none;"> <h5>By GPS Time</h5> Specifiy an exact GPS time, or a range. -- GitLab