diff options
-rw-r--r-- | askbot/conf/forum_data_rules.py | 15 | ||||
-rw-r--r-- | askbot/const/__init__.py | 5 | ||||
-rw-r--r-- | askbot/models/tag.py | 7 | ||||
-rw-r--r-- | askbot/skins/default/templates/main_page/sidebar.html | 25 | ||||
-rw-r--r-- | askbot/skins/default/templates/tags.html | 36 | ||||
-rw-r--r-- | askbot/views/readers.py | 109 |
6 files changed, 159 insertions, 38 deletions
diff --git a/askbot/conf/forum_data_rules.py b/askbot/conf/forum_data_rules.py index 570b8b9e..13358991 100644 --- a/askbot/conf/forum_data_rules.py +++ b/askbot/conf/forum_data_rules.py @@ -118,6 +118,21 @@ settings.register( settings.register( livesettings.BooleanValue( FORUM_DATA_RULES, + 'TAG_LIST_FORMAT', + default = 'list', + choices=const.TAG_LIST_FORMAT_CHOICES, + description = _('Format of tag list'), + help_text = _( + 'Select the format to show tags in, ' + 'either as a simple list, or as a ' + 'tag cloud' + ) + ) +) + +settings.register( + livesettings.BooleanValue( + FORUM_DATA_RULES, 'USE_WILDCARD_TAGS', default = False, description = _('Use wildcard tags'), diff --git a/askbot/const/__init__.py b/askbot/const/__init__.py index e631fc18..18b4f4a3 100644 --- a/askbot/const/__init__.py +++ b/askbot/const/__init__.py @@ -58,6 +58,11 @@ POST_SCOPE_LIST = ( ) DEFAULT_POST_SCOPE = 'all' +TAG_LIST_FORMAT_CHOICES = ( + ('list', _('list')), + ('cloud', _('cloud')), +) + PAGE_SIZE_CHOICES = (('10', '10',), ('30', '30',), ('50', '50',),) ANSWERS_PAGE_SIZE = 10 #todo: remove this duplication diff --git a/askbot/models/tag.py b/askbot/models/tag.py index 9822ea14..e114cef7 100644 --- a/askbot/models/tag.py +++ b/askbot/models/tag.py @@ -97,7 +97,7 @@ class TagQuerySet(models.query.QuerySet): search query is the most common - just return a list of top tags""" cheating = True - tags = Tag.objects.all().order_by('name') + tags = Tag.objects.all().order_by('-used_count') else: cheating = False #getting id's is necessary to avoid hitting a heavy query @@ -109,7 +109,7 @@ class TagQuerySet(models.query.QuerySet): ).annotate( local_used_count=models.Count('id') ).order_by( - 'name' + '-local_used_count' ) if ignored_tag_names: @@ -117,8 +117,7 @@ class TagQuerySet(models.query.QuerySet): tags = tags.exclude(deleted = True) - #tags = tags[:50]#magic number - + tags = tags[:50]#magic number if cheating: for tag in tags: tag.local_used_count = tag.used_count diff --git a/askbot/skins/default/templates/main_page/sidebar.html b/askbot/skins/default/templates/main_page/sidebar.html index 546979c1..3fedfc79 100644 --- a/askbot/skins/default/templates/main_page/sidebar.html +++ b/askbot/skins/default/templates/main_page/sidebar.html @@ -20,11 +20,26 @@ {% cache 0 "tags" tags search_tags scope sort query context.page context.page_size language_code %} <div class="boxC"> <h2>{% trans %}Related tags{% endtrans %}</h2> - {% for tag in tags %} - <span class="tag-size-{{ font_size[tag.name] }}"> - <a class="link-typeA" title="Number of entries: {{ tag.used_count }}" href="/questions/?tags={{ tag.name }}">{{ tag.name }}</a> - </span> - {% endfor %} + {% if tag_list_type == 'list' %} + <ul id="related-tags" class="tags"> + {% for tag in tags %} + <li> + {{ macros.tag_widget( + tag.name, + html_tag = 'div', + extra_content = '<span class="tag-number">× ' ~ + tag.local_used_count|intcomma ~ '</span>' + )}} + </li> + {% endfor %} + </ul> + {% else %} + {% for tag in tags %} + <span class="tag-size-{{ font_size[tag.name] }}"> + <a class="link-typeA" title="Number of entries: {{ tag.used_count }}" href="/questions/?tags={{ tag.name }}">{{ tag.name }}</a> + </span> + {% endfor %} + {% endif %} </div> {% endcache %} {% endif %} diff --git a/askbot/skins/default/templates/tags.html b/askbot/skins/default/templates/tags.html index 5ad74c65..78c9c3a4 100644 --- a/askbot/skins/default/templates/tags.html +++ b/askbot/skins/default/templates/tags.html @@ -21,21 +21,41 @@ ><span>{% trans %}by popularity{% endtrans %}</span></a> </div> </div> -<p> +<p> {% if stag %} {% trans %}All tags matching '<span class="darkred"><strong>{{ stag }}</strong></span>'{% endtrans %}: {% endif %} - {% if not tags %} + {% if not tags.object_list %} <span>{% trans %}Nothing found{% endtrans %}</span> {% endif %} </p> -{% if tags %} - {% for tag in tags %} - <span class="tag-size-{{ font_size[tag.name] }}"> - <a class="link-typeA" title="Number of entries: {{ tag.used_count }}" href="/questions/?tags={{ tag.name }}">{{ tag.name }}</a> - </span> - {% endfor %} +{% if tags.object_list %} + {% if tag_list_type == 'list' %} + <ul class='tags'> + {% for tag in tags.object_list %} + <li> + {{ macros.tag_widget( + tag = tag.name, + url_params = 'start_over=true', + html_tag = 'div', + extra_content = '<span class="tag-number">× ' ~ + tag.used_count|intcomma ~ '</span>' + ) + }} + </li> + {% endfor %} + </ul> + {% else %} + {% for tag in tags %} + <span class="tag-size-{{ font_size[tag.name] }}"> + <a class="link-typeA" title="Number of entries: {{ tag.used_count }}" href="/questions/?tags={{ tag.name }}">{{ tag.name }}</a> + </span> + {% endfor %} + {% endif %} {% endif %} +<div class="pager"> + {{macros.paginator(paginator_context)}} +</div> {% endblock %} {% block endjs %} <script type="text/javascript"> diff --git a/askbot/views/readers.py b/askbot/views/readers.py index 27d6d1f5..c1e72722 100644 --- a/askbot/views/readers.py +++ b/askbot/views/readers.py @@ -90,7 +90,13 @@ def questions(request): request_user = request.user, search_state = search_state, ) + + tag_list_type = askbot_settings.TAG_LIST_FORMAT + #force cloud to sort by name + if tag_list_type = 'cloud': + related_tags = sorted(related_tags, key=itemgetter('name')) + font_size = extra_tags.get_tag_font_size(related_tags) paginator = Paginator(qs, search_state.page_size) @@ -306,31 +312,92 @@ def questions(request): return response def tags(request):#view showing a listing of available tags - plain list - stag = "" - sortby = request.GET.get('sort', 'name') - if request.method == "GET": - stag = request.GET.get("query", "").strip() - if stag != '': - tags = models.Tag.objects.filter(deleted=False, name__icontains=stag).exclude(used_count=0) - else: - if sortby == "name": - tags = models.Tag.objects.all().filter(deleted=False).exclude(used_count=0).order_by("name") - else: - tags = models.Tag.objects.all().filter(deleted=False).exclude(used_count=0).order_by("-used_count") + tag_list_type = askbot_settings.TAG_LIST_FORMAT + + if tag_list_type = 'list': - font_size = extra_tags.get_tag_font_size(tags) + stag = "" + is_paginated = True + sortby = request.GET.get('sort', 'used') + try: + page = int(request.GET.get('page', '1')) + except ValueError: + page = 1 + + if request.method == "GET": + stag = request.GET.get("query", "").strip() + if stag != '': + objects_list = Paginator( + models.Tag.objects.filter( + deleted=False, + name__icontains=stag + ).exclude( + used_count=0 + ), + DEFAULT_PAGE_SIZE + ) + else: + if sortby == "name": + objects_list = Paginator(models.Tag.objects.all().filter(deleted=False).exclude(used_count=0).order_by("name"), DEFAULT_PAGE_SIZE) + else: + objects_list = Paginator(models.Tag.objects.all().filter(deleted=False).exclude(used_count=0).order_by("-used_count"), DEFAULT_PAGE_SIZE) - data = { - 'active_tab': 'tags', - 'page_class': 'tags-page', - 'tags' : tags, - 'font_size' : font_size, - 'stag' : stag, - 'tab_id' : sortby, - 'keywords' : stag, - } + try: + tags = objects_list.page(page) + except (EmptyPage, InvalidPage): + tags = objects_list.page(objects_list.num_pages) + + paginator_data = { + 'is_paginated' : is_paginated, + 'pages': objects_list.num_pages, + 'page': page, + 'has_previous': tags.has_previous(), + 'has_next': tags.has_next(), + 'previous': tags.previous_page_number(), + 'next': tags.next_page_number(), + 'base_url' : reverse('tags') + '?sort=%s&' % sortby + } + paginator_context = extra_tags.cnprog_paginator(paginator_data) + data = { + 'active_tab': 'tags', + 'page_class': 'tags-page', + 'tags' : tags, + 'tag_list_type' : tag_list_type, + 'stag' : stag, + 'tab_id' : sortby, + 'keywords' : stag, + 'paginator_context' : paginator_context + } + + else: + + stag = "" + sortby = request.GET.get('sort', 'name') + if request.method == "GET": + stag = request.GET.get("query", "").strip() + if stag != '': + tags = models.Tag.objects.filter(deleted=False, name__icontains=stag).exclude(used_count=0) + else: + if sortby == "name": + tags = models.Tag.objects.all().filter(deleted=False).exclude(used_count=0).order_by("name") + else: + tags = models.Tag.objects.all().filter(deleted=False).exclude(used_count=0).order_by("-used_count") + + font_size = extra_tags.get_tag_font_size(tags) + + data = { + 'active_tab': 'tags', + 'page_class': 'tags-page', + 'tags' : tags, + 'tag_list_type' : tag_list_type, + 'font_size' : font_size, + 'stag' : stag, + 'tab_id' : sortby, + 'keywords' : stag, + } + return render_into_skin('tags.html', data, request) @csrf.csrf_protect |