From ecb157ae9a10dc54e2768c2ad1e4fffe6b186440 Mon Sep 17 00:00:00 2001 From: mathieu Date: Fri, 22 Apr 2016 15:59:24 +0200 Subject: [PATCH] Fin recherche booleenne Former-commit-id: 195c9451d92ab3916e571d321601ad09ae532f4c --- app/sandbox/settings.py | 1 - telemeta/forms/haystack_form.py | 50 +++++++++++++++++++- telemeta/templates/search/advanceSearch.html | 6 +-- telemeta/util/backend.py | 9 +++- telemeta/views/search.py | 28 +++++------ 5 files changed, 73 insertions(+), 21 deletions(-) diff --git a/app/sandbox/settings.py b/app/sandbox/settings.py index 822b655d..2cd8c7e1 100644 --- a/app/sandbox/settings.py +++ b/app/sandbox/settings.py @@ -5,7 +5,6 @@ import os, sys from django.core.urlresolvers import reverse_lazy, reverse import environ - # set default values and casting env = environ.Env(DEBUG=(bool, False), CELERY_ALWAYS_EAGER=(bool, False), diff --git a/telemeta/forms/haystack_form.py b/telemeta/forms/haystack_form.py index 8a81d776..db3eaf73 100644 --- a/telemeta/forms/haystack_form.py +++ b/telemeta/forms/haystack_form.py @@ -23,9 +23,10 @@ from telemeta.models import * from haystack.forms import * -from haystack.query import SearchQuerySet +from haystack.query import SearchQuerySet, SQ from datetime import date from django.utils.translation import ugettext_lazy as _ +import operator class HaySearchForm(FacetedSearchForm): @@ -154,6 +155,37 @@ class HayAdvanceForm(SearchForm): physical_format = forms.CharField(required=False, label=(_('physical format')), widget=forms.Select(attrs={'style': 'width:100%'}, choices=list_physical_format())) code = forms.CharField(required=False, label=(_('code')), widget=forms.TextInput(attrs={'class': 'form-control', 'type': 'search'})) + def filterInstru(self, query): + operateur = "ET" + if isinstance(query, list): + queryTerms = query + else: + queryTerms = query.split() + sqTab = [] + valeur = "" + while len(queryTerms) != 0: + term = queryTerms.pop(0) + if term == "ET" or term == "OU": + if valeur != "": + sqTab.append(('instruments__contains', valeur.strip())) + valeur = "" + if term != operateur: + sqTab = [SQ(filtre) for filtre in sqTab] + objet = reduce(operator.or_, sqTab) if operateur == "OU" else reduce(operator.and_, sqTab) + del sqTab[:] + sqTab.append(objet) + operateur = "OU" if operateur == "ET" else "ET" + elif term == "(": + indexCloseBracket = getclosebracket(queryTerms) + sqTab.append(self.filterInstru(queryTerms[:indexCloseBracket])) + del queryTerms[:indexCloseBracket + 1] + else: + valeur += term + " " + if valeur != "": + sqTab.append(('instruments__contains', valeur.strip())) + sqTab = [SQ(filtre) for filtre in sqTab] + return SQ(reduce(operator.and_, sqTab) if operateur == "ET" else reduce(operator.or_, sqTab)) + def search(self): sqs = SearchQuerySet().load_all() @@ -174,7 +206,7 @@ class HayAdvanceForm(SearchForm): sqs = sqs.filter(ethnic_group__contains=self.cleaned_data['ethnic_group']) if self.cleaned_data.get('instruments'): - sqs = sqs.filter(instruments__contains=self.cleaned_data['instruments']) + sqs = sqs.filter(self.filterInstru(self.cleaned_data['instruments']))# if self.cleaned_data.get('collectors'): sqs = sqs.filter(collectors__contains=self.cleaned_data['collectors']) @@ -216,3 +248,17 @@ class HayAdvanceForm(SearchForm): sqs = sqs.filter(physical_format=self.cleaned_data['physical_format']) return sqs + + +def getclosebracket(tab): + index = 0 + par = 1 + while par != 0 and index"+donnees.result+''); }, }); }); diff --git a/telemeta/util/backend.py b/telemeta/util/backend.py index 13ffd47a..897f7adc 100644 --- a/telemeta/util/backend.py +++ b/telemeta/util/backend.py @@ -1,3 +1,5 @@ +# -*- coding: utf-8 -*- + from haystack.backends.elasticsearch_backend import * class CustomElasticBackend(ElasticsearchSearchBackend): @@ -15,10 +17,15 @@ class CustomElasticSearchQuery(ElasticsearchSearchQuery): def build_query_fragment(self, field, filter_type, value): print(field, ' ', filter_type, ' ', value) valeur = super(CustomElasticSearchQuery, self).build_query_fragment(field, filter_type, value) + #print(valeur) + return valeur + + def build_query(self): + valeur = super(CustomElasticSearchQuery, self).build_query() print(valeur) return valeur -class CustomElasticEngine(ElasticsearchSearchEngine):# +class CustomElasticEngine(ElasticsearchSearchEngine): backend = CustomElasticBackend query = CustomElasticSearchQuery diff --git a/telemeta/views/search.py b/telemeta/views/search.py index 5c24aa1e..26011183 100644 --- a/telemeta/views/search.py +++ b/telemeta/views/search.py @@ -1,5 +1,4 @@ -# coding: utf-8 - +# -*- coding: utf-8 -*- # Copyright (C) 2015 Angy Fils-Aimé, Killian Mary # This file is part of Telemeta. @@ -27,8 +26,6 @@ import simplejson as json from django.http import HttpResponse from telemeta.forms.boolean_form import * from django.forms.formsets import formset_factory -from django.utils.encoding import smart_str - class HaystackSearch(FacetedSearchView, SavedSearchView): @@ -201,7 +198,7 @@ class BooleanSearchView(object): form = formset_factory(BooleanSearch) - def getBooleanQuery(self, request): + def getBooleanQuery(self, request, type='json'): if request.method != 'GET': return HttpResponse(json.dumps({'result': '[ERROR]:Not Request GET'}), content_type='application/json') @@ -218,25 +215,28 @@ class BooleanSearchView(object): try: self.isCorrectQuery(query.strip()) except Erreur as e: - return HttpResponse(json.dumps({'result': e.message}), content_type='application/json') - return HttpResponse(json.dumps({'result': u'Requête formée : '+query.strip()}), content_type='application/json') + if type=="json": + return HttpResponse(json.dumps({'result': e.message}), content_type='application/json') + if type=="json": + return HttpResponse(json.dumps({'result': query.strip()}), content_type='application/json') else: - return HttpResponse(json.dumps({'result': 'Field(s) missing'}), content_type='application/json') + if type=="json": + return HttpResponse(json.dumps({'result': '[ERROR]Field(s) missing'}), content_type='application/json') - def isCorrectQuery(self, query): + def isCorrectQuery(self, query):# tabQuery = query.split() openBracket = 0 boolean = False for mot in tabQuery: - if mot ==")": + if mot ==")":# if openBracket == 0: - raise Erreur("Open Bracket Is Missing !") + raise Erreur("[ERROR]Open Bracket Is Missing !") else: openBracket -= 1 boolean = False elif mot=="ET" or mot=="OU": if boolean: - raise Erreur("Two boolean follow") + raise Erreur("[ERROR]Two boolean follow") else: boolean = True elif mot == "(": @@ -244,9 +244,9 @@ class BooleanSearchView(object): else: boolean = False if boolean: - raise Erreur("Boolean at the end of query") + raise Erreur("[ERROR]Boolean at the end of query") elif openBracket != 0: - raise Erreur("Close Bracket Is Missing") + raise Erreur("[ERROR]Close Bracket Is Missing") else: return True -- 2.39.5