web/hdalab/views/ajax.py
changeset 238 f818b9430585
parent 235 b41f0b200940
child 243 1f2840354865
--- a/web/hdalab/views/ajax.py	Fri Aug 31 10:48:51 2012 +0200
+++ b/web/hdalab/views/ajax.py	Wed Sep 05 19:11:34 2012 +0200
@@ -184,6 +184,7 @@
 def tagsearch(request):
     
     q = request.GET.get('term',None)
+    maxcount = int(request.GET.get('count','40'))
     lang = request.GET.get('lang',request.LANGUAGE_CODE)
     
     stemming_langs = [ 'fr', 'en', 'de', 'it' ]
@@ -201,13 +202,13 @@
                 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))
+                qs = qs.filter(dbpedia_fields__translations__label__iregex=qrx, dbpedia_fields__translations__language_code=lang)
             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))
+                qs = qs.filter(dbpedia_fields__translations__label__icontains=q, dbpedia_fields__translations__language_code=lang)
     else:
         qs = Tag.objects.filter(~Q(dbpedia_uri = None))
            
-    qs = qs.annotate(nb=Count('datasheet',distinct=True)).order_by('-nb')[:20]
+    qs = qs.annotate(nb=Count('datasheet',distinct=True)).order_by('-nb')[:maxcount]
     
     qslist = list(qs)
     
@@ -231,7 +232,6 @@
             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')
 
@@ -258,7 +258,7 @@
     label = request.GET.get('label', None)
     country = request.GET.get('country', None)
     contentlist = request.GET.get('contentlist', None)
-    max_tag_order = request.GET.get('mto', 12)
+    max_tag_order = int(request.GET.get('mto', '12'))
     content_count = request.GET.get('contentcount', 12)
     tag_count = request.GET.get('tagcount', 30)
     
@@ -419,3 +419,61 @@
         cache.set(cache_key, outputstr)
         
     return HttpResponse(content=outputstr, mimetype='application/json')
+
+def contentsbytag(request):
+    
+    lang = request.GET.get('lang',request.LANGUAGE_CODE)
+    label = request.GET.get('label', None).strip().lower()
+    max_tag_order = int(request.GET.get('mto', '30'))
+    content_count = int(request.GET.get('contentcount', '30'))
+    
+    cache_key = fix_cache_key("contentsbytag-%s"%unicode(label).encode("utf-8"))
+    
+    outputstr = cache.get(cache_key)
+    
+    if outputstr is None:
+        
+        matchtagids = []
+        
+        contentqs = Datasheet.objects.filter(validated=True)
+        
+        no_translate_langs = [ 'fr' ]
+        if lang in no_translate_langs:
+            tagsqs = Tag.objects.filter( label__iexact = label )
+        else:
+            tagsqs = Tag.objects.select_related('dbpedia_fields').filter(dbpedia_fields__translations__label__iexact = label, dbpedia_fields__translations__language_code=lang)
+            
+        contentqs = contentqs.select_related('taggedsheet__tag').filter(taggedsheet__tag__in=tagsqs).distinct()
+        
+        cont_count = contentqs.count()
+        
+        contenus = dict([(content.id, {'score' : 0, 'tags' : [], 'id':content.id, 'title': content.title, 'description': content.description, 'url': content.url}) for content in contentqs[0:content_count]])
+        contentids = contenus.keys()
+        
+        qs = DatasheetExtras.objects.select_related('insee').filter(datasheet__in = contentids)
+        for dse in qs:
+            contenus[dse.datasheet_id]['coords'] = {'city_name': dse.insee.city_name, 'latitude': dse.insee.latitude, 'longitude': dse.insee.longitude}
+        
+        qs = list(TaggedSheet.objects.select_related('tag', 'tag__dbpedia_fields').filter(datasheet__in = contentids).order_by('order'))
+        
+        if lang in no_translate_langs:
+            translations = {}
+        else:
+            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:
+            translated_label = translations.get(ts.tag.dbpedia_fields.id, ts.tag.label) if ts.tag.dbpedia_fields is not None else ts.tag.label
+            match_tag = ( label == translated_label.lower() )
+            contenus[ts.datasheet_id]['tags'].append({'id': ts.tag.id, 'label':ts.tag.label, 'order':ts.order, 'match': match_tag , 'translated_label': translated_label})
+            
+            if match_tag:
+                contenus[ts.datasheet_id]['score'] += 2*max_tag_order - ts.order
+            
+        contenus = sorted(contenus.values(),key=lambda e: -e['score'])
+        
+        output = {'count': cont_count, 'contents': contenus}
+        outputstr = json.dumps(output)
+        cache.set(cache_key, outputstr)
+        
+    return HttpResponse(content=outputstr, mimetype='application/json')
\ No newline at end of file