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()))
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 != "":
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'])
return sqs
-def getclosebracket(tab):
+def get_close_bracket(tab):
index = 0
par = 1
while par != 0 and index<len(tab):
<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);
}
});
}
}
- 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({
},
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({
$('#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 = "";
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>');
},
});
});
{% endblock %}
{% comment "added by Killian Mary end" %}{% endcomment %}
-q
<!--
Added by Thomas Balastegui :
modal popup display and use of addNewPlaylist() and editPlaylist()
</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
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'] = \
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
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