class BooleanSearch(forms.Form):
- boolean = forms.ChoiceField(choices=[('ET', 'ET',), ('OU', 'OU',)], label='')
- startBracket = forms.BooleanField(initial=False, label='')
- textField = forms.CharField(label='')
- endBracket = forms.BooleanField(initial=False, label='')
\ No newline at end of file
+ def getBrackets(dir):
+ list = []
+ for i in range(4):
+ brackets = ""
+ for j in range(i):
+ if dir=="left":
+ brackets+="( "
+ elif dir=="right":
+ brackets+=") "
+ list.append((brackets,brackets))
+ return list
+
+ boolean = forms.ChoiceField(choices=[('ET', 'ET',), ('OU', 'OU',)], label='', required=False)
+ startBracket = forms.ChoiceField(label='',choices=getBrackets('left'), required=False)
+ textField = forms.CharField(label='', widget=forms.TextInput(attrs={'required':''}))
+ endBracket = forms.ChoiceField(label='', choices=getBrackets('right'), required=False)
+
+
z-index: 1000;
}
+ select[name*="startBracket"]{
+ text-align: right;
+ }
+
</style>
{% endblock %}
{% block content %}
{{ booleanForm.management_form}}
{% for form in booleanForm %}
{% if forloop.counter0 == 0 %}
- <span style="margin-left: 18%">{{ form.startBracket }}</span>
+ <span style="margin-left: 13.5%">{{ form.startBracket }}</span>
{{ form.textField }}
{{ form.endBracket }}
{% else %}
</form>
+ <p id="res"></p>
+
+ <p>Pour chaque champ : Mot-clé contenu dans l'instrument (ex "uita" pour "guitare") ou nom entier</p>
+
</div>
{% endblock %}
$('#dialog').dialog({
autoOpen: false,
- width: '30%',
+ width: '40%',
+ height: 600,
});
$('.fieldWrapper a').click(function(){
var supprButton = '<a class="btn btn-default" id="suppr" href="#">Supprimer champ</a><br/>';
+ var balise = $('#copy').clone();
+ $(balise).children().each(function () {
+ $(this).val('').prop('checked', false).prop('selected', false);
+ });
+
+ function suppression(e) {
+ e.preventDefault();
+ var nombre = $('input[name*="textField"]').length;
+ if(nombre==3){
+ $('#suppr').remove();
+ }
+ $('#bloc-'+(nombre-1)).remove();
+ $('#id_form-TOTAL_FORMS').attr('value', nombre-1);
+
+ }
+
function ajout(e) {
e.preventDefault();
var nombre = $('input[name*="textField"]').length;
- var balise = $('#copy').clone().removeAttr('id').html().replace(/1/g, nombre);
+ var bal = $(balise).clone().attr('id', 'bloc-'+nombre);
if(nombre==2){
$('#ajout').after(supprButton);
+ $('#suppr').click(suppression);
}
- $('#ajout').before(balise);
+ $('#ajout').before(bal);
+ $('#bloc-'+nombre).html($('#bloc-'+nombre).html().replace(/1/g, nombre));
activerAutocompletion($('#id_form-'+nombre+'-textField'), 'instruments');
-
+ $('#id_form-TOTAL_FORMS').attr('value', nombre+1);
}
+ $('#ajout').click(ajout);
+ activerAutocompletion($('#id_form-0-textField, #id_form-1-textField'), 'instruments');
+
+ var interval = null;
+ var textInput = "";
+
+ $('#dialog form').on('submit change', function (e) {
+ if(e.type!='keypress') e.preventDefault();
+ $.ajax({
+ url: '/search/booleaninstru/',
+ dataType: 'json',
+ data: $(this).serialize(),
+ success: function(donnees){
+ if(e.type=='submit' && donnees.result.match(/Requête formée : /g)){
+ $("#dialog").dialog("close");
+ $('#id_instruments').val(donnees.result.substr(17));
+ }
+ $('#res').text(donnees.result);
+ },
+ });
+ });
- $('#ajout').click(ajout);
+ $('#dialog input[type="text"]').on('focus', function () {
+ textInput = $(this).val();
+ var self = this;
+ interval = setInterval(function () {
+ if($(self).val()!= textInput){
+ textInput = $(self).val();
+ $('#dialog form').trigger('change');
+ }
+ }, 500);
+ });
+
+ $('#dialog input[type="text"]').on('blur', function () {
+ clearInterval(interval);
+ textInput = ""
+ });
});
</script>
profile_view = ProfileView()
geo_view = GeoView()
resource_view = ResourceView()
+boolean_view = BooleanSearchView()
# ID's regular expressions
export_extensions = "|".join(item_view.list_export_extensions())
url(r'^search/quick/(?P<type>[A-Za-z0-9._-]+)/$', HaystackSearch(), name='haystack_search_type'),
url(r'^search/advance/$', HaystackAdvanceSearch(form_class=HayAdvanceForm, template='search/advanceSearch.html'), name='haystack_advance_search'),
url(r'^search/advance/(?P<type>[A-Za-z0-9._-]+)/$', HaystackAdvanceSearch(form_class=HayAdvanceForm, template='search/advanceSearch.html'), name='haystack_advance_search_type'),
+ url(r'^search/booleaninstru/$', boolean_view.getBooleanQuery),
url(r'^search/playlist_add/(?P<type>[A-Za-z0-9._-]+)/$', NewPlaylistView().display, name='haystack_playlist'),
url(r'^search/playlist_confirmation/(?P<type>[A-Za-z0-9._-]+)/$',NewPlaylistView().addToPlaylist, name='add_confirmation'),
-# -*- coding: utf-8 -*-
+# coding: utf-8
# Copyright (C) 2015 Angy Fils-Aimé, Killian Mary
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):
import unicodedata
def escapeAccentAndLower(chaine):
- return unicodedata.normalize('NFD', chaine).encode('ascii', 'ignore').lower()
\ No newline at end of file
+ return unicodedata.normalize('NFD', chaine).encode('ascii', 'ignore').lower()
+
+class BooleanSearchView(object):
+
+ form = formset_factory(BooleanSearch)
+
+ def getBooleanQuery(self, request):
+ if request.method != 'GET':
+ return HttpResponse(json.dumps({'result': '[ERROR]:Not Request GET'}), content_type='application/json')
+
+ formset = self.form(request.GET)
+ if formset.is_valid():
+ query = ""
+ for i in range(len(formset.forms)):
+ formul = formset.forms[i]
+ if i!=0:
+ query+=formul.cleaned_data["boolean"]+" "
+ query+=formul.cleaned_data["startBracket"]
+ query+=formul.cleaned_data["textField"].strip()+" "
+ query+=formul.cleaned_data["endBracket"]
+ 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')
+ else:
+ return HttpResponse(json.dumps({'result': 'Field(s) missing'}), content_type='application/json')
+
+ def isCorrectQuery(self, query):
+ tabQuery = query.split()
+ openBracket = 0
+ boolean = False
+ for mot in tabQuery:
+ if mot ==")":
+ if openBracket == 0:
+ raise Erreur("Open Bracket Is Missing !")
+ else:
+ openBracket -= 1
+ boolean = False
+ elif mot=="ET" or mot=="OU":
+ if boolean:
+ raise Erreur("Two boolean follow")
+ else:
+ boolean = True
+ elif mot == "(":
+ openBracket += 1
+ else:
+ boolean = False
+ if boolean:
+ raise Erreur("Boolean at the end of query")
+ elif openBracket != 0:
+ raise Erreur("Close Bracket Is Missing")
+ else:
+ return True
+
+
+
+class Erreur(Exception):
+ pass
\ No newline at end of file