def tag_cloud(request, THRESHOLD=1): context = {} qs = ( Event.tags.through.objects .values('tag_id') .annotate(Count('tag__id')) ) if request.user.is_active: if is_contributor(request.user): # because of a bug in Django we can't use qs.exclude() qs = qs.filter( Q(event__privacy=Event.PRIVACY_CONTRIBUTORS) | Q(event__privacy=Event.PRIVACY_PUBLIC) ) else: qs = qs.filter(event__privacy=Event.PRIVACY_PUBLIC) tags_map = dict( (x['id'], x['name']) for x in Tag.objects.all() .values('id', 'name') ) tags = [] for each in qs.values('tag__id__count', 'tag_id'): count = each['tag__id__count'] if count > THRESHOLD: tags.append(_Tag(tags_map[each['tag_id']], count)) context['tags'] = cloud.calculate_cloud( tags, steps=10 ) return render(request, 'main/tag_cloud.html', context)
def tag_cloud(request, THRESHOLD=1): context = {} qs = (Event.tags.through.objects.values('tag_id').annotate( Count('tag__id'))) if request.user.is_active: if is_contributor(request.user): # because of a bug in Django we can't use qs.exclude() qs = qs.filter( Q(event__privacy=Event.PRIVACY_CONTRIBUTORS) | Q(event__privacy=Event.PRIVACY_PUBLIC)) else: qs = qs.filter(event__privacy=Event.PRIVACY_PUBLIC) tags_map = dict( (x['id'], x['name']) for x in Tag.objects.all().values('id', 'name')) tags = [] for each in qs.values('tag__id__count', 'tag_id'): count = each['tag__id__count'] if count > THRESHOLD: tags.append(_Tag(tags_map[each['tag_id']], count)) context['tags'] = cloud.calculate_cloud(tags, steps=10) return render(request, 'main/tag_cloud.html', context)
def test_calculate_cloud(self): tags = [_Tag('one', 3), _Tag('two', 15), _Tag('three', 6)] tags_sorted = cloud.calculate_cloud(tags) eq_([x.font_size for x in tags_sorted], [2, 4, 3])