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 |
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) |
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 |