# This is a rewrite of django-sorting but with added support for i18n title
# strings.
# See https://github.com/directeur/django-sorting

from django import template
from django.conf import settings

register = template.Library()

DEFAULT_SORT_UP = getattr(settings, 'DEFAULT_SORT_UP', '&uarr;')
DEFAULT_SORT_DOWN = getattr(settings, 'DEFAULT_SORT_DOWN', '&darr;')

sort_directions = {
    'asc': {'icon': DEFAULT_SORT_UP, 'inverse': 'desc'},
    'desc': {'icon': DEFAULT_SORT_DOWN, 'inverse': 'asc'},
    '': {'icon': DEFAULT_SORT_DOWN, 'inverse': 'asc'},
}


def anchor(parser, token):
    bits = token.split_contents()
    if len(bits) < 2:
        raise template.TemplateSyntaxError(
            "anchor tag takes at least 1 argument")
    try:
        title = bits[2]
    except IndexError:
        title = bits[1].capitalize()
    return SortAnchorNode(bits[1].strip(), title.strip())


class SortAnchorNode(template.Node):
    def __init__(self, field, title):
        self.field = template.Variable(field)
        self.title = template.Variable(title)

    def render(self, context):
        field = self.field.resolve(context)
        title = self.title.resolve(context)

        request = context['request']
        get_vars = request.GET.copy()
        sort_field = get_vars.pop('sort', [None])[0]

        icon = ''
        if sort_field == field:
            # We are already sorting on this field, so we set the inverse
            # direction within the GET params that get used within the href.
            direction = get_vars.pop('dir', [''])[0]
            get_vars['dir'] = sort_directions[direction]['inverse']
            icon = sort_directions[direction]['icon']

        href = u'%s?sort=%s' % (request.path, field)
        if len(get_vars) > 0:
            href += "&%s" % get_vars.urlencode()
        if icon:
            title = u"%s %s" % (title, icon)
        return u'<a href="%s">%s</a>' % (href, title)


anchor = register.tag(anchor)

# This is a rewrite of django-sorting but with added support for i18n title
# strings.
# See https://github.com/directeur/django-sorting

from django import template
from django.conf import settings

register = template.Library()

DEFAULT_SORT_UP = getattr(
    settings, 'DEFAULT_SORT_UP',
    '<i class="icon-chevron-up"></i>')
DEFAULT_SORT_DOWN = getattr(
    settings, 'DEFAULT_SORT_DOWN',
    '<i class="icon-chevron-down"></i>')

sort_directions = {
    'asc': {'icon': DEFAULT_SORT_UP, 'inverse': 'desc'},
    'desc': {'icon': DEFAULT_SORT_DOWN, 'inverse': 'asc'},
    '': {'icon': DEFAULT_SORT_DOWN, 'inverse': 'asc'},
}


def anchor(parser, token):
    bits = token.split_contents()
    if len(bits) < 2:
        raise template.TemplateSyntaxError(
            "anchor tag takes at least 1 argument")
    try:
        title = bits[2]
    except IndexError:
        title = bits[1].capitalize()
    return SortAnchorNode(bits[1].strip(), title.strip())


class SortAnchorNode(template.Node):
    def __init__(self, field, title):
        self.field = template.Variable(field)
        self.title = template.Variable(title)

    def render(self, context):
        field = self.field.resolve(context)
        title = self.title.resolve(context)

        request = context['request']
        get_vars = request.GET.copy()
        sort_field = get_vars.pop('sort', [None])[0]

        icon = ''
        if sort_field == field:
            # We are already sorting on this field, so we set the inverse
            # direction within the GET params that get used within the href.
            direction = get_vars.pop('dir', [''])[0]
            get_vars['dir'] = sort_directions[direction]['inverse']
            icon = sort_directions[direction]['icon']

        href = u'%s?sort=%s' % (request.path, field)
        if len(get_vars) > 0:
            href += "&%s" % get_vars.urlencode()
        if icon:
            title = u"%s %s" % (title, icon)
        return u'<a href="%s">%s</a>' % (href, title)


anchor = register.tag(anchor)

Use chevrons instead of arrows in sortable links