diff -r b758351d191f -r cc9b7e14412b web/lib/django/utils/formats.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/lib/django/utils/formats.py Tue May 25 02:43:45 2010 +0200 @@ -0,0 +1,130 @@ +import decimal +import datetime + +from django.conf import settings +from django.utils.translation import get_language, to_locale, check_for_language +from django.utils.importlib import import_module +from django.utils.encoding import smart_str +from django.utils import dateformat, numberformat, datetime_safe + +def get_format_modules(reverse=False): + """ + Returns an iterator over the format modules found in the project and Django + """ + modules = [] + if not check_for_language(get_language()) or not settings.USE_L10N: + return modules + locale = to_locale(get_language()) + if settings.FORMAT_MODULE_PATH: + format_locations = [settings.FORMAT_MODULE_PATH + '.%s'] + else: + format_locations = [] + format_locations.append('django.conf.locale.%s') + for location in format_locations: + for l in (locale, locale.split('_')[0]): + try: + mod = import_module('.formats', location % l) + except ImportError: + pass + else: + # Don't return duplicates + if mod not in modules: + modules.append(mod) + if reverse: + modules.reverse() + return modules + +def get_format(format_type): + """ + For a specific format type, returns the format for the current + language (locale), defaults to the format in the settings. + format_type is the name of the format, e.g. 'DATE_FORMAT' + """ + format_type = smart_str(format_type) + if settings.USE_L10N: + for module in get_format_modules(): + try: + return getattr(module, format_type) + except AttributeError: + pass + return getattr(settings, format_type) + +def date_format(value, format=None): + """ + Formats a datetime.date or datetime.datetime object using a + localizable format + """ + return dateformat.format(value, get_format(format or 'DATE_FORMAT')) + +def time_format(value, format=None): + """ + Formats a datetime.time object using a localizable format + """ + return dateformat.time_format(value, get_format(format or 'TIME_FORMAT')) + +def number_format(value, decimal_pos=None): + """ + Formats a numeric value using localization settings + """ + return numberformat.format( + value, + get_format('DECIMAL_SEPARATOR'), + decimal_pos, + get_format('NUMBER_GROUPING'), + get_format('THOUSAND_SEPARATOR'), + ) + +def localize(value): + """ + Checks if value is a localizable type (date, number...) and returns it + formatted as a string using current locale format + """ + if settings.USE_L10N: + if isinstance(value, (decimal.Decimal, float, int)): + return number_format(value) + elif isinstance(value, datetime.datetime): + return date_format(value, 'DATETIME_FORMAT') + elif isinstance(value, datetime.date): + return date_format(value) + elif isinstance(value, datetime.time): + return time_format(value, 'TIME_FORMAT') + return value + +def localize_input(value, default=None): + """ + Checks if an input value is a localizable type and returns it + formatted with the appropriate formatting string of the current locale. + """ + if isinstance(value, (decimal.Decimal, float, int)): + return number_format(value) + if isinstance(value, datetime.datetime): + value = datetime_safe.new_datetime(value) + format = smart_str(default or get_format('DATETIME_INPUT_FORMATS')[0]) + return value.strftime(format) + elif isinstance(value, datetime.date): + value = datetime_safe.new_date(value) + format = smart_str(default or get_format('DATE_INPUT_FORMATS')[0]) + return value.strftime(format) + elif isinstance(value, datetime.time): + format = smart_str(default or get_format('TIME_INPUT_FORMATS')[0]) + return value.strftime(format) + return value + +def sanitize_separators(value): + """ + Sanitizes a value according to the current decimal and + thousand separator setting. Used with form field input. + """ + if settings.USE_L10N: + decimal_separator = get_format('DECIMAL_SEPARATOR') + if isinstance(value, basestring): + parts = [] + if decimal_separator in value: + value, decimals = value.split(decimal_separator, 1) + parts.append(decimals) + if settings.USE_THOUSAND_SEPARATOR: + parts.append(value.replace(get_format('THOUSAND_SEPARATOR'), '')) + else: + parts.append(value) + value = '.'.join(reversed(parts)) + return value