web/hdalab/views/ajax.py
changeset 235 b41f0b200940
parent 232 eb02eed5f7d1
child 238 f818b9430585
--- 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])