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