diff --git a/gracedb/api.py b/gracedb/api.py index e520488da027363330f7172b2fafeb802c4cf53a..7091eadd9335ae91da4caf4ef31e2080faa6ad43 100644 --- a/gracedb/api.py +++ b/gracedb/api.py @@ -246,8 +246,7 @@ class EventList(APIView): if query: form = SimpleSearchForm(request.GET) if form.is_valid(): - cooked_query = form.cleaned_data['query'] - events = events.filter(cooked_query).distinct() + events = form.cleaned_data['query'] else: return Response("Invalid query", status=status.HTTP_400_BAD_REQUEST) diff --git a/gracedb/forms.py b/gracedb/forms.py index 93448eb7178745e64c35af82dc3ef71425a5fb46..e3ac69bbec22efcea146551f0a526f5075a8554e 100644 --- a/gracedb/forms.py +++ b/gracedb/forms.py @@ -4,6 +4,7 @@ from django.utils.safestring import mark_safe from django.utils.html import escape from models import Event, Group, Label from django.contrib.auth.models import User +from django.core.exceptions import FieldError from query import parseQuery, ParseException @@ -20,10 +21,14 @@ class GraceQueryField(forms.CharField): from django.db.models import Q queryString = forms.CharField.clean(self, queryString) try: - return parseQuery(queryString) + return Event.objects.filter(parseQuery(queryString)).distinct() except ParseException, e: err = "Error: " + escape(e.pstr[:e.loc]) + errorMarker + escape(e.pstr[e.loc:]) raise forms.ValidationError(mark_safe(err)) + except FieldError, e: + # XXX error message can be more polished than this + err = "Error: " + str(e) + raise forms.ValidationError(mark_safe(err)) except Exception, e: # What could this be and how can we handle it better? XXX raise forms.ValidationError(str(e)) diff --git a/gracedb/views.py b/gracedb/views.py index 566e24f44edb24a5ad026e2cdfd7a14156077b4b..caadcb3e15bdb11d63acbc5afb9ada19232915c3 100644 --- a/gracedb/views.py +++ b/gracedb/views.py @@ -574,8 +574,7 @@ def cli_search(request): assert request.user form = SimpleSearchForm(request.POST) if form.is_valid(): - query = form.cleaned_data['query'] - objects = Event.objects.filter(query).distinct() + objects = form.cleaned_data['query'] if 'ligolw' in request.POST or 'ligolw' in request.GET: from glue.ligolw import utils @@ -691,9 +690,7 @@ def search(request, format=""): form = SimpleSearchForm(request.POST) rawquery = request.POST['query'] if form.is_valid(): - query = form.cleaned_data['query'] - - objects = Event.objects.filter(query).distinct() + objects = form.cleaned_data['query'] if format == "json": return HttpResponse("Not Implemented") @@ -1009,8 +1006,7 @@ def latest(request): context['rawquery'] = request.GET.get('query') or request.POST.get('query') or "" if form.is_valid(): - query = form.cleaned_data['query'] - objects = Event.objects.filter(query).distinct().order_by("-created")[:15] + objects = form.cleaned_data['query'] context['objects'] = map(limit, objects) context['error'] = False else: