diff -r 00fc169cc6a9 -r 0a1744477bc1 web/hdalab/views/ajax.py --- a/web/hdalab/views/ajax.py Fri Jun 22 19:16:46 2012 +0200 +++ b/web/hdalab/views/ajax.py Mon Jul 02 19:19:02 2012 +0200 @@ -11,6 +11,7 @@ from hdabo.models import Tag, Datasheet, TaggedSheet from hdalab.models import HdaSession, Country, TagYears, DatasheetExtras from hdalab.models.dataviz import DbpediaFieldsTranslation, DbpediaFields +from hdalab.models.categories import WpCategory, WpCategoryInclusion, TagWpCategory from hdalab.utils import fix_cache_key import copy import django.utils.simplejson as json @@ -80,8 +81,82 @@ translations = dict([(t.master.label, t.label) for t in translationqs]) return HttpResponse(content=json.dumps(translations), mimetype='application/json') + +def subcat(category, globtags, level, max_level ): + # recursive function used by cattree + tags = Tag.objects.select_related('wp_categories__wp_category').filter(wp_categories__wp_category = category) + taglabels = [k for k in dict([(t.label,t.label) for t in tags])] + catlabel = category.label + resobj = { + 'category': category.label, + 'tags': [], + 'contents': [] + } + for label in taglabels: + if label == catlabel: + globtags[label] = {'level': level, 'access': resobj } + else: + tag_in_list = {'label' : label, 'contents': []} + resobj['tags'].append(tag_in_list) + globtags[label] = {'level': (level + 1), 'access': tag_in_list } + + if level < max_level: + subcats = WpCategory.objects.select_related('parent_categories__parent_category').filter(parent_categories__parent_category = category) + resobj['sub_categories'] = [subcat(subcats[i], globtags, level + 1, max_level ) for i in range(len(subcats))] + return resobj + +def cleantags(category): + if category.has_key('contents') and len(category['contents']) == 0: + del category['contents'] + if category.has_key('tags'): + category['tags'] = [tag for tag in category['tags'] if len(tag['contents'])] + if len(category['tags']) == 0: + del category['tags'] + if category.has_key('sub_categories'): + sub_cats = [] + for sub_cat in category['sub_categories']: + cat = cleantags(sub_cat) + if cat.has_key('tags') or cat.has_key('sub_categories') or cat.has_key('contents'): + sub_cats.append(cat) + category['sub_categories'] = sub_cats + if len(category['sub_categories']) == 0: + del category['sub_categories'] + return category + +def cattree(request): + # Gets the category tree from a label + MAX_TAG_ORDER = 5 + MAX_LEVEL = 3 + label = request.GET.get('label', None) + globtags = {} + resobj = None + master_category = WpCategory.objects.filter(label__iexact=label)[0:1] + if len(master_category): + resobj = subcat(master_category[0], globtags, 1, MAX_LEVEL ) - + tag_list = [k for k in globtags] + + if len(tag_list): + contents = [] + datasheets = Datasheet.objects.select_related('taggedsheet__tag').filter(taggedsheet__tag__label__in = tag_list, taggedsheet__order__lte = MAX_TAG_ORDER).distinct() + for datasheet in datasheets: + # Calculating where we add the datasheet in the tree + maintag = None + maintagscore = -5 + for ts in TaggedSheet.objects.select_related('tag','datasheet').filter(datasheet__id=datasheet.id,order__lte=MAX_TAG_ORDER): + label = ts.tag.label + if globtags.has_key(label): + score = 3 * globtags[label]['level'] - ts.order + if score > maintagscore: + maintagscore = score + maintag = label + if maintag is not None: + globtags[maintag]['access']['contents'].append({'id': datasheet.id, 'title': datasheet.title}) + cleantags(resobj) + +# resobj['contents'] = [{'id': d.id, 'title': d.title, 'tags': [t.label for t in d.tags.filter(taggedsheet__order__lte=5)]} for d in datasheets] + + return HttpResponse(content=json.dumps(resobj), mimetype='application/json') def sessioninfo(request):