]> git.parisson.com Git - telemeta.git/commitdiff
Convert to english, lowercase and explain backend
authormathieu <mathieu.boye28@gmail.com>
Wed, 18 May 2016 09:59:14 +0000 (11:59 +0200)
committermathieu <mathieu.boye28@gmail.com>
Wed, 18 May 2016 09:59:14 +0000 (11:59 +0200)
telemeta/forms/haystack_form.py
telemeta/templates/search/advanceSearch.html
telemeta/templates/telemeta/lists.html
telemeta/templates/telemeta/mediaitem_list.html
telemeta/util/backend.py
telemeta/views/search.py

index fdc42c9dede4645de4aeb5b95da469ece5760a83..46ef6a5ad14827faec443c433d7b3447c5c576fe 100644 (file)
@@ -155,24 +155,24 @@ 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):
+    def filter_instru(self, query):
 
         from telemeta.views.search import BooleanSearchView, Erreur
-
-        try:
-            BooleanSearchView().isCorrectQuery(query)
-        except Erreur:
-            return SQ(instruments__startswith=query)
+        if isinstance(query, str):
+             try:
+                 BooleanSearchView().is_correct_query(query)
+             except Erreur:
+                 return SQ(instruments__startswith=query)
 
         operateur = "ET"
         if isinstance(query, list):
-            queryTerms = query
+            query_terms = query
         else:
-            queryTerms = query.split()
+            query_terms = query.split()
         sqTab = []
         valeur = ""
-        while len(queryTerms) != 0:
-            term = queryTerms.pop(0)
+        while len(query_terms) != 0:
+            term = query_terms.pop(0)
             if term == "ET" or term == "OU":
                 if valeur != "":
                     sqTab.append(('instruments__startswith', valeur.strip()))
@@ -184,9 +184,9 @@ class HayAdvanceForm(SearchForm):
                     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]
+                indexCloseBracket = get_close_bracket(query_terms)
+                sqTab.append(self.filter_instru(query_terms[:indexCloseBracket]))
+                del query_terms[:indexCloseBracket + 1]
             else:
                 valeur += term + " "
         if valeur != "":
@@ -214,7 +214,7 @@ class HayAdvanceForm(SearchForm):
                 sqs = sqs.filter(ethnic_group__contains=self.cleaned_data['ethnic_group'])
 
         if self.cleaned_data.get('instruments'):
-            sqs = sqs.filter(self.filterInstru(self.cleaned_data['instruments']))
+            sqs = sqs.filter(self.filter_instru(self.cleaned_data['instruments']))
 
         if self.cleaned_data.get('collectors'):
             sqs = sqs.filter(collectors__startswith=self.cleaned_data['collectors'])
@@ -258,7 +258,7 @@ class HayAdvanceForm(SearchForm):
         return sqs
 
 
-def getclosebracket(tab):
+def get_close_bracket(tab):
     index = 0
     par = 1
     while par != 0 and index<len(tab):
