summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNoahY <yuttadhammo@yahoo.com>2011-07-27 02:04:30 +0530
committerNoahY <yuttadhammo@yahoo.com>2011-07-27 02:04:30 +0530
commit183a2d20626dad6020a43a86e703a1e6557bf2d1 (patch)
tree829333ff6b85f8be293a68798e9566a16f72ac77
parent624be8cd1837bf944d92a724d68c891f0bb19155 (diff)
downloadaskbot-183a2d20626dad6020a43a86e703a1e6557bf2d1.tar.gz
askbot-183a2d20626dad6020a43a86e703a1e6557bf2d1.tar.bz2
askbot-183a2d20626dad6020a43a86e703a1e6557bf2d1.zip
added setting to switch between tag cloud and tag list
-rw-r--r--askbot/conf/forum_data_rules.py15
-rw-r--r--askbot/const/__init__.py5
-rw-r--r--askbot/models/tag.py7
-rw-r--r--askbot/skins/default/templates/main_page/sidebar.html25
-rw-r--r--askbot/skins/default/templates/tags.html36
-rw-r--r--askbot/views/readers.py109
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">&#215; ' ~
+ 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">&#215; ' ~
+ 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&amp;' % 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