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),
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):
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()
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'])
sqs = sqs.filter(physical_format=self.cleaned_data['physical_format'])
return sqs
+
+
+def getclosebracket(tab):
+ index = 0
+ par = 1
+ while par != 0 and index<len(tab):
+ if tab[index]=="(":
+ par += 1
+ elif tab[index]==")":
+ par -= 1
+ if par !=0:
+ index+= 1
+ return index if par == 0 else -1
+#
\ No newline at end of file
dataType: 'json',
data: $(this).serialize(),
success: function(donnees){
- if(e.type=='submit' && donnees.result.match(/Requête formée : /g)){
+ if(e.type=='submit' && !donnees.result.match(/\[ERROR\]/g)){
$("#dialog").dialog("close");
- $('#id_instruments').val(donnees.result.substr(17));
+ $('#id_instruments').val(donnees.result);
}
- $('#res').text(donnees.result);
+ $('#res').html("Requête formée :<br/><strong>"+donnees.result+'</strong>');
},
});
});
+# -*- coding: utf-8 -*-
+
from haystack.backends.elasticsearch_backend import *
class CustomElasticBackend(ElasticsearchSearchBackend):
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
-# coding: utf-8
-
+# -*- coding: utf-8 -*-
# Copyright (C) 2015 Angy Fils-Aimé, Killian Mary
# This file is part of Telemeta.
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):
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')
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 == "(":
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