web/hdalab/views/ajax.py
changeset 208 d4e3ea751966
parent 206 7070d3acc3d4
child 212 3e1193c6dce3
--- a/web/hdalab/views/ajax.py	Wed Jul 04 11:44:29 2012 +0200
+++ b/web/hdalab/views/ajax.py	Thu Jul 12 10:45:01 2012 +0200
@@ -84,9 +84,9 @@
 
 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)
+    catlabel = category.label
+    tags = Tag.objects.filter(wp_categories__wp_category = category).distinct()
     taglabels = [k for k in dict([(t.label,t.label) for t in tags])]
-    catlabel = category.label
     resobj = {
           'category': category.label,
           'tags': [],
@@ -101,58 +101,70 @@
             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)
+        subcats = WpCategory.objects.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('contents'):
+        category['contents'] = sorted(category['contents'], key=lambda content: -content['score'])
     if category.has_key('tags'):
-        category['tags'] = [tag for tag in category['tags'] if len(tag['contents'])]
+        category['tags'] = [cleantags(tag) for tag in category['tags'] if len(tag['contents'])]
         if len(category['tags']) == 0:
             del category['tags']
+        else:
+            category['tags'] = sorted(category['tags'], key=lambda tag: tag['label'])
     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
+        category['sub_categories'] = sorted(sub_cats, key=lambda cat: cat['category'])
         if len(category['sub_categories']) == 0:
             del category['sub_categories']
     return category
 
 def cattree(request):
     # Gets the category tree from a label
+    ROOT_MAX_TAG_ORDER = 5
     MAX_TAG_ORDER = 5
     MAX_LEVEL = 3
     label = request.GET.get('label', None)
+    lowerlabel = label.lower()
     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]
+#    tag_list = [k for k in globtags]
     
-    if len(tag_list):
-        contents = []
-        datasheets = Datasheet.objects.select_related('taggedsheet__tag').filter(validated = True, 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, 'url': datasheet.url})
-        cleantags(resobj)
+#    if len(tag_list):
+    contents = []
+#    datasheets = Datasheet.objects.filter(validated = True, taggedsheet__tag__label__in = tag_list, taggedsheet__order__lte = MAX_TAG_ORDER).distinct()
+    datasheets = Datasheet.objects.filter(validated = True, taggedsheet__tag__label__iexact = label, taggedsheet__order__lte = ROOT_MAX_TAG_ORDER).distinct()
+    for datasheet in datasheets:
+        # Calculating where we add the datasheet in the tree
+        maintag = None
+        maintagscore = -5
+        dsscore = 0
+        rootscore = 0
+        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
+                    dsscore = (MAX_TAG_ORDER - ts.order)
+                if label.lower() == lowerlabel:
+                    rootscore = (ROOT_MAX_TAG_ORDER - ts.order)
+        if maintag is not None:
+            globtags[maintag]['access']['contents'].append({'id': datasheet.id, 'title': datasheet.title, 'url': datasheet.url, 'score': (dsscore + rootscore)})
+    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]
     
@@ -230,15 +242,16 @@
     
     q = request.GET.get('term',None)
     
-    qs = WpCategory.objects.filter(tags__hidden = False).distinct().filter(Q(label__icontains = ' ' + q ) | Q(label__istartswith = q))
-
-#    qs = WpCategory.objects.filter(label__istartswith = q).order_by('label')[:40]
+    # On ne récupère que les catégories qui sont également des tags
+    
+    qs = Tag.objects.filter(Q(label__icontains = ' ' + q ) | Q(label__istartswith = q))
+    
+    labels = [tag.label for tag in qs]
+    
+    qs = WpCategory.objects.filter(label__in = labels)
     
     res = [{'value':t.label} for t in qs]
     
-#    qs = WpCategory.objects.filter(label__icontains = ' ' + q).order_by('label')[:30]        
-#    res += [{'value':t.label} for t in qs]
-    
     return HttpResponse(content=json.dumps(res), mimetype='application/json')
 
 def filter(request):