diff -r 44ddbffbfea5 -r d4e3ea751966 web/hdalab/views/ajax.py --- 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):