web/hdalab/views/ajax.py
changeset 204 0a1744477bc1
parent 175 ebc92daef815
child 205 8ff4fd1a6e9c
--- 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):