src/hdalab/views/ajax.py
changeset 620 f45d7494332e
parent 605 40d8113560e4
child 693 09e00f38d177
child 702 2a6e667b1610
equal deleted inserted replaced
619:2695537badbe 620:f45d7494332e
    21 
    21 
    22 import logging
    22 import logging
    23 logger = logging.getLogger(__name__)
    23 logger = logging.getLogger(__name__)
    24 
    24 
    25 def tagtranslation(request):
    25 def tagtranslation(request):
    26     
    26 
    27     lang = request.GET.get('lang',request.LANGUAGE_CODE)
    27     lang = request.GET.get('lang',request.LANGUAGE_CODE)
    28     labels = request.GET.get('labels',None)
    28     labels = request.GET.get('labels',None)
    29 
    29 
    30     if not labels:
    30     if not labels:
    31         return HttpResponse(content=json.dumps({}), content_type='application/json')
    31         return HttpResponse(content=json.dumps({}), content_type='application/json')
    32     
    32 
    33     labelslist = [lbl.strip() for lbl in labels.split(",")]
    33     labelslist = [lbl.strip() for lbl in labels.split(",")]
    34     masters = []
    34     masters = []
    35     
    35 
    36     for lbl in labelslist:
    36     for lbl in labelslist:
    37         labelqs = Tag.objects.select_related('dbpedia_fields').filter(~Q(dbpedia_uri = None), label__iexact = lbl)[0:1]
    37         labelqs = Tag.objects.select_related('dbpedia_fields').filter(~Q(dbpedia_uri = None), label__iexact = lbl)[0:1]
    38         if len(labelqs) > 0:
    38         if len(labelqs) > 0:
    39             tag = labelqs.get()
    39             tag = labelqs.get()
    40             if tag.dbpedia_fields:
    40             if tag.dbpedia_fields:
    41                 masters.append(tag.dbpedia_fields)
    41                 masters.append(tag.dbpedia_fields)
    42     
    42 
    43     translationqs = DbpediaFieldsTranslation.objects.select_related("master", "master__tag").filter(master__in = masters, language_code=lang)
    43     translationqs = DbpediaFieldsTranslation.objects.select_related("master", "master__tag").filter(master__in = masters, language_code=lang)
    44     
    44 
    45     translations = dict([(t.master.label, t.label) for t in translationqs])
    45     translations = dict([(t.master.label, t.label) for t in translationqs])
    46     
    46 
    47     return HttpResponse(content=json.dumps(translations), content_type='application/json')
    47     return HttpResponse(content=json.dumps(translations), content_type='application/json')
    48 
    48 
    49 def subcat(category, globtags, level, max_level ):
    49 def subcat(category, globtags, level, max_level ):
    50     # recursive function used by cattree
    50     # recursive function used by cattree
    51     catlabel = category.label
    51     catlabel = category.label
    61             globtags[label] = {'level': level, 'access': resobj }
    61             globtags[label] = {'level': level, 'access': resobj }
    62         else:
    62         else:
    63             tag_in_list = {'label' : label, 'contents': []}
    63             tag_in_list = {'label' : label, 'contents': []}
    64             resobj['themes'].append(tag_in_list)
    64             resobj['themes'].append(tag_in_list)
    65             globtags[label] = {'level': (level + 1), 'access': tag_in_list }
    65             globtags[label] = {'level': (level + 1), 'access': tag_in_list }
    66             
    66 
    67     if level < max_level:
    67     if level < max_level:
    68         subcats = WpCategory.objects.filter(parent_categories__parent_category = category)
    68         subcats = WpCategory.objects.filter(parent_categories__parent_category = category)
    69         resobj['themes'] += [subcat(subcats[i], globtags, level + 1, max_level ) for i in range(len(subcats))]
    69         resobj['themes'] += [subcat(subcats[i], globtags, level + 1, max_level ) for i in range(len(subcats))]
    70     return resobj
    70     return resobj
    71 
    71 
    96     globtags = {}
    96     globtags = {}
    97     resobj = {}
    97     resobj = {}
    98     master_category = WpCategory.objects.filter(label__iexact=label)[0:1]
    98     master_category = WpCategory.objects.filter(label__iexact=label)[0:1]
    99     if len(master_category):
    99     if len(master_category):
   100         resobj = subcat(master_category[0], globtags, 1, MAX_LEVEL )
   100         resobj = subcat(master_category[0], globtags, 1, MAX_LEVEL )
   101     
   101 
   102     #datasheets = Datasheet.objects.filter(validated = True, taggedsheet__tag__label__in = tag_list, taggedsheet__order__lte = MAX_TAG_ORDER).distinct()
   102     #datasheets = Datasheet.objects.filter(validated = True, taggedsheet__tag__label__in = tag_list, taggedsheet__order__lte = MAX_TAG_ORDER).distinct()
   103     datasheets = Datasheet.objects.filter(validated = True, taggedsheet__tag__label__iexact = label, taggedsheet__order__lte = ROOT_MAX_TAG_ORDER).select_related('organisation').distinct()
   103     datasheets = Datasheet.objects.filter(validated = True, taggedsheet__tag__label__iexact = label, taggedsheet__order__lte = ROOT_MAX_TAG_ORDER).select_related('organisation').distinct()
   104     for datasheet in datasheets:
   104     for datasheet in datasheets:
   105         # Calculating where we add the datasheet in the tree
   105         # Calculating where we add the datasheet in the tree
   106         maintag = None
   106         maintag = None
   141             'label': label,
   141             'label': label,
   142             'themes': [],
   142             'themes': [],
   143             'contents': []
   143             'contents': []
   144         }
   144         }
   145 
   145 
   146     
   146 
   147     return HttpResponse(content=json.dumps(resobj), content_type='application/json')
   147     return HttpResponse(content=json.dumps(resobj), content_type='application/json')
   148 
   148 
   149 def sessioninfo(request):
   149 def sessioninfo(request):
   150     
   150 
   151     data = json.loads(request.GET.get('data', "{}"))
   151     data = json.loads(request.GET.get('data', "{}"))
   152     write = False
   152     write = False
   153     
   153 
   154     if 'sessionid' in request.GET:
   154     if 'sessionid' in request.GET:
   155         request.session['sessionid'] = request.GET['sessionid']
   155         request.session['sessionid'] = request.GET['sessionid']
   156     if 'sessionkey' in request.GET:
   156     if 'sessionkey' in request.GET:
   157         request.session['sessionkey'] = request.GET['sessionkey']
   157         request.session['sessionkey'] = request.GET['sessionkey']
   158         
   158 
   159     if 'sessionid' in request.session:
   159     if 'sessionid' in request.session:
   160         sessionid = request.session['sessionid']
   160         sessionid = request.session['sessionid']
   161         
   161 
   162         if HdaSession.objects.filter(sessionid=sessionid).count() == 1:
   162         if HdaSession.objects.filter(sessionid=sessionid).count() == 1:
   163             sessionkey = request.session.get('sessionkey',None)
   163             sessionkey = request.session.get('sessionkey',None)
   164             hm = hmac.new(settings.SECRET_KEY, sessionid)
   164             hm = hmac.new(settings.SECRET_KEY, sessionid)
   165             if hm.hexdigest() == sessionkey:
   165             if hm.hexdigest() == sessionkey:
   166                 write = True            
   166                 write = True
   167         else:
   167         else:
   168             del request.session['sessionid']
   168             del request.session['sessionid']
   169         
   169 
   170     if 'sessionid' not in request.session:
   170     if 'sessionid' not in request.session:
   171         sessionid = unicode(uuid.uuid1())
   171         sessionid = unicode(uuid.uuid1())
   172         HdaSession.objects.create(sessionid=sessionid, data=json.dumps({}))
   172         HdaSession.objects.create(sessionid=sessionid, data=json.dumps({}))
   173         write = True
   173         write = True
   174         request.session['sessionid'] = sessionid
   174         request.session['sessionid'] = sessionid
   175         request.session['sessionkey'] = hmac.new(settings.SECRET_KEY, sessionid).hexdigest()
   175         request.session['sessionkey'] = hmac.new(settings.SECRET_KEY, sessionid).hexdigest()
   176         
   176 
   177     if write and data:
   177     if write and data:
   178         HdaSession.objects.filter(sessionid=sessionid).update(data=json.dumps(data))
   178         HdaSession.objects.filter(sessionid=sessionid).update(data=json.dumps(data))
   179     else:
   179     else:
   180         data = HdaSession.objects.get(sessionid=sessionid).data
   180         data = HdaSession.objects.get(sessionid=sessionid).data
   181         data = json.loads(data) if data else {}
   181         data = json.loads(data) if data else {}
   182          
   182 
   183     resobj = {'data': data, "write_allowed" : write, "sessionid": sessionid }
   183     resobj = {'data': data, "write_allowed" : write, "sessionid": sessionid }
   184     if write:
   184     if write:
   185         resobj['sessionkey'] = request.session['sessionkey']
   185         resobj['sessionkey'] = request.session['sessionkey']
   186         
   186 
   187     return HttpResponse(content=json.dumps(resobj), content_type='application/json')
   187     return HttpResponse(content=json.dumps(resobj), content_type='application/json')
   188 
   188 
   189 
   189 
   190 def tagsearch(request):
   190 def tagsearch(request):
   191     
   191 
   192     q = request.GET.get('term',None)
   192     q = request.GET.get('term',None)
   193     maxcount = int(request.GET.get('count','40'))
   193     maxcount = int(request.GET.get('count','40'))
   194     lang = request.GET.get('lang',request.LANGUAGE_CODE)
   194     lang = request.GET.get('lang',request.LANGUAGE_CODE)
   195     count_notices_str = request.REQUEST.get("count_notices")
   195     count_notices_str = request.REQUEST.get("count_notices")
   196     count_notices_bool = True
   196     count_notices_bool = True
   197     if count_notices_str:
   197     if count_notices_str:
   198         count_notices_bool = {'true': True, 'false': False, "0": False, "1": True}.get(count_notices_str.lower())
   198         count_notices_bool = {'true': True, 'false': False, "0": False, "1": True}.get(count_notices_str.lower())
   199     
   199 
   200     stemming_langs = [ 'fr', 'en', 'de', 'it' ]
   200     stemming_langs = [ 'fr', 'en', 'de', 'it' ]
   201     # For Japanese, there are no word boundaries, we should not use the regexp in that case
   201     # For Japanese, there are no word boundaries, we should not use the regexp in that case
   202     no_translate_langs = [ 'fr' ]
   202     no_translate_langs = [ 'fr' ]
   203     
   203 
   204     if q:
   204     if q:
   205         lq = q.lower()
   205         lq = q.lower()
   206         qs = Tag.objects.select_related('dbpedia_fields').filter(datasheet__validated=True)
   206         qs = Tag.objects.select_related('dbpedia_fields').filter(datasheet__validated=True)
   207         qrx = '(\\m|\\b)%s'%q
   207         qrx = '(\\m|\\b)%s'%q
   208         if lang in no_translate_langs:
   208         if lang in no_translate_langs:
   215                 qs = qs.filter(dbpedia_fields__translations__label__iregex=qrx, dbpedia_fields__translations__language_code=lang, dbpedia_fields__translations__is_label_translated = True)
   215                 qs = qs.filter(dbpedia_fields__translations__label__iregex=qrx, dbpedia_fields__translations__language_code=lang, dbpedia_fields__translations__is_label_translated = True)
   216             else:
   216             else:
   217                 qs = qs.filter(dbpedia_fields__translations__label__icontains=q, dbpedia_fields__translations__language_code=lang, dbpedia_fields__translations__is_label_translated = True)
   217                 qs = qs.filter(dbpedia_fields__translations__label__icontains=q, dbpedia_fields__translations__language_code=lang, dbpedia_fields__translations__is_label_translated = True)
   218     else:
   218     else:
   219         qs = Tag.objects.filter(~Q(dbpedia_uri = None))
   219         qs = Tag.objects.filter(~Q(dbpedia_uri = None))
   220     
   220 
   221     if count_notices_bool:
   221     if count_notices_bool:
   222         qs = qs.annotate(nb=Count('datasheet',distinct=True)).order_by('-nb')[:maxcount]
   222         qs = qs.annotate(nb=Count('datasheet',distinct=True)).order_by('-nb')[:maxcount]
   223     else:
   223     else:
   224         qs = qs.distinct()[:maxcount]
   224         qs = qs.distinct()[:maxcount]
   225     
   225 
   226     qslist = list(qs)
   226     qslist = list(qs)
   227     
   227 
   228     if lang in no_translate_langs:
   228     if lang in no_translate_langs:
   229         translations = {}
   229         translations = {}
   230     else:
   230     else:
   231         transqs = DbpediaFieldsTranslation.objects.filter(master__tag__in = qslist, language_code=lang, is_label_translated=True).select_related("master")
   231         transqs = DbpediaFieldsTranslation.objects.filter(master__tag__in = qslist, language_code=lang, is_label_translated=True).select_related("master")
   232         translations = dict([(tr.master.tag_id, {'label':tr.label,'abstract':tr.abstract, 'is_label_translated': tr.is_label_translated}) for tr in transqs])
   232         translations = dict([(tr.master.tag_id, {'label':tr.label,'abstract':tr.abstract, 'is_label_translated': tr.is_label_translated}) for tr in transqs])
   233     
   233 
   234     res = []
   234     res = []
   235     
   235 
   236     for t in qslist:
   236     for t in qslist:
   237         if hasattr(t, 'dbpedia_fields'):
   237         if hasattr(t, 'dbpedia_fields'):
   238             dbfields = t.dbpedia_fields
   238             dbfields = t.dbpedia_fields
   239             resobj = {'original_label':t.label, 'url':t.wikipedia_url}
   239             resobj = {'original_label':t.label, 'url':t.wikipedia_url}
   240             if count_notices_bool:
   240             if count_notices_bool:
   241                 resobj['nb'] = t.nb
   241                 resobj['nb'] = t.nb
   242             resobj['thumbnail'] = dbfields.thumbnail if dbfields is not None else None
   242             resobj['thumbnail'] = dbfields.thumbnail if dbfields is not None else None
   243             
   243 
   244             if t.id in translations:
   244             if t.id in translations:
   245                 resobj['value'] = translations[t.id]['label']
   245                 resobj['value'] = translations[t.id]['label']
   246                 resobj['abstract'] = translations[t.id]['abstract']
   246                 resobj['abstract'] = translations[t.id]['abstract']
   247             else:
   247             else:
   248                 resobj['value'] = t.label
   248                 resobj['value'] = t.label
   249                 resobj['abstract'] = dbfields.abstract if dbfields is not None else None
   249                 resobj['abstract'] = dbfields.abstract if dbfields is not None else None
   250             if q is None or resobj['value'].lower().find(lq) != -1:
   250             if q is None or resobj['value'].lower().find(lq) != -1:
   251                 res.append(resobj)
   251                 res.append(resobj)
   252     
   252 
   253     return HttpResponse(content=json.dumps(res), content_type='application/json')
   253     return HttpResponse(content=json.dumps(res), content_type='application/json')
   254 
   254 
   255 def catsearch(request):
   255 def catsearch(request):
   256     
   256 
   257     q = request.GET.get('term',None)
   257     q = request.GET.get('term',None)
   258     
   258 
   259     # On ne récupère que les catégories qui sont également des tags
   259     # On ne récupère que les catégories qui sont également des tags
   260     qrx = '(\\m|\\b)%s'%q
   260     qrx = '(\\m|\\b)%s'%q
   261     qs = Tag.objects.filter(label__iregex=qrx)
   261     qs = Tag.objects.filter(label__iregex=qrx)
   262     
   262 
   263     labels = [tag.label for tag in qs]
   263     labels = [tag.label for tag in qs]
   264     
   264 
   265     qs = WpCategory.objects.annotate(nb=Count('child_categories__child_category__tags')).filter(label__in = labels, nb__gt=0)
   265     qs = WpCategory.objects.annotate(nb=Count('child_categories__child_category__tags')).filter(label__in = labels, nb__gt=0)
   266     
   266 
   267     res = [{'value':t.label} for t in qs]
   267     res = [{'value':t.label} for t in qs]
   268     
   268 
   269     return HttpResponse(content=json.dumps(res), content_type='application/json')
   269     return HttpResponse(content=json.dumps(res), content_type='application/json')
   270 
   270 
   271 def filter(request):
   271 def filter(request):
   272     
   272 
   273     lang = request.GET.get('lang',request.LANGUAGE_CODE)
   273     lang = request.GET.get('lang',request.LANGUAGE_CODE)
   274     periode = request.GET.get('period',None)
   274     periode = request.GET.get('period',None)
   275     label = request.GET.get('label', None)
   275     label = request.GET.get('label', None)
   276     country = request.GET.get('country', None)
   276     country = request.GET.get('country', None)
   277     contentlist = request.GET.get('contentlist', None)
   277     contentlist = request.GET.get('contentlist', None)
   278     max_tag_order = int(request.GET.get('mto', '12'))
   278     max_tag_order = int(request.GET.get('mto', '12'))
   279     content_count = request.GET.get('contentcount', 8)
   279     content_count = request.GET.get('contentcount', 8)
   280     tag_count = request.GET.get('tagcount', 30)
   280     tag_count = request.GET.get('tagcount', 30)
   281     
   281 
   282     outputstr = filter_generic(lang, periode, label, country, contentlist, max_tag_order, content_count, tag_count)
   282     outputstr = filter_generic(lang, periode, label, country, contentlist, max_tag_order, content_count, tag_count)
   283         
   283 
   284     return HttpResponse(content=outputstr, content_type='application/json')
   284     return HttpResponse(content=outputstr, content_type='application/json')
   285 
   285 
   286 
   286 
   287 def filter_generic(lang="fr-fr", periode=None, label=None, country=None, contentlist=None, max_tag_order=12, content_count=8, tag_count=30):
   287 def filter_generic(lang="fr-fr", periode=None, label=None, country=None, contentlist=None, max_tag_order=12, content_count=8, tag_count=30):
   288     
   288 
   289     no_translate_langs = [ 'fr' ]
   289     no_translate_langs = [ 'fr' ]
   290     
   290 
   291     key_parts = ("filter",lang,periode,label,country,contentlist,max_tag_order,content_count,tag_count)
   291     key_parts = ("filter",lang,periode,label,country,contentlist,max_tag_order,content_count,tag_count)
   292     key_parts = [unicode(p).encode("ascii", "ignore") for p in key_parts]
   292     key_parts = [unicode(p).encode("ascii", "ignore") for p in key_parts]
   293     
   293 
   294     cache_key = fix_cache_key("-".join(key_parts))
   294     cache_key = fix_cache_key("-".join(key_parts))
   295     
   295 
   296     outputstr = cache.get(cache_key)
   296     outputstr = cache.get(cache_key)
   297     
   297 
   298     if outputstr is None:
   298     if outputstr is None:
   299         
   299 
   300         matchtagids = []
   300         matchtagids = []
   301         
   301 
   302         tagqs = Tag.objects.exclude(category__label__in = ['Datation', 'Localisation', 'Discipline artistique']).filter(~Q(dbpedia_uri = None))
   302         tagqs = Tag.objects.exclude(category__label__in = ['Datation', 'Localisation', 'Discipline artistique']).filter(~Q(dbpedia_uri = None))
   303         countryqs = Country.objects
   303         countryqs = Country.objects
   304         discqs = Tag.objects.filter(~Q(dbpedia_uri = None), category__label = u'Discipline artistique').select_related('dbpedia_fields')
   304         discqs = Tag.objects.filter(~Q(dbpedia_uri = None), category__label = u'Discipline artistique').select_related('dbpedia_fields')
   305         yearqs = TagYears.objects
   305         yearqs = TagYears.objects
   306         
   306 
   307         contentqs = Datasheet.objects.filter(validated=True)
   307         contentqs = Datasheet.objects.filter(validated=True)
   308         labeltranslations = []
   308         labeltranslations = []
   309     
   309 
   310         if label or periode or country or contentlist :
   310         if label or periode or country or contentlist :
   311             matchtagqslist = []
   311             matchtagqslist = []
   312             
   312 
   313             if periode:
   313             if periode:
   314                 years = periode.split(",")
   314                 years = periode.split(",")
   315                 start_year = int(years[0])
   315                 start_year = int(years[0])
   316                 end_year = int(years[0:2][-1])
   316                 end_year = int(years[0:2][-1])
   317                 delta = max(1, (end_year-start_year)/2)
   317                 delta = max(1, (end_year-start_year)/2)
   318                 minstart = start_year - delta
   318                 minstart = start_year - delta
   319                 maxend = end_year + delta
   319                 maxend = end_year + delta
   320                 matchtagqs = Tag.objects.filter(~Q(dbpedia_uri = None),
   320                 matchtagqs = Tag.objects.filter(~Q(dbpedia_uri = None),
   321                                                 years__end_year__gte = start_year, 
   321                                                 years__end_year__gte = start_year,
   322                                                 years__start_year__lte = end_year,
   322                                                 years__start_year__lte = end_year,
   323                                                 years__end_year__lte = maxend,
   323                                                 years__end_year__lte = maxend,
   324                                                 years__start_year__gte = minstart,
   324                                                 years__start_year__gte = minstart,
   325                                                 )
   325                                                 )
   326                 matchtagqslist.append(matchtagqs)
   326                 matchtagqslist.append(matchtagqs)
   327                 
   327 
   328             if label:
   328             if label:
   329                 for txtlbl in label.split(","):
   329                 for txtlbl in label.split(","):
   330                     matchtagqs = Tag.objects.select_related('dbpedia_fields').filter(~Q(dbpedia_uri = None), label__iexact = txtlbl.strip())
   330                     matchtagqs = Tag.objects.select_related('dbpedia_fields').filter(~Q(dbpedia_uri = None), label__iexact = txtlbl.strip())
   331                     matchtagqslist.append(matchtagqs)
   331                     matchtagqslist.append(matchtagqs)
   332                 
   332 
   333             if country:
   333             if country:
   334                 for country_uri in country.split(","):
   334                 for country_uri in country.split(","):
   335                     matchtagqs = Tag.objects.filter(~Q(dbpedia_uri = None),locatedin__country__dbpedia_uri = country_uri)
   335                     matchtagqs = Tag.objects.filter(~Q(dbpedia_uri = None),locatedin__country__dbpedia_uri = country_uri)
   336                     matchtagids += [t.id for t in matchtagqs if t.id not in matchtagids]
   336                     matchtagids += [t.id for t in matchtagqs if t.id not in matchtagids]
   337                     matchtagqslist.append(matchtagqs)
   337                     matchtagqslist.append(matchtagqs)
   343             for matchtagqs in matchtagqslist:
   343             for matchtagqs in matchtagqslist:
   344                 newcond = Q(id__in = TaggedSheet.objects.filter(tag__in = copy.deepcopy(matchtagqs), order__lte = max_tag_order).values('datasheet_id'))
   344                 newcond = Q(id__in = TaggedSheet.objects.filter(tag__in = copy.deepcopy(matchtagqs), order__lte = max_tag_order).values('datasheet_id'))
   345                 newcondid = Q(id__in = matchtagqs)
   345                 newcondid = Q(id__in = matchtagqs)
   346                 tagcond = newcond if tagcond is None else (tagcond & newcond)
   346                 tagcond = newcond if tagcond is None else (tagcond & newcond)
   347                 tagcondid = newcondid if tagcondid is None else (tagcondid | newcondid)
   347                 tagcondid = newcondid if tagcondid is None else (tagcondid | newcondid)
   348             
   348 
   349             contentqs = contentqs.filter(tagcond).distinct()
   349             contentqs = contentqs.filter(tagcond).distinct()
   350             matchtagidsqs = list(Tag.objects.select_related("dbpedia_fields").only("id").filter(tagcondid))
   350             matchtagidsqs = list(Tag.objects.select_related("dbpedia_fields").only("id").filter(tagcondid))
   351             matchtagids = [t.id for t in matchtagidsqs]
   351             matchtagids = [t.id for t in matchtagidsqs]
   352             
   352 
   353             if lang not in no_translate_langs:
   353             if lang not in no_translate_langs:
   354                 masters = [t.dbpedia_fields for t in matchtagidsqs if t.dbpedia_fields is not None]
   354                 masters = [t.dbpedia_fields for t in matchtagidsqs if t.dbpedia_fields is not None]
   355                 
   355 
   356                 translationqs = DbpediaFieldsTranslation.objects.select_related("master", "master__tag").filter(master__in = masters, language_code=lang)    
   356                 translationqs = DbpediaFieldsTranslation.objects.select_related("master", "master__tag").filter(master__in = masters, language_code=lang)
   357                 labeltranslations = [{'label':t.master.label, 'translated_label':t.label} for t in translationqs]
   357                 labeltranslations = [{'label':t.master.label, 'translated_label':t.label} for t in translationqs]
   358             
   358 
   359             tagqs = tagqs.filter(datasheet__in = contentqs)
   359             tagqs = tagqs.filter(datasheet__in = contentqs)
   360             countryqs = countryqs.filter(includes__tag__taggedsheet__datasheet__in = contentqs)
   360             countryqs = countryqs.filter(includes__tag__taggedsheet__datasheet__in = contentqs)
   361             discqs = discqs.filter(datasheet__in = contentqs)
   361             discqs = discqs.filter(datasheet__in = contentqs)
   362             yearqs = yearqs.filter(tag__taggedsheet__datasheet__in = contentqs)
   362             yearqs = yearqs.filter(tag__taggedsheet__datasheet__in = contentqs)
   363             
   363 
   364         if contentlist is None:
   364         if contentlist is None:
   365             contentqs.order_by('?')
   365             contentqs.order_by('?')
   366                         
   366 
   367         cont_count = contentqs.count()
   367         cont_count = contentqs.count()
   368         
   368 
   369         logger.debug("ajax filter SQL for contentqs %s", contentqs.query)
   369         logger.debug("ajax filter SQL for contentqs %s", contentqs.query)
   370         
   370 
   371         contenus = dict([(content.id, {'score' : 0, 'tags' : [], 'hda_id': content.hda_id, 'id':content.id, 'title': content.title, 'description': content.description, 'url': content.url}) for content in contentqs[0:content_count]])
   371         contenus = dict([(content.id, {'score' : 0, 'tags' : [], 'hda_id': content.hda_id, 'id':content.id, 'title': content.title, 'description': content.description, 'url': content.url}) for content in contentqs[0:content_count]])
   372         contentids = contenus.keys()
   372         contentids = contenus.keys()
   373         
   373 
   374         qs = DatasheetExtras.objects.select_related('insee').filter(datasheet__in = contentids)
   374         qs = DatasheetExtras.objects.select_related('insee').filter(datasheet__in = contentids)
   375         for dse in qs:
   375         for dse in qs:
   376             contenus[dse.datasheet_id]['coords'] = {'city_name': dse.insee.city_name, 'latitude': dse.insee.latitude, 'longitude': dse.insee.longitude}
   376             contenus[dse.datasheet_id]['coords'] = {'city_name': dse.insee.city_name, 'latitude': dse.insee.latitude, 'longitude': dse.insee.longitude}
   377         
   377 
   378         qs = list(TaggedSheet.objects.select_related('tag', 'tag__dbpedia_fields').filter(datasheet__in = contentids, order__lte = max_tag_order).order_by('order'))
   378         qs = list(TaggedSheet.objects.select_related('tag', 'tag__dbpedia_fields').filter(datasheet__in = contentids, order__lte = max_tag_order).order_by('order'))
   379         
   379 
   380         translations = {}
   380         translations = {}
   381         
   381 
   382         if lang not in no_translate_langs:
   382         if lang not in no_translate_langs:
   383             ts_list = []
   383             ts_list = []
   384             for ts in qs:
   384             for ts in qs:
   385                 if hasattr(ts, 'tag') and hasattr(ts.tag, 'dbpedia_fields') :
   385                 if hasattr(ts, 'tag') and hasattr(ts.tag, 'dbpedia_fields') :
   386                     ts_list.append(ts.tag.dbpedia_fields)
   386                     ts_list.append(ts.tag.dbpedia_fields)
   387             transqs = DbpediaFieldsTranslation.objects.filter(master__in = ts_list, language_code = lang)
   387             transqs = DbpediaFieldsTranslation.objects.filter(master__in = ts_list, language_code = lang)
   388             translations = dict([(trans.master_id,trans.label) for trans in transqs])
   388             translations = dict([(trans.master_id,trans.label) for trans in transqs])
   389         
   389 
   390         for ts in qs:
   390         for ts in qs:
   391             if hasattr(ts, 'tag') and hasattr(ts.tag, 'dbpedia_fields') :
   391             if hasattr(ts, 'tag') and hasattr(ts.tag, 'dbpedia_fields') :
   392                 match_tag = ts.tag.id in matchtagids
   392                 match_tag = ts.tag.id in matchtagids
   393                 contenus[ts.datasheet_id]['tags'].append({'id': ts.tag.id, 
   393                 contenus[ts.datasheet_id]['tags'].append({'id': ts.tag.id,
   394                                                           'label': ts.tag.label, 
   394                                                           'label': ts.tag.label,
   395                                                           'order': ts.order, 
   395                                                           'order': ts.order,
   396                                                           'match': match_tag, 
   396                                                           'match': match_tag,
   397                                                           'translated_label': translations.get(ts.tag.dbpedia_fields.id, ts.tag.label) if ts.tag.dbpedia_fields is not None else ts.tag.label,
   397                                                           'translated_label': translations.get(ts.tag.dbpedia_fields.id, ts.tag.label) if ts.tag.dbpedia_fields is not None else ts.tag.label,
   398                                                           'url': ts.tag.dbpedia_uri,
   398                                                           'url': ts.tag.dbpedia_uri,
   399                                                           'wkpd_url': ts.tag.wikipedia_url})
   399                                                           'wkpd_url': ts.tag.wikipedia_url})
   400                 
   400 
   401                 if match_tag:
   401                 if match_tag:
   402                     contenus[ts.datasheet_id]['score'] += 2*max_tag_order - ts.order
   402                     contenus[ts.datasheet_id]['score'] += 2*max_tag_order - ts.order
   403             
   403 
   404         if contentlist is None:
   404         if contentlist is None:
   405             contenus = sorted(contenus.values(),key=lambda e: -e['score'])
   405             contenus = sorted(contenus.values(),key=lambda e: -e['score'])
   406         else:
   406         else:
   407             contenus = contenus.values()
   407             contenus = contenus.values()
   408     
   408 
   409         #tagqs = tagqs.annotate(nb=Count('datasheet')).order_by('-nb')[:tag_count]
   409         #tagqs = tagqs.annotate(nb=Count('datasheet')).order_by('-nb')[:tag_count]
   410         tagqs = tagqs.annotate(nb=Count('datasheet')).order_by('-nb').only('id','label')[:tag_count]
   410         tagqs = tagqs.annotate(nb=Count('datasheet')).order_by('-nb').only('id','label', 'dbpedia_uri', 'wikipedia_url')[:tag_count]
   411         #.select_related('dbpedia_fields')
   411         #.select_related('dbpedia_fields')
   412         # hack to add only necessary fields in the group by
   412         # hack to add only necessary fields in the group by
   413         # contournement bug https://code.djangoproject.com/ticket/17144
   413         # contournement bug https://code.djangoproject.com/ticket/17144
   414         tagqs.query.clear_select_fields()
   414         #tagqs.query.clear_select_fields()
   415         tagqs.query.add_fields(['id','label'], False)
   415         #tagqs.query.add_fields(['id','label'], False)
   416         tagqs.query.set_group_by()
   416         #tagqs.query.set_group_by()
   417     
   417 
   418         tagqslist = list(tagqs)
   418         tagqslist = list(tagqs)
   419         
   419 
   420         dbpediafields = dict([(df.tag_id, df) for df in DbpediaFields.objects.filter(tag__in = tagqslist)])
   420         dbpediafields = dict([(df.tag_id, df) for df in DbpediaFields.objects.filter(tag__in = tagqslist)])
   421 
   421 
   422         if lang not in no_translate_langs:
   422         if lang not in no_translate_langs:
   423             transqs = DbpediaFieldsTranslation.objects.filter(master__in = dbpediafields.values(), language_code = lang)
   423             transqs = DbpediaFieldsTranslation.objects.filter(master__in = dbpediafields.values(), language_code = lang)
   424             translations = dict([(trans.master_id,trans.label) for trans in transqs])
   424             translations = dict([(trans.master_id,trans.label) for trans in transqs])
   425     
   425 
   426         tags = [{'id': tag.id, 
   426         tags = [{'id': tag.id,
   427                  'label': tag.label,
   427                  'label': tag.label,
   428                  'score': tag.nb, 
   428                  'score': tag.nb,
   429                  'thumbnail': dbpediafields[tag.id].thumbnail if tag.id in dbpediafields else None,
   429                  'thumbnail': dbpediafields[tag.id].thumbnail if tag.id in dbpediafields else None,
   430                  'translated_label': translations.get(dbpediafields[tag.id].id, tag.label) if tag.id in dbpediafields else tag.label,
   430                  'translated_label': translations.get(dbpediafields[tag.id].id, tag.label) if tag.id in dbpediafields else tag.label,
   431                  'url': tag.dbpedia_uri,
   431                  'url': tag.dbpedia_uri,
   432                  'wkpd_url': tag.wikipedia_url} for tag in tagqslist]
   432                  'wkpd_url': tag.wikipedia_url} for tag in tagqslist]
   433     
   433 
   434         countryqs = countryqs.annotate(nb=Count('includes__tag__taggedsheet'))
   434         countryqs = countryqs.annotate(nb=Count('includes__tag__taggedsheet'))
   435         countries = dict([(country.dbpedia_uri, country.nb) for country in countryqs])
   435         countries = dict([(country.dbpedia_uri, country.nb) for country in countryqs])
   436     
   436 
   437         discqslist = list(discqs.annotate(nb=Count('taggedsheet')).order_by('-nb')[:10])
   437         discqslist = list(discqs.annotate(nb=Count('taggedsheet')).order_by('-nb')[:10])
   438 
   438 
   439         if lang not in no_translate_langs:
   439         if lang not in no_translate_langs:
   440             list_dbpediafields = [tag.dbpedia_fields for tag in discqslist if tag.dbpedia_fields is not None]
   440             list_dbpediafields = [tag.dbpedia_fields for tag in discqslist if tag.dbpedia_fields is not None]
   441             transqs = DbpediaFieldsTranslation.objects.filter(master__in = list_dbpediafields, language_code = lang)
   441             transqs = DbpediaFieldsTranslation.objects.filter(master__in = list_dbpediafields, language_code = lang)
   442             translations = dict([(trans.master_id,trans.label) for trans in transqs])
   442             translations = dict([(trans.master_id,trans.label) for trans in transqs])
   443         
   443 
   444         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]
   444         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]
   445         
   445 
   446         years = {}
   446         years = {}
   447         yearqs = yearqs.annotate(nb=Count('tag__taggedsheet'))
   447         yearqs = yearqs.annotate(nb=Count('tag__taggedsheet'))
   448         for ty in yearqs:
   448         for ty in yearqs:
   449             for year in range(ty.start_year, ty.end_year):
   449             for year in range(ty.start_year, ty.end_year):
   450                 years[year] = ty.nb + (years[year] if year in years else 0)
   450                 years[year] = ty.nb + (years[year] if year in years else 0)
   451                 
   451 
   452         yearchange = []
   452         yearchange = []
   453         for year in sorted(years.keys()):
   453         for year in sorted(years.keys()):
   454             score = years[year]
   454             score = years[year]
   455             if year < 2011:
   455             if year < 2011:
   456                 if (year-1 not in years and score != 0) or (year-1 in years and years[year-1] != score):
   456                 if (year-1 not in years and score != 0) or (year-1 in years and years[year-1] != score):
   457                     yearchange.append({'year': year, 'score': score})
   457                     yearchange.append({'year': year, 'score': score})
   458                 if year+1 not in years and year != -1 and score != 0:
   458                 if year+1 not in years and year != -1 and score != 0:
   459                     yearchange.append({'year': year+1, 'score': 0})
   459                     yearchange.append({'year': year+1, 'score': 0})
   460     
   460 
   461         tag_translations = {}
   461         tag_translations = {}
   462         for t in itertools.chain(labeltranslations,disciplines,tags):
   462         for t in itertools.chain(labeltranslations,disciplines,tags):
   463             tag_translations[t['label']] = t['translated_label']
   463             tag_translations[t['label']] = t['translated_label']
   464         for c in contenus:
   464         for c in contenus:
   465             for t in c['tags']:
   465             for t in c['tags']:
   466                 tag_translations[t['label']] = t['translated_label']
   466                 tag_translations[t['label']] = t['translated_label']
   467         
   467 
   468         output = {'count': cont_count, 'contents': contenus, 'tags':tags, 'sparkline':yearchange, 'countries':countries, 'disciplines':disciplines, 'tagtranslations': tag_translations}
   468         output = {'count': cont_count, 'contents': contenus, 'tags':tags, 'sparkline':yearchange, 'countries':countries, 'disciplines':disciplines, 'tagtranslations': tag_translations}
   469         outputstr = json.dumps(output)
   469         outputstr = json.dumps(output)
   470         cache.set(cache_key, outputstr)
   470         cache.set(cache_key, outputstr)
   471     
   471 
   472     return outputstr
   472     return outputstr
   473     
   473 
   474 
   474 
   475 
   475 
   476 def subtree(tree):
   476 def subtree(tree):
   477     MAX_TAG_ORDER = 16
   477     MAX_TAG_ORDER = 16
   478     label = tree['label']
   478     label = tree['label']
   479     sub = tree.get('contents',[])
   479     sub = tree.get('contents',[])
   480     
   480 
   481     datasheets = Datasheet.objects.filter(validated = True, taggedsheet__tag__label__iexact = label, taggedsheet__order__lte = MAX_TAG_ORDER).annotate(tagorder=Min('taggedsheet__order')).select_related('organisation').distinct()
   481     datasheets = Datasheet.objects.filter(validated = True, taggedsheet__tag__label__iexact = label, taggedsheet__order__lte = MAX_TAG_ORDER).annotate(tagorder=Min('taggedsheet__order')).select_related('organisation').distinct()
   482     
   482 
   483     contents = [{ 'description': ds.description, 'title': ds.title, 'url': ds.url, 'score': int((MAX_TAG_ORDER - ds.tagorder)/2), 'id': ds.id, 'hda_id': ds.hda_id, 'organization': ds.organisation.name, 'organization_url': ds.organisation.website } for ds in datasheets]
   483     contents = [{ 'description': ds.description, 'title': ds.title, 'url': ds.url, 'score': int((MAX_TAG_ORDER - ds.tagorder)/2), 'id': ds.id, 'hda_id': ds.hda_id, 'organization': ds.organisation.name, 'organization_url': ds.organisation.website } for ds in datasheets]
   484     
   484 
   485     contents = sorted(contents, key=lambda e: -e['score'])
   485     contents = sorted(contents, key=lambda e: -e['score'])
   486     
   486 
   487     res = { 'label': label }
   487     res = { 'label': label }
   488     
   488 
   489     if len(contents):
   489     if len(contents):
   490         res['contents'] = contents
   490         res['contents'] = contents
   491     
   491 
   492     if len(sub):
   492     if len(sub):
   493         subcats = [subtree(st) for st in sub]
   493         subcats = [subtree(st) for st in sub]
   494         subcats = [sc for sc in subcats if len(sc.get('contents',[])) or len(sc.get('themes',[]))]
   494         subcats = [sc for sc in subcats if len(sc.get('contents',[])) or len(sc.get('themes',[]))]
   495         res['themes'] = subcats
   495         res['themes'] = subcats
   496     
   496 
   497     return res
   497     return res
   498 
   498 
   499 def filltree(request):
   499 def filltree(request):
   500     
   500 
   501     tree = request.GET.get('tree','{}')
   501     tree = request.GET.get('tree','{}')
   502     
   502 
   503     treeobj = json.loads(tree)
   503     treeobj = json.loads(tree)
   504     
   504 
   505     res = subtree(treeobj)
   505     res = subtree(treeobj)
   506         
   506 
   507     return HttpResponse(content=json.dumps(res), content_type='application/json')
   507     return HttpResponse(content=json.dumps(res), content_type='application/json')