index 6b553bc6a3c1c12ce0e5d43efe63fe5220055428..df96a4a6f31dfd88e20d1a398a36582d1c0f1cb9 100644 (file)
             <div id="results"></div>{# Show some example queries to run, maybe query syntax, something else? #}
         {% endif %}
 
-        <div id="dialog" title="Instruments : Recherche boolĂ©enne">
+        <div id="dialog" title="{% trans "Instruments : Boolean Search" %}">
 
             <form>
 
                     {% endif %}
 
                 {% endfor %}
-                <a class="btn btn-default" id="ajout" href="#">{% trans "Add field" %}</a>
+                <a class="btn btn-default" id="add" href="#">{% trans "Add field" %}</a>
                 <br/><input type="submit" value="{% trans "Validate the query" %}">
 
 
 </script>
     <script>
 $(function() {
-    function activerAutocompletion(selecteur, attribut) {
+    function activate_autocomplete(selector, attribute) {
 
-    selecteur.each(function () {
+    selector.each(function () {
         var self = this;
         $(this).autocomplete({
             minLength: 3,
-            source: function (requete, reponse) {
+            source: function (request, response) {
                 $.ajax({
                     url: '/search/autocomplete/',
                     dataType: 'json',
                     data: {
                         q: $(self).val(),
-                        attr: ((attribut) ? attribut : $(self).attr('name'))
+                        attr: ((attribute) ? attribute : $(self).attr('name'))
                     },
-                    success: function (donnee) {
-                        reponse(donnee.results);
+                    success: function (data) {
+                        response(data.results);
                     }
                 });
             }
@@ -309,9 +309,9 @@ $(function() {
 
 }
 
-    activerAutocompletion($('#id_code, #id_instruments, #id_collectors, #id_location'));
+    activate_autocomplete($('#id_code, #id_instruments, #id_collectors, #id_location'));
 
-    var colTri = [];
+    var colSort = [];
 
 
     $.tablesorter.addParser({
@@ -321,35 +321,35 @@ $(function() {
         },
         format: function(s, table, cell){
             var _class = $(cell).find('center span').attr('class');
-            _class = _class == undefined ? 1 : 0
+            _class = _class == undefined ? 1 : 0;
             return _class;
         },
         type: 'number'
     });
 
 
-    if(sessionStorage['tri'] && sessionStorage['order']){
-        $.tablesorter.defaults.sortList = [[sessionStorage['tri'], sessionStorage['order']]];
+    if(sessionStorage['sort'] && sessionStorage['order']){
+        $.tablesorter.defaults.sortList = [[sessionStorage['sort'], sessionStorage['order']]];
     }
     else{
         $.tablesorter.defaults.sortList = [[1,0]];
     }
 
     $('#searchtable th').each(function (index) {
-        colTri[index]=$(this).text();
+        colSort[index]=$(this).text();
     });
 
 
     $('#searchtable th').on('click', function () {
-        var index = colTri.indexOf($(this).text());
+        var index = colSort.indexOf($(this).text());
         var order = $.tablesorter.defaults.headerList[index]['order'];
-        if(index!=sessionStorage['tri']){
+        if(index!=sessionStorage['sort']){
             sessionStorage['order']=0;
         }
         else{
             sessionStorage['order']=(sessionStorage['order']==0)?1:0;
         }
-        sessionStorage['tri']=index;
+        sessionStorage['sort']=index;
     });
     
     $("#searchtable").tablesorter({
@@ -372,41 +372,41 @@ $(function() {
         $('#dialog').dialog("open");
     });
 
-    var supprButton = '<a class="btn btn-default" id="suppr" href="#">'+gettrans('delete field')+'</a><br/>';
+    var deleteButton = '<a class="btn btn-default" id="del" href="#">'+gettrans('delete field')+'</a><br/>';
 
-    var balise = $('#copy').clone();
-    $(balise).children().each(function () {
+    var tag = $('#copy').clone();
+    $(tag).children().each(function () {
         $(this).val('').prop('checked', false).prop('selected', false);
     });
 
-    function suppression(e) {
+    function deleteField(e) {
         e.preventDefault();
         var nombre = $('input[name*="textField"]').length;
         if(nombre==3){
-            $('#suppr').remove();
+            $('#del').remove();
         }
         $('#bloc-'+(nombre-1)).remove();
         $('#id_form-TOTAL_FORMS').attr('value', nombre-1);
 
     }
 
-    function ajout(e) {
+    function addField(e) {
         e.preventDefault();
-        var nombre = $('input[name*="textField"]').length;
-        var bal = $(balise).clone().attr('id', 'bloc-'+nombre);
-        if(nombre==2){
-            $('#ajout').after(supprButton);
-            $('#suppr').click(suppression);
+        var number = $('input[name*="textField"]').length;
+        var tagField = $(tag).clone().attr('id', 'bloc-'+number);
+        if(number==2){
+            $('#add').after(deleteButton);
+            $('#del').click(deleteField);
         }
-        $('#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);
+        $('#add').before(tagField);
+        $('#bloc-'+number).html($('#bloc-'+number).html().replace(/1/g, number));
+        activate_autocomplete($('#id_form-'+number+'-textField'), 'instruments');
+        $('#id_form-TOTAL_FORMS').attr('value', number+1);
     }
 
-    $('#ajout').click(ajout);
+    $('#add').click(addField);
 
-    activerAutocompletion($('#id_form-0-textField, #id_form-1-textField'), 'instruments');
+    activate_autocomplete($('#id_form-0-textField, #id_form-1-textField'), 'instruments');
 
     var interval = null;
     var textInput = "";
@@ -417,12 +417,12 @@ $(function() {
             url: '/search/booleaninstru/',
             dataType: 'json',
             data: $(this).serialize(),
-            success: function(donnees){
-                if(e.type=='submit' && !donnees.result.match(/\[ERROR\]/g)){
+            success: function(data){
+                if(e.type=='submit' && !data.result.match(/\[ERROR\]/g)){
                     $("#dialog").dialog("close");
-                    $('#id_instruments').val(donnees.result);
+                    $('#id_instruments').val(data.result);
                 }
-                $('#res').html(gettrans('final query')+" :<br/><strong>"+gettrans(donnees.result)+'</strong>');
+                $('#res').html(gettrans('final query')+" :<br/><strong>"+gettrans(data.result)+'</strong>');
             },
         });
     });
index fdb2b7dfb24174060ec9f49f65886c8a8a86e050..ff6177c63fcee8533458fb3d7f0bc0289ed4c607 100644 (file)
@@ -54,7 +54,6 @@
 {% endblock %}
 
 {% comment "added by Killian Mary end" %}{% endcomment %}
-q
 <!--
  Added by Thomas Balastegui :
  modal popup display and use of addNewPlaylist() and editPlaylist()
index a0733a1c005eb32c9e91cbea2c481ff0d92df543..46d44890509ee34d20a98bd1f668b891a0925e0c 100644 (file)
             </li>
             <li><a href="
 
+
                     {% block url_unpublished %}{% url "telemeta-items-unpublished" %}{% endblock %}">{% trans "Unpublished" %}</a>
             </li>
             <li><a href="
 
+
                     {% block url_published %}{% url "telemeta-items-published" %}{% endblock %}">{% trans "Published" %}</a>
             </li>
             <li><a href="
 
+
                     {% block url_sound %}{% url "telemeta-items-sound" %}{% endblock %}">{% trans "Digitized" context "item list" %}</a>
             </li>
         </ul>
     </div>
 
     <div>
-    <label style="display:inline-block;vertical-align:middle">{% trans "results per page" %}:</label>
-    <div style="display:inline-block;vertical-align:middle">
-        <select id="results-per-page" name="results_page">
-            <option {% ifequal results_page 20 %}selected{% endifequal %} value="20">20</option>
-            <option {% ifequal results_page 50 %}selected{% endifequal %} value="50">50</option>
-            <option {% ifequal results_page 100 %}selected{% endifequal %} value="100">100</option>
-            <option {% ifequal results_page 250 %}selected{% endifequal %} value="250">250</option>
-            <option {% ifequal results_page 500 %}selected{% endifequal %} value="500">500</option>
-            <option {% ifequal results_page 1000 %}selected{% endifequal %} value="1000">1000</option>
-            <option {% ifequal results_page 10000 %}selected{% endifequal %} value="10000">10000</option>
-        </select>
-    </div>
+        <label style="display:inline-block;vertical-align:middle">{% trans "results per page" %}:</label>
+        <div style="display:inline-block;vertical-align:middle">
+            <select id="results-per-page" name="results_page">
+                <option {% ifequal results_page 20 %}selected{% endifequal %} value="20">20</option>
+                <option {% ifequal results_page 50 %}selected{% endifequal %} value="50">50</option>
+                <option {% ifequal results_page 100 %}selected{% endifequal %} value="100">100</option>
+                <option {% ifequal results_page 250 %}selected{% endifequal %} value="250">250</option>
+                <option {% ifequal results_page 500 %}selected{% endifequal %} value="500">500</option>
+                <option {% ifequal results_page 1000 %}selected{% endifequal %} value="1000">1000</option>
+                <option {% ifequal results_page 10000 %}selected{% endifequal %} value="10000">10000</option>
+            </select>
+        </div>
     </div>
 
 {% endblock %}
             $("#results-per-page").selectmenu({
                 icons: {button: "ui-icon-carat-2-n-s"},
                 change: function () {
-                    location.search = '?page=1&results_page='+$(this).val();
+                    location.search = '?page=1&results_page=' + $(this).val();
                 }
             }).selectmenu("menuWidget").addClass("overflow");
 
-            $("#selectAll").click(function(){
-                if(this.checked){
-                    $(".check1").each(function(){
-                        this.checked=true;
+            $("#selectAll").click(function () {
+                if (this.checked) {
+                    $(".check1").each(function () {
+                        this.checked = true;
                     });
                 }
-                else{
-                    $(".check1").each(function(){
-                        this.checked=false;
+                else {
+                    $(".check1").each(function () {
+                        this.checked = false;
                     });
                 }
             });
         });
 
 
-
     </script>
 
 {% endblock %}
\ No newline at end of file
index d969c1a2edb510b13f170b088f1dd3d1398d1944..f20bcd13493c1176950efd663238a322caeb8ed4 100644 (file)
@@ -4,16 +4,25 @@ from haystack.backends.elasticsearch_backend import *
 import string
 import re
 
-regexSpacePunc = "[\\s"+re.escape(string.punctuation)+"]+"
+#Regex for remove punctuations when index fields and
+#when submit a query search
+regex_space_punc = "[\\s" + re.escape(string.punctuation) + "]+"
 
 class CustomElasticBackend(ElasticsearchSearchBackend):
 
+    #This setup modifies the mapping of ES in order to have better results
+    #in the search engine. Add 2 analyzers (for indexing and searching):
+    # -whitespace_asciifolding_analyzer : remove punctuations and convert
+    #  all terms into lowercase and escape accents.
+    # -lowercase_analyzer : convert in lowercase the word (used by code field
+    #  in order to preserve undersore of codes)
+
     def setup(self):
         DEFAULT_FIELD_MAPPING['analyzer']='whitespace_asciifolding_analyzer'
         FIELD_MAPPINGS['keyword'] = {'type': 'string', 'analyzer':'lowercase_analyzer'}
         eb = super(CustomElasticBackend, self)
         eb.DEFAULT_SETTINGS.get('settings').get('analysis').get('tokenizer')['esc_scape_tokenizer']=\
-            {"type": "pattern", "pattern": regexSpacePunc}
+            {"type": "pattern", "pattern": regex_space_punc}
         eb.DEFAULT_SETTINGS.get('settings').get('analysis').get('analyzer')['whitespace_asciifolding_analyzer']=\
             {"type": "custom", "tokenizer": "esc_scape_tokenizer", "filter": ["lowercase", "asciifolding"]}
         eb.DEFAULT_SETTINGS.get('settings').get('analysis').get('analyzer')['lowercase_analyzer'] = \
@@ -22,14 +31,19 @@ class CustomElasticBackend(ElasticsearchSearchBackend):
 
 class CustomElasticSearchQuery(ElasticsearchSearchQuery):
 
+    #Custom search query for remove all punctuations characters and
+    #convert to string for boolean fields
+    #Used when enter the query
+
     def build_query_fragment(self, field, filter_type, value):
         if isinstance(value, bool):
                value = str(value)
        if not isinstance(value, int) and field !='code':
-               value = re.sub(regexSpacePunc, " ", value)
+               value = re.sub(regex_space_punc, " ", value)
         valeur = super(CustomElasticSearchQuery, self).build_query_fragment(field, filter_type, value)
         return valeur
 
+#The custom engine that determine backednd and search_query
 class CustomElasticEngine(ElasticsearchSearchEngine):
     backend = CustomElasticBackend
     query = CustomElasticSearchQuery
index a736cb0e7dc54cc44561a5c83cb622f58b85ee24..b1e553eb0661a3e22f95e0574f8e9c3fd3ad6921 100644 (file)
@@ -230,14 +230,14 @@ class BooleanSearchView(object):
                 query += formul.cleaned_data["textField"].strip() + " "
                 query += formul.cleaned_data["endBracket"]
             try:
-                self.isCorrectQuery(query.strip())
+                self.is_correct_query(query.strip())
             except Erreur as e:
                 return HttpResponse(json.dumps({'result': e.message}), content_type='application/json')
             return HttpResponse(json.dumps({'result': query.strip()}), content_type='application/json')
         else:
             return HttpResponse(json.dumps({'result': '[ERROR]Field(s) missing'}), content_type='application/json')
 
-    def isCorrectQuery(self, query):
+    def is_correct_query(self, query):
         tabQuery = query.split()
         openBracket = 0
         boolean = False