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