diff -r 568f35156573 -r b41f0b200940 web/hdalab/views/ajax.py --- a/web/hdalab/views/ajax.py Tue Aug 28 15:56:38 2012 +0200 +++ b/web/hdalab/views/ajax.py Wed Aug 29 16:23:13 2012 +0200 @@ -19,48 +19,9 @@ import itertools import uuid -def taginfo(request): - label = request.GET.get('label', None) - - resobj = {'requested_label' : label} - - resobj["content_count"] = Datasheet.objects.filter(taggedsheet__tag__label__iexact = label).distinct().count() - - res = Tag.objects.select_related('dbpedia_fields').filter(~Q(dbpedia_uri = None), label__iexact = label).order_by('-dbpedia_uri')[0:1] - if len(res) == 1: - restag = res.get() - resobj["dbpedia_uri"] = restag.dbpedia_uri - if resobj["dbpedia_uri"] is not None and restag.dbpedia_fields is not None: - dbfield = restag.dbpedia_fields - resobj["abstract"] = dbfield.abstract - resobj["dbpedia_label"] = dbfield.label - resobj["thumbnail"] = dbfield.thumbnail - transqs = DbpediaFieldsTranslation.objects.filter(master=dbfield, language_code=request.LANGUAGE_CODE)[0:1] - if transqs: - trans = transqs.get() - resobj['translated_abstract'] = trans.abstract - resobj['translated_label'] = trans.label - else: - resobj['translated_abstract'] = dbfield.abstract - resobj['translated_label'] = dbfield.label - - #res = Tag.objects.filter(label__iexact = label).order_by('-wikipedia_url')[0:1] - #if len(res) == 1: - # resobj["wikipedia_url"] = res.get().wikipedia_url - if 'translated_label' in resobj: - wikipedia_label = resobj['translated_label'] - else: - wikipedia_label = label - wikipedia_label = wikipedia_label[0].capitalize() + wikipedia_label[1:] - resobj["wikipedia_url"] = "http://%s.wikipedia.org/wiki/%s" % (request.LANGUAGE_CODE,wikipedia_label.replace(' ', '_')) -# We don't use links at the moment, so I'll comment this line to speed up requests -# resobj["links"] = [{'subject':tl.subject.label, 'object':tl.object.label} for tl in TagLinks.objects.select_related().filter(Q(subject__label__iexact = label) | Q(object__label__iexact = label))] - - return HttpResponse(content=json.dumps(resobj), mimetype='application/json') - - def tagtranslation(request): + lang = request.GET.get('lang',request.LANGUAGE_CODE) labels = request.GET.get('labels',None) if not labels: @@ -76,7 +37,7 @@ if tag.dbpedia_fields: masters.append(tag.dbpedia_fields) - translationqs = DbpediaFieldsTranslation.objects.select_related("master", "master__tag").filter(master__in = masters, language_code=request.LANGUAGE_CODE) + translationqs = DbpediaFieldsTranslation.objects.select_related("master", "master__tag").filter(master__in = masters, language_code=lang) translations = dict([(t.master.label, t.label) for t in translationqs]) @@ -223,27 +184,54 @@ def tagsearch(request): q = request.GET.get('term',None) + lang = request.GET.get('lang',request.LANGUAGE_CODE) + + stemming_langs = [ 'fr', 'en', 'de', 'it' ] + # For Japanese, there are no word boundaries, we should not use the regexp in that case + no_translate_langs = [ 'fr' ] + if q: lq = q.lower() - qs = Tag.objects.filter(datasheet__validated=True).filter( Q(label__icontains = q ) | Q(dbpedia_fields__translations__label__icontains = q, dbpedia_fields__translations__language_code=request.LANGUAGE_CODE), ~Q(dbpedia_uri = None)) if q else Tag.objects.filter(~Q(dbpedia_uri = None)) - qs = qs.annotate(nb=Count('datasheet')).order_by('-nb')[:20] + qs = Tag.objects.select_related('dbpedia_fields').filter(datasheet__validated=True) + qrx = '(\\m|\\b)%s'%q + if lang in no_translate_langs: + if lang in stemming_langs: + qs = qs.filter( label__iregex = qrx ) + else: + qs = qs.filter( label__icontains = q ) + else: + if lang in stemming_langs: + qs = qs.filter( Q(label__iregex=q ) | Q(dbpedia_fields__translations__label__iregex=q, dbpedia_fields__translations__language_code=lang), ~Q(dbpedia_uri = None)) + else: + qs = qs.filter( Q(label__icontains=q ) | Q(dbpedia_fields__translations__label__icontains=q, dbpedia_fields__translations__language_code=lang), ~Q(dbpedia_uri = None)) + else: + qs = Tag.objects.filter(~Q(dbpedia_uri = None)) + + qs = qs.annotate(nb=Count('datasheet',distinct=True)).order_by('-nb')[:20] qslist = list(qs) - transqs = DbpediaFieldsTranslation.objects.filter(master__tag__in = qslist, language_code=request.LANGUAGE_CODE).select_related("master") - - translations = dict([(tr.master.tag_id, tr.label) for tr in transqs]) + if lang in no_translate_langs: + translations = {} + else: + transqs = DbpediaFieldsTranslation.objects.filter(master__tag__in = qslist, language_code=lang).select_related("master") + translations = dict([(tr.master.tag_id, {'label':tr.label,'abstract':tr.abstract}) for tr in transqs]) res = [] for t in qslist: - resobj = {'value':t.label,'nb':t.nb} + dbfields = t.dbpedia_fields + resobj = {'original_label':t.label,'nb':t.nb} + resobj['thumbnail'] = dbfields.thumbnail if dbfields is not None else None if t.id in translations: - resobj['label'] = translations[t.id] + resobj['value'] = translations[t.id]['label'] + resobj['abstract'] = translations[t.id]['abstract'] else: - resobj['label'] = t.label - if q is None or resobj['label'].lower().find(lq) != -1: + resobj['value'] = t.label + resobj['abstract'] = dbfields.abstract if dbfields is not None else None + if q is None or resobj['value'].lower().find(lq) != -1: res.append(resobj) + res.sort(key=lambda resobj: resobj['value']) return HttpResponse(content=json.dumps(res), mimetype='application/json') @@ -252,12 +240,12 @@ q = request.GET.get('term',None) # On ne récupère que les catégories qui sont également des tags - - qs = Tag.objects.filter(Q(label__icontains = ' ' + q ) | Q(label__istartswith = q)) + qrx = '(\\m|\\b)%s'%q + qs = Tag.objects.filter(label__iregex=q) labels = [tag.label for tag in qs] - qs = WpCategory.objects.filter(label__in = labels) + qs = WpCategory.objects.annotate(nb=Count('child_categories__child_category__tags')).filter(label__in = labels, nb__gt=0) res = [{'value':t.label} for t in qs] @@ -265,6 +253,7 @@ def filter(request): + lang = request.GET.get('lang',request.LANGUAGE_CODE) periode = request.GET.get('period',None) label = request.GET.get('label', None) country = request.GET.get('country', None) @@ -273,7 +262,7 @@ content_count = request.GET.get('contentcount', 12) tag_count = request.GET.get('tagcount', 30) - key_parts = ("filter",request.LANGUAGE_CODE,periode,label,country,contentlist,max_tag_order,content_count,tag_count) + key_parts = ("filter",lang,periode,label,country,contentlist,max_tag_order,content_count,tag_count) key_parts = [unicode(p).encode("utf-8") for p in key_parts] cache_key = fix_cache_key("-".join(key_parts)) @@ -336,7 +325,7 @@ matchtagids = [t.id for t in matchtagidsqs] masters = [t.dbpedia_fields for t in matchtagidsqs if t.dbpedia_fields is not None] - translationqs = DbpediaFieldsTranslation.objects.select_related("master", "master__tag").filter(master__in = masters, language_code=request.LANGUAGE_CODE) + translationqs = DbpediaFieldsTranslation.objects.select_related("master", "master__tag").filter(master__in = masters, language_code=lang) labeltranslations = [{'label':t.master.label, 'translated_label':t.label} for t in translationqs] @@ -359,7 +348,7 @@ qs = list(TaggedSheet.objects.select_related('tag', 'tag__dbpedia_fields').filter(datasheet__in = contentids, order__lte = max_tag_order).order_by('order')) - transqs = DbpediaFieldsTranslation.objects.filter(master__in = [ts.tag.dbpedia_fields for ts in qs], language_code = request.LANGUAGE_CODE) + transqs = DbpediaFieldsTranslation.objects.filter(master__in = [ts.tag.dbpedia_fields for ts in qs], language_code = lang) translations = dict([(trans.master_id,trans.label) for trans in transqs]) for ts in qs: @@ -387,7 +376,7 @@ dbpediafields = dict([(df.tag_id, df) for df in DbpediaFields.objects.filter(tag__in = tagqslist)]) - transqs = DbpediaFieldsTranslation.objects.filter(master__in = dbpediafields.values(), language_code = request.LANGUAGE_CODE) + transqs = DbpediaFieldsTranslation.objects.filter(master__in = dbpediafields.values(), language_code = lang) translations = dict([(trans.master_id,trans.label) for trans in transqs]) tags = [{'id': tag.id, 'label': tag.label, 'score': tag.nb, 'translated_label': translations.get(dbpediafields[tag.id].id, tag.label) if tag.id in dbpediafields else tag.label} for tag in tagqslist] @@ -397,7 +386,7 @@ discqslist = list(discqs.annotate(nb=Count('taggedsheet')).order_by('-nb')[:10]) - transqs = DbpediaFieldsTranslation.objects.filter(master__in = [tag.dbpedia_fields for tag in discqslist], language_code = request.LANGUAGE_CODE) + transqs = DbpediaFieldsTranslation.objects.filter(master__in = [tag.dbpedia_fields for tag in discqslist], language_code = lang) translations = dict([(trans.master_id,trans.label) for trans in transqs])