Source code for lighty.templates.templatefilters

'''Package contains default template tags
'''
from decimal import Decimal, ROUND_DOWN, ROUND_HALF_UP
from functools import reduce
from operator import itemgetter
import random as random_module

from .filter import filter_manager

# Numbers


[docs]def sum(*args): '''Calculate the sum of all the values passed as args and ''' return reduce(lambda x, y: x + float(y), args)
filter_manager.register(sum) def float_format_args_parse(func, raw_value, format): # Parse arguments try: digits = abs(int(format)) except: raise Exception('%s arguments error: format is not integer' % func) try: value = Decimal(raw_value) except: raise Exception('%s supports only number values' % func) return value, digits def do_float_format(value, digits, rounding): # Make formater digit = 0 formatter = Decimal('1') while digit < digits: digit += 1 formatter *= Decimal('0.1') return value.quantize(formatter, rounding=rounding)
[docs]def floatformat(raw_value, format='0'): '''Make pretty float representation Lets: a = '12.4' Then: >>> print floatformat(a) 12 >>> print floatformat(a, '2') 12.40 >>> print floatformat(a, '-2') 12.4 ''' value, digits = float_format_args_parse('floatformat', raw_value, format) result = do_float_format(value.copy_abs(), digits, ROUND_DOWN) result = str(result.copy_sign(value)) if format[0] == '-': return result.rstrip('0') return result
filter_manager.register(floatformat)
[docs]def floatround(raw_value, format="0"): '''Round a float value according to math rules Lets: a = '12.45' Then: >>> print floatround(a) 12 >>> print floatround(a, '1') 12.5 ''' value, digits = float_format_args_parse('floatround', raw_value, format) return do_float_format(value, digits, ROUND_HALF_UP)
filter_manager.register(floatround) # Strings
[docs]def addslashes(value): '''Add a slashes to string ''' return value.replace('\\', '\\\\').replace('"', '\\"').replace("'", "\\'")
filter_manager.register(addslashes)
[docs]def capfirst(value): '''Capitalizes the first character in string ''' return value and value[0].upper() + value[1:]
filter_manager.register(capfirst)
[docs]def stringformat(value, format): """Formats the variable according to the format, a string formatting specifier. This specifier uses Python string formating syntax, with the exception that the leading "%" is dropped. See http://docs.python.org/lib/typesseq-strings.html for documentation of Python string formatting """ return ("%" + str(format)) % value
filter_manager.register(stringformat)
[docs]def upper(value): '''Convert to upper case ''' return str(value).upper()
[docs]def lower(value): '''Convert to lower case ''' return str(value).lower() # Lists, dicts, strings
[docs]def dictsort(value, key, order=''): '''Sort dict ''' return sorted(value, key=itemgetter(key), reverse=(order != ''))
filter_manager.register(dictsort)
[docs]def get(value, index): '''Get item with specified index ''' if issubclass(value.__class__, dict): return value[sorted(value.keys())[index]] return value[index]
filter_manager.register(get)
[docs]def first(value): '''Get first item from list ''' return get(value, 0)
filter_manager.register(first)
[docs]def join(value, joiner): '''Join list or items with joiner >>> join([1, 2, 3], ' ') '1 2 3' ''' return joiner.join([str(item) for item in value])
filter_manager.register(join)
[docs]def last(value): '''Get last item from list ''' return get(value, len(value) - 1)
filter_manager.register(last)
[docs]def length(value): '''Return's the length of the string, dict or list ''' return len(value)
[docs]def random(value): '''Get random item from list or dict ''' return get(value, random_module.random(len(value)))
filter_manager.register(random)
[docs]def sort(value, order=''): '''Sort list ''' return sorted(value, reverse=(order != ''))
filter_manager.register(sort) # Date and time
[docs]def date(value, format): '''Convert date into python format ''' return value.strftime(format)
filter_manager.register(date)