diff --git a/gracedb/models.py b/gracedb/models.py index 910e8e07a96c2fde89d2fefb76d10d066cd61a60..0fb74fc60ae38e867df62d9425b27c0e1cba3a59 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 d326b3f6f5feb952173328369bab31cfea2f0abd..2ce6fba52b887b1882ae5ae34cf839627ff1e6d9 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 3ded9ed9de9bbc481402eabb874898899d98186c..e2e944c850aad2f4420d645461cd9519b333d81d 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 169706f0d4381623f3688424e38473c54258942f..25d5f45299e08470dc940a7e1abc9d36dae3a86d 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 0c2d5733532b78439e4825ad0f93167596560d99..b687a59a8b36310306ad3eef075f79f00e8f4113 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 10e9e8952f448271d2f0a9952ca6cc777abfde17..6ee13d61b30e4b543a90893ea6cd381f10513a08 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.