--- 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])