diff -r 9da0ed5afe8d -r f818b9430585 web/hdalab/views/ajax.py --- 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