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