diff --git a/gracedb/query.py b/gracedb/query.py index 18fb6b73c94d20ef8c7cf1677f593298b11e3331..54528514ea0a1c1b2e064c8038e968085dcdad92 100644 --- a/gracedb/query.py +++ b/gracedb/query.py @@ -20,7 +20,7 @@ import models from django.db.models import Q from pyparsing import \ - Word, nums, Literal, CaselessLiteral, delimitedList, Suppress, \ + Word, nums, Literal, CaselessLiteral, delimitedList, Suppress, QuotedString, \ Keyword, Combine, Or, Optional, OneOrMore, alphas, Regex, \ opAssoc, operatorPrecedence, oneOf, \ stringStart, stringEnd, ParseException @@ -92,6 +92,11 @@ tidRange = tid + Suppress("..") + tid tidQ = Optional(Suppress(Keyword("tid:"))) + (tid^tidRange) tidQ = tidQ.setParseAction(maybeRange("tid", dbname="id")) +# Submitter +submitter = QuotedString('"').setParseAction(lambda toks: Q(submitter__name=toks[0])) +submitterQ = Optional(Suppress(Keyword("submitter:"))) + submitter +submitterQ = submitterQ.setParseAction(lambda toks: ("submitter", toks[0])) + # Created times nltimeRange = nltime + Suppress("..") + nltime @@ -114,7 +119,8 @@ createdQ = createdQ.setParseAction(maybeRange("created")) # Labels -labelNames = ["DQV", "INJ", "LUMIN_NO", "LUMIN_GO", "SWIFT_NO", "SWIFT_GO"] +# XXX should we not get these from the DB? +labelNames = ["DQV", "INJ", "LUMIN_NO", "LUMIN_GO", "SWIFT_NO", "SWIFT_GO", "EM_READY"] label = Or([CaselessLiteral(n) for n in labelNames]).\ setParseAction( lambda toks: Q(labels__name=toks[0]) ) @@ -132,7 +138,7 @@ labelQ = (Optional(Suppress(Keyword("label:"))) + labelQ_.copy()) labelQ.setParseAction(lambda toks: ("label", toks[0])) -q = (gidQ | hidQ | tidQ | atypeQ | groupQ | labelQ | gpsQ | createdQ).setName("query term") +q = (gidQ | hidQ | tidQ | atypeQ | groupQ | labelQ | gpsQ | createdQ | submitterQ).setName("query term") def parseQuery(s): d={} diff --git a/gracedb/views.py b/gracedb/views.py index 2432f55dd3903dd705550c27726c24df18a59dc4..2386a5178d6e8a6331bbdb0c3d26aa111d12d914 100644 --- a/gracedb/views.py +++ b/gracedb/views.py @@ -10,11 +10,13 @@ from django.utils.safestring import mark_safe from django.views.generic.list_detail import object_detail, object_list -from models import Event, Group, EventLog, Labelling, Label +from models import Event, Group, EventLog, Labelling, Label, User from forms import CreateEventForm, EventSearchForm, SimpleSearchForm from alert import issueAlert, issueAlertForLabel, issueAlertForUpdate from translator import handle_uploaded_data +import urllib + import os # XXX This should be configurable / moddable or something @@ -491,7 +493,6 @@ def search(request, format=""): 'form': form, 'formAction': reverse(search), 'maxCount': limit, - 'queryLink': reverse(search)+"?query="+escape(rawquery), 'rawquery' : rawquery, } return object_list(request, objects, extra_context=context) @@ -545,6 +546,8 @@ def oldsearch(request): if start and end: textQuery.append("gid: %s..%s" % (start, end)) + elif start or end: + textQuery.append("gid: %s" % (start or end)) if gpsStart != None or gpsEnd != None : if gpsStart == gpsEnd: @@ -563,7 +566,12 @@ def oldsearch(request): textQuery.append("gpstime: 0..%s" % gpsEnd) if submitter: + try: + submitter_name = User.objects.get(id=submitter) + except User.DoesNotExist: + submitter_name = "Error looking up user" objects = objects.filter(submitter=submitter) + textQuery.append('submitter: "%s"' % submitter_name) if groupname: group = Group.objects.filter(name=groupname)[0] objects = objects.filter(group=group) @@ -585,16 +593,12 @@ def oldsearch(request): else: title = "Query Results. %s events" % objects.count() extra_context = {'title': title } - 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 - extra_context['maxCount'] = MAX_QUERY_RESULTS - extra_context['rawquery' ] = textQuery + + textQuery = " ".join(textQuery) + simple_form = SimpleSearchForm({'query': textQuery}) + extra_context['form'] = simple_form + extra_context['maxCount'] = MAX_QUERY_RESULTS + extra_context['rawquery' ] = textQuery return object_list(request, objects, extra_context=extra_context) @@ -696,6 +700,8 @@ def flexigridResponse(request, objects): #created_times['gps'], created_times.get('utc',""), + object.submitter.name, + ] } ) diff --git a/templates/gracedb/event_list.html b/templates/gracedb/event_list.html index daacd96296aa182bf569697956b75a3a1cf69d42..69d2d467ef0b25636b5fcd325fad1ef47a36d879 100644 --- a/templates/gracedb/event_list.html +++ b/templates/gracedb/event_list.html @@ -45,10 +45,10 @@ ( { sortable: true, - url: '{% url search %}/flex?query={{rawquery}}', + url: '{% url search %}/flex?query={{rawquery|urlencode}}', datatype: 'json', mtype: "GET", - colNames : ["UID", "Labels", "Neighbors (+/-5sec)", "Group", "Type", "Event Time", "Links", "Submitted", + colNames : ["UID", "Labels", "Neighbors (+/-5sec)", "Group", "Type", "Event Time", "Links", "Submitted", "Submitted By", ], colModel : [ {name : 'id', index: 'id', width : 50, sortable : true, align: 'left', hidden: false}, @@ -60,6 +60,7 @@ {name : 'gpstime', index: 'gpstime', width : 90, sortable : true, align: 'right'}, {name : 'links', index: 'links', width : 80, sortable : false, align: 'center'}, {name : 'created', index: 'created', width : 100, sortable : true, align: 'right'}, + {name : 'submitter', index: 'submitter', width : 100, sortable : true, align: 'right'}, ], pager: '#pager1', @@ -105,8 +106,8 @@ <tr><td/> <td> <a onClick="toggle_visibility('hints');">Hints on querying</a> - {% if queryLink %} - | <a href="{{queryLink}}">Link to current query</a> + {% if rawquery %} + | <a href="{% url search %}?query={{rawquery|urlencode}}">Link to current query</a> {% endif %} </td> </tr> diff --git a/templates/gracedb/query_help_frag.html b/templates/gracedb/query_help_frag.html index 8ac2b8135235c5e96d58d9ab167779fdd9b7eb95..4f981d9e0d7c94fd0eb176fed7904c0984366f8f 100644 --- a/templates/gracedb/query_help_frag.html +++ b/templates/gracedb/query_help_frag.html @@ -50,4 +50,13 @@ <li>DQV LUMIN_GO</li> </ul> + <h4>By Submitter</h4> + To specify events from a given submitter, indicate the name of the submitter in double quotes. + The <code>submitter:</code> is optional. + <ul> + <li>"CWB Analysis" + <li>"CWB Analysis" "Omega Analysis" + <li>submitter: "Joss Whedon" submitter: "Gilligan" + </ul> + </div>