web/hdalab/views/ajax.py
changeset 235 b41f0b200940
parent 232 eb02eed5f7d1
child 238 f818b9430585
equal deleted inserted replaced
234:568f35156573 235:b41f0b200940
    17 import django.utils.simplejson as json
    17 import django.utils.simplejson as json
    18 import hmac
    18 import hmac
    19 import itertools
    19 import itertools
    20 import uuid
    20 import uuid
    21 
    21 
    22 def taginfo(request):
       
    23     label = request.GET.get('label', None)
       
    24     
       
    25     resobj = {'requested_label' : label}
       
    26         
       
    27     resobj["content_count"] = Datasheet.objects.filter(taggedsheet__tag__label__iexact = label).distinct().count()
       
    28 
       
    29     res = Tag.objects.select_related('dbpedia_fields').filter(~Q(dbpedia_uri = None), label__iexact = label).order_by('-dbpedia_uri')[0:1]
       
    30     if len(res) == 1:
       
    31         restag = res.get()
       
    32         resobj["dbpedia_uri"] = restag.dbpedia_uri
       
    33         if resobj["dbpedia_uri"] is not None and restag.dbpedia_fields is not None:
       
    34             dbfield = restag.dbpedia_fields
       
    35             resobj["abstract"] = dbfield.abstract
       
    36             resobj["dbpedia_label"] = dbfield.label
       
    37             resobj["thumbnail"] = dbfield.thumbnail
       
    38             transqs = DbpediaFieldsTranslation.objects.filter(master=dbfield, language_code=request.LANGUAGE_CODE)[0:1]
       
    39             if transqs:
       
    40                 trans = transqs.get()
       
    41                 resobj['translated_abstract'] = trans.abstract
       
    42                 resobj['translated_label'] = trans.label
       
    43             else:
       
    44                 resobj['translated_abstract'] = dbfield.abstract
       
    45                 resobj['translated_label'] = dbfield.label
       
    46 
       
    47     #res = Tag.objects.filter(label__iexact = label).order_by('-wikipedia_url')[0:1]
       
    48     #if len(res) == 1:
       
    49     #    resobj["wikipedia_url"] = res.get().wikipedia_url
       
    50     if 'translated_label' in resobj:
       
    51         wikipedia_label = resobj['translated_label']
       
    52     else:
       
    53         wikipedia_label = label
       
    54     wikipedia_label = wikipedia_label[0].capitalize() + wikipedia_label[1:]
       
    55     resobj["wikipedia_url"] = "http://%s.wikipedia.org/wiki/%s" % (request.LANGUAGE_CODE,wikipedia_label.replace(' ', '_'))
       
    56 # We don't use links at the moment, so I'll comment this line to speed up requests
       
    57 #    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))]
       
    58 
       
    59     return HttpResponse(content=json.dumps(resobj), mimetype='application/json')
       
    60 
       
    61 
       
    62 def tagtranslation(request):
    22 def tagtranslation(request):
    63     
    23     
       
    24     lang = request.GET.get('lang',request.LANGUAGE_CODE)
    64     labels = request.GET.get('labels',None)
    25     labels = request.GET.get('labels',None)
    65 
    26 
    66     if not labels:
    27     if not labels:
    67         return HttpResponse(content=json.dumps({}), mimetype='application/json')
    28         return HttpResponse(content=json.dumps({}), mimetype='application/json')
    68     
    29     
    74         if len(labelqs) > 0:
    35         if len(labelqs) > 0:
    75             tag = labelqs.get()
    36             tag = labelqs.get()
    76             if tag.dbpedia_fields:
    37             if tag.dbpedia_fields:
    77                 masters.append(tag.dbpedia_fields)
    38                 masters.append(tag.dbpedia_fields)
    78     
    39     
    79     translationqs = DbpediaFieldsTranslation.objects.select_related("master", "master__tag").filter(master__in = masters, language_code=request.LANGUAGE_CODE)
    40     translationqs = DbpediaFieldsTranslation.objects.select_related("master", "master__tag").filter(master__in = masters, language_code=lang)
    80     
    41     
    81     translations = dict([(t.master.label, t.label) for t in translationqs])
    42     translations = dict([(t.master.label, t.label) for t in translationqs])
    82     
    43     
    83     return HttpResponse(content=json.dumps(translations), mimetype='application/json')
    44     return HttpResponse(content=json.dumps(translations), mimetype='application/json')
    84 
    45 
   221 
   182 
   222 
   183 
   223 def tagsearch(request):
   184 def tagsearch(request):
   224     
   185     
   225     q = request.GET.get('term',None)
   186     q = request.GET.get('term',None)
       
   187     lang = request.GET.get('lang',request.LANGUAGE_CODE)
       
   188     
       
   189     stemming_langs = [ 'fr', 'en', 'de', 'it' ]
       
   190     # For Japanese, there are no word boundaries, we should not use the regexp in that case
       
   191     no_translate_langs = [ 'fr' ]
       
   192     
   226     if q:
   193     if q:
   227         lq = q.lower()
   194         lq = q.lower()
   228     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))       
   195         qs = Tag.objects.select_related('dbpedia_fields').filter(datasheet__validated=True)
   229     qs = qs.annotate(nb=Count('datasheet')).order_by('-nb')[:20]
   196         qrx = '(\\m|\\b)%s'%q
       
   197         if lang in no_translate_langs:
       
   198             if lang in stemming_langs:
       
   199                 qs = qs.filter( label__iregex = qrx )
       
   200             else:
       
   201                 qs = qs.filter( label__icontains = q )
       
   202         else:
       
   203             if lang in stemming_langs:
       
   204                 qs = qs.filter( Q(label__iregex=q ) | Q(dbpedia_fields__translations__label__iregex=q, dbpedia_fields__translations__language_code=lang), ~Q(dbpedia_uri = None))
       
   205             else:
       
   206                 qs = qs.filter( Q(label__icontains=q ) | Q(dbpedia_fields__translations__label__icontains=q, dbpedia_fields__translations__language_code=lang), ~Q(dbpedia_uri = None))
       
   207     else:
       
   208         qs = Tag.objects.filter(~Q(dbpedia_uri = None))
       
   209            
       
   210     qs = qs.annotate(nb=Count('datasheet',distinct=True)).order_by('-nb')[:20]
   230     
   211     
   231     qslist = list(qs)
   212     qslist = list(qs)
   232     
   213     
   233     transqs = DbpediaFieldsTranslation.objects.filter(master__tag__in = qslist, language_code=request.LANGUAGE_CODE).select_related("master")
   214     if lang in no_translate_langs:
   234     
   215         translations = {}
   235     translations = dict([(tr.master.tag_id, tr.label) for tr in transqs])
   216     else:
       
   217         transqs = DbpediaFieldsTranslation.objects.filter(master__tag__in = qslist, language_code=lang).select_related("master")
       
   218         translations = dict([(tr.master.tag_id, {'label':tr.label,'abstract':tr.abstract}) for tr in transqs])
   236     
   219     
   237     res = []
   220     res = []
   238     
   221     
   239     for t in qslist:
   222     for t in qslist:
   240         resobj = {'value':t.label,'nb':t.nb}
   223         dbfields = t.dbpedia_fields
       
   224         resobj = {'original_label':t.label,'nb':t.nb}
       
   225         resobj['thumbnail'] = dbfields.thumbnail if dbfields is not None else None
   241         if t.id in translations:
   226         if t.id in translations:
   242             resobj['label'] = translations[t.id]
   227             resobj['value'] = translations[t.id]['label']
   243         else:
   228             resobj['abstract'] = translations[t.id]['abstract']
   244             resobj['label'] = t.label
   229         else:
   245         if q is None or resobj['label'].lower().find(lq) != -1:
   230             resobj['value'] = t.label
       
   231             resobj['abstract'] = dbfields.abstract if dbfields is not None else None
       
   232         if q is None or resobj['value'].lower().find(lq) != -1:
   246             res.append(resobj)
   233             res.append(resobj)
       
   234     res.sort(key=lambda resobj: resobj['value'])
   247     
   235     
   248     return HttpResponse(content=json.dumps(res), mimetype='application/json')
   236     return HttpResponse(content=json.dumps(res), mimetype='application/json')
   249 
   237 
   250 def catsearch(request):
   238 def catsearch(request):
   251     
   239     
   252     q = request.GET.get('term',None)
   240     q = request.GET.get('term',None)
   253     
   241     
   254     # On ne récupère que les catégories qui sont également des tags
   242     # On ne récupère que les catégories qui sont également des tags
   255     
   243     qrx = '(\\m|\\b)%s'%q
   256     qs = Tag.objects.filter(Q(label__icontains = ' ' + q ) | Q(label__istartswith = q))
   244     qs = Tag.objects.filter(label__iregex=q)
   257     
   245     
   258     labels = [tag.label for tag in qs]
   246     labels = [tag.label for tag in qs]
   259     
   247     
   260     qs = WpCategory.objects.filter(label__in = labels)
   248     qs = WpCategory.objects.annotate(nb=Count('child_categories__child_category__tags')).filter(label__in = labels, nb__gt=0)
   261     
   249     
   262     res = [{'value':t.label} for t in qs]
   250     res = [{'value':t.label} for t in qs]
   263     
   251     
   264     return HttpResponse(content=json.dumps(res), mimetype='application/json')
   252     return HttpResponse(content=json.dumps(res), mimetype='application/json')
   265 
   253 
   266 def filter(request):
   254 def filter(request):
   267     
   255     
       
   256     lang = request.GET.get('lang',request.LANGUAGE_CODE)
   268     periode = request.GET.get('period',None)
   257     periode = request.GET.get('period',None)
   269     label = request.GET.get('label', None)
   258     label = request.GET.get('label', None)
   270     country = request.GET.get('country', None)
   259     country = request.GET.get('country', None)
   271     contentlist = request.GET.get('contentlist', None)
   260     contentlist = request.GET.get('contentlist', None)
   272     max_tag_order = request.GET.get('mto', 12)
   261     max_tag_order = request.GET.get('mto', 12)
   273     content_count = request.GET.get('contentcount', 12)
   262     content_count = request.GET.get('contentcount', 12)
   274     tag_count = request.GET.get('tagcount', 30)
   263     tag_count = request.GET.get('tagcount', 30)
   275     
   264     
   276     key_parts = ("filter",request.LANGUAGE_CODE,periode,label,country,contentlist,max_tag_order,content_count,tag_count)
   265     key_parts = ("filter",lang,periode,label,country,contentlist,max_tag_order,content_count,tag_count)
   277     key_parts = [unicode(p).encode("utf-8") for p in key_parts]
   266     key_parts = [unicode(p).encode("utf-8") for p in key_parts]
   278     
   267     
   279     cache_key = fix_cache_key("-".join(key_parts))
   268     cache_key = fix_cache_key("-".join(key_parts))
   280     
   269     
   281     outputstr = cache.get(cache_key)
   270     outputstr = cache.get(cache_key)
   334             contentqs = contentqs.filter(tagcond).distinct()
   323             contentqs = contentqs.filter(tagcond).distinct()
   335             matchtagidsqs = list(Tag.objects.select_related("dbpedia_fields").only("id").filter(tagcondid))
   324             matchtagidsqs = list(Tag.objects.select_related("dbpedia_fields").only("id").filter(tagcondid))
   336             matchtagids = [t.id for t in matchtagidsqs]            
   325             matchtagids = [t.id for t in matchtagidsqs]            
   337             masters = [t.dbpedia_fields for t in matchtagidsqs if t.dbpedia_fields is not None]
   326             masters = [t.dbpedia_fields for t in matchtagidsqs if t.dbpedia_fields is not None]
   338             
   327             
   339             translationqs = DbpediaFieldsTranslation.objects.select_related("master", "master__tag").filter(master__in = masters, language_code=request.LANGUAGE_CODE)    
   328             translationqs = DbpediaFieldsTranslation.objects.select_related("master", "master__tag").filter(master__in = masters, language_code=lang)    
   340             labeltranslations = [{'label':t.master.label, 'translated_label':t.label} for t in translationqs]
   329             labeltranslations = [{'label':t.master.label, 'translated_label':t.label} for t in translationqs]
   341 
   330 
   342             
   331             
   343             tagqs = tagqs.filter(datasheet__in = contentqs)
   332             tagqs = tagqs.filter(datasheet__in = contentqs)
   344             countryqs = countryqs.filter(includes__tag__taggedsheet__datasheet__in = contentqs)
   333             countryqs = countryqs.filter(includes__tag__taggedsheet__datasheet__in = contentqs)
   357         for dse in qs:
   346         for dse in qs:
   358             contenus[dse.datasheet_id]['coords'] = {'city_name': dse.insee.city_name, 'latitude': dse.insee.latitude, 'longitude': dse.insee.longitude}
   347             contenus[dse.datasheet_id]['coords'] = {'city_name': dse.insee.city_name, 'latitude': dse.insee.latitude, 'longitude': dse.insee.longitude}
   359         
   348         
   360         qs = list(TaggedSheet.objects.select_related('tag', 'tag__dbpedia_fields').filter(datasheet__in = contentids, order__lte = max_tag_order).order_by('order'))
   349         qs = list(TaggedSheet.objects.select_related('tag', 'tag__dbpedia_fields').filter(datasheet__in = contentids, order__lte = max_tag_order).order_by('order'))
   361         
   350         
   362         transqs = DbpediaFieldsTranslation.objects.filter(master__in = [ts.tag.dbpedia_fields for ts in qs], language_code = request.LANGUAGE_CODE)
   351         transqs = DbpediaFieldsTranslation.objects.filter(master__in = [ts.tag.dbpedia_fields for ts in qs], language_code = lang)
   363         translations = dict([(trans.master_id,trans.label) for trans in transqs])
   352         translations = dict([(trans.master_id,trans.label) for trans in transqs])
   364         
   353         
   365         for ts in qs:
   354         for ts in qs:
   366             match_tag = ts.tag.id in matchtagids
   355             match_tag = ts.tag.id in matchtagids
   367             contenus[ts.datasheet_id]['tags'].append({'id': ts.tag.id, 'label':ts.tag.label, 'order':ts.order, 'match': match_tag , 'translated_label': translations.get(ts.tag.dbpedia_fields.id, ts.tag.label) if ts.tag.dbpedia_fields is not None else ts.tag.label})
   356             contenus[ts.datasheet_id]['tags'].append({'id': ts.tag.id, 'label':ts.tag.label, 'order':ts.order, 'match': match_tag , 'translated_label': translations.get(ts.tag.dbpedia_fields.id, ts.tag.label) if ts.tag.dbpedia_fields is not None else ts.tag.label})
   385     
   374     
   386         tagqslist = list(tagqs)
   375         tagqslist = list(tagqs)
   387         
   376         
   388         dbpediafields = dict([(df.tag_id, df) for df in DbpediaFields.objects.filter(tag__in = tagqslist)])
   377         dbpediafields = dict([(df.tag_id, df) for df in DbpediaFields.objects.filter(tag__in = tagqslist)])
   389     
   378     
   390         transqs = DbpediaFieldsTranslation.objects.filter(master__in = dbpediafields.values(), language_code = request.LANGUAGE_CODE)
   379         transqs = DbpediaFieldsTranslation.objects.filter(master__in = dbpediafields.values(), language_code = lang)
   391         translations = dict([(trans.master_id,trans.label) for trans in transqs])
   380         translations = dict([(trans.master_id,trans.label) for trans in transqs])
   392     
   381     
   393         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]
   382         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]
   394     
   383     
   395         countryqs = countryqs.annotate(nb=Count('includes__tag__taggedsheet'))
   384         countryqs = countryqs.annotate(nb=Count('includes__tag__taggedsheet'))
   396         countries = dict([(country.dbpedia_uri, country.nb) for country in countryqs])
   385         countries = dict([(country.dbpedia_uri, country.nb) for country in countryqs])
   397     
   386     
   398         discqslist = list(discqs.annotate(nb=Count('taggedsheet')).order_by('-nb')[:10])
   387         discqslist = list(discqs.annotate(nb=Count('taggedsheet')).order_by('-nb')[:10])
   399             
   388             
   400         transqs = DbpediaFieldsTranslation.objects.filter(master__in = [tag.dbpedia_fields for tag in discqslist], language_code = request.LANGUAGE_CODE)
   389         transqs = DbpediaFieldsTranslation.objects.filter(master__in = [tag.dbpedia_fields for tag in discqslist], language_code = lang)
   401         translations = dict([(trans.master_id,trans.label) for trans in transqs])
   390         translations = dict([(trans.master_id,trans.label) for trans in transqs])
   402     
   391     
   403         
   392         
   404         disciplines = [{'label':tag.label,'score':tag.nb, 'translated_label': translations.get(tag.dbpedia_fields.id, tag.label) if tag.dbpedia_fields is not None else tag.label} for tag in discqslist]
   393         disciplines = [{'label':tag.label,'score':tag.nb, 'translated_label': translations.get(tag.dbpedia_fields.id, tag.label) if tag.dbpedia_fields is not None else tag.label} for tag in discqslist]
   405         
   394