From d0b4e20bf4d2cb45b65e8eee54abc1eedbaa57d9 Mon Sep 17 00:00:00 2001 From: Evgeny Fadeev Date: Thu, 23 Oct 2014 01:49:49 -0300 Subject: initial set of django template tags and filters --- askbot/models/question.py | 3 +- askbot/templatetags/askbot_django.py | 159 +++++++++++++++++++++++++++++++++++ 2 files changed, 161 insertions(+), 1 deletion(-) create mode 100644 askbot/templatetags/askbot_django.py diff --git a/askbot/models/question.py b/askbot/models/question.py index f851e33c..36f7bbd4 100644 --- a/askbot/models/question.py +++ b/askbot/models/question.py @@ -11,6 +11,7 @@ from django.core import cache # import cache, not from cache import cache, to b from django.core import exceptions as django_exceptions from django.core.urlresolvers import reverse from django.template.loader import get_template +from django.template import Context from django.utils.hashcompat import md5_constructor from django.utils.translation import ugettext as _ from django.utils.translation import ungettext @@ -1776,7 +1777,7 @@ class Thread(models.Model): from askbot.views.context import get_extra as get_extra_context context.update(get_extra_context('ASKBOT_QUESTION_SUMMARY_EXTRA_CONTEXT', None, context)) activate_language(self.language_code) - html = get_template('widgets/question_summary.html').render(context) + html = get_template('widgets/question_summary.html').render(Context(context)) # INFO: Timeout is set to 30 days: # * timeout=0/None is not a reliable cross-backend way to set infinite timeout # * We probably don't need to pollute the cache with threads older than 30 days diff --git a/askbot/templatetags/askbot_django.py b/askbot/templatetags/askbot_django.py new file mode 100644 index 00000000..5a90af16 --- /dev/null +++ b/askbot/templatetags/askbot_django.py @@ -0,0 +1,159 @@ +from django import template +from django.core.urlresolvers import reverse +from django.contrib.humanize.templatetags.humanize import intcomma +from askbot.conf import settings as askbot_settings +from askbot.utils.pluralization import py_pluralize as _py_pluralize +from askbot.utils import functions +from askbot.search.state_manager import SearchState +from askbot.utils.slug import slugify + +register = template.Library() + +@register.filter +def as_js_bool(some_object): + if bool(some_object): + return 'true' + return 'false' + +@register.filter +def set_sort_method(search_state, sort_method): + """sets sort method on search state""" + return search_state.change_sort(sort_method).full_url() + +@register.filter +def remove_author(search_state): + return search_state.remove_author() + +@register.filter +def remove_tags(search_state): + return search_state.remove_tags() + +@register.filter +def change_page(search_state, page): + return search_state.change_page(page) + +@register.filter +def get_url(search_state): + return search_state.full_url() + +@register.filter +def get_answer_count(thread, visitor): + return thread.get_answer_count(visitor) + +@register.filter +def get_latest_revision(thread, visitor): + return thread.get_latest_revision(visitor) + +setup_paginator = register.filter(functions.setup_paginator) + +@register.filter +def reverse(iterable): + return reversed(iterable) + +@register.filter +def tag_used_count(count): + return '× %s' % intcomma(count) + +@register.filter +def get_avatar_url(user): + return user.get_avatar_url() + +@register.filter +def question_absolute_url(question, thread): + return question.get_absolute_url(thread=thread) + +@register.filter +def show_block_to(block_name, user): + block = getattr(askbot_settings, block_name) + if block: + flag_name = block_name + '_ANON_ONLY' + require_anon = getattr(askbot_settings, flag_name, False) + return (require_anon is False) or user.is_anonymous() + return False + +@register.filter +def py_pluralize(source, count): + plural_forms = source.strip().split('\n') + return _py_pluralize(plural_forms, count) + +class ThreadSummaryNode(template.Node): + def __init__(self, thread_token, search_state_token, visitor_token): + self.thread = template.Variable(thread_token) + self.search_state = template.Variable(search_state_token) + self.visitor = template.Variable(visitor_token) + + def render(self, context): + thread = self.thread.resolve(context) + search_state = self.search_state.resolve(context) + visitor = self.visitor.resolve(context) + return thread.get_summary_html(search_state, visitor) + +@register.tag +def thread_summary_html(thread, tokens): + tag_name, thread_token, search_state_token, visitor_token = tokens.split_contents() + return ThreadSummaryNode(thread_token, search_state_token, visitor_token) + +@register.inclusion_tag('widgets/avatar.html') +def avatar(user, size): + return {'user': user, 'size': size} + +@register.inclusion_tag('widgets/tag_list.html') +def tag_list_widget(tags, **kwargs): + kwargs['tags'] = tags + return kwargs + +@register.inclusion_tag('widgets/tag.html') +def tag_widget(tag, **kwargs): + kwargs['tag'] = tag + if kwargs.get('search_state') is None: + kwargs['search_state'] = SearchState.get_empty() + return kwargs + +@register.inclusion_tag('widgets/radio_select.html') +def radio_select(name=None, value=None, choices=None): + choices_data = list() + for choice in choices: + choice_datum = { + 'id': 'id_%s_%s' % (name, choice[0]), + 'value': choice[0], + 'label': choice[1] + } + choices_data.append(choice_datum) + return { + 'name': name, + 'value': value, + 'choices': choices_data + } + +@register.inclusion_tag('widgets/tag_cloud.html') +def tag_cloud(tags=None, font_sizes=None, search_state=None): + tags_data = list() + for tag in tags: + tag_datum = { + 'name': tag.name, + 'font_size': font_sizes[tag.name] + } + tags_data.append(tag_datum) + return { + 'tags': tags_data, + 'search_state': search_state + } + +@register.inclusion_tag('widgets/user_country_flag.html') +def user_country_flag(user): + context = { + 'user': user, + } + if user.country and user.show_counry: + context['flag_url'] = '/images/flags/' + user.country.code.lower() + '.gif' + return context + +@register.inclusion_tag('widgets/user_primary_group.html') +def user_primary_group(user): + group = user.get_primary_group() + group_name = group.name.replace('-', ' ') + group_url = reverse('users_by_group', args=(group.id, slugify(group_name))) + return { + 'group_name': group_name, + 'group_url': group_url + } -- cgit v1.2.3-1-g7c22