import math
from django import template
from django.template import RequestContext
from django.template.loader import get_template
from django.utils.safestring import mark_safe
from django.utils.translation import ugettext as _
from django.core.urlresolvers import reverse
from askbot.utils import functions
from askbot.utils.slug import slugify
from askbot.conf import settings as askbot_settings
register = template.Library()
GRAVATAR_TEMPLATE = (
'')
@register.simple_tag
def gravatar(user, size):
"""
Creates an ```` for a user's Gravatar with a given size.
This tag can accept a User object, or a dict containing the
appropriate values.
"""
#todo: rewrite using get_from_dict_or_object
user_id = functions.get_from_dict_or_object(user, 'id')
slug = slugify(user.username)
user_profile_url = reverse(
'user_profile',
kwargs={'id':user_id, 'slug':slug}
)
#safe_username = template.defaultfilters.urlencode(username)
return mark_safe(GRAVATAR_TEMPLATE % {
'user_profile_url': user_profile_url,
'size': size,
'gravatar_hash': functions.get_from_dict_or_object(user, 'gravatar'),
'gravatar_type': askbot_settings.GRAVATAR_TYPE,
'alt_text': _('%(username)s gravatar image') % {'username': user.username},
'username': functions.get_from_dict_or_object(user, 'username'),
})
@register.simple_tag
def get_tag_font_size(tags):
max_tag = 0
for tag in tags:
if tag.used_count > max_tag:
max_tag = tag.used_count
min_tag = max_tag
for tag in tags:
if tag.used_count < min_tag:
min_tag = tag.used_count
font_size = {}
for tag in tags:
font_size[tag.name] = tag_font_size(max_tag,min_tag,tag.used_count)
return font_size
@register.simple_tag
def tag_font_size(max_size, min_size, current_size):
"""
do a logarithmic mapping calcuation for a proper size for tagging cloud
Algorithm from http://blogs.dekoh.com/dev/2007/10/29/choosing-a-good-
font-size-variation-algorithm-for-your-tag-cloud/
"""
MAX_FONTSIZE = 10
MIN_FONTSIZE = 1
#avoid invalid calculation
if current_size == 0:
current_size = 1
try:
weight = (math.log10(current_size) - math.log10(min_size)) / (math.log10(max_size) - math.log10(min_size))
except Exception:
weight = 0
return int(MIN_FONTSIZE + round((MAX_FONTSIZE - MIN_FONTSIZE) * weight))
class IncludeJinja(template.Node):
"""http://www.mellowmorning.com/2010/08/24/"""
def __init__(self, filename, request_var):
self.filename = filename
self.request_var = template.Variable(request_var)
def render(self, context):
request = self.request_var.resolve(context)
jinja_template = get_template(self.filename)
return jinja_template.render(RequestContext(request, context))
@register.tag
def include_jinja(parser, token):
bits = token.contents.split()
#Check if a filename was given
if len(bits) != 3:
error_message = '%r tag requires the name of the ' + \
'template and the request variable'
raise template.TemplateSyntaxError(error_message % bits[0])
filename = bits[1]
request_var = bits[2]
#Remove quotes or raise error
if filename[0] in ('"', "'") and filename[-1] == filename[0]:
filename = filename[1:-1]
else:
raise template.TemplateSyntaxError('file name must be quoted')
return IncludeJinja(filename, request_var)