From 57d17b4060ed85fe4e4d4876a3fd188d27f1e946 Mon Sep 17 00:00:00 2001 From: Brian Simpson Date: Tue, 8 Oct 2013 19:59:47 -0400 Subject: [PATCH] Higher precision version of format_timedelta. --- r2/r2/lib/pages/pages.py | 5 +++-- r2/r2/lib/utils/utils.py | 23 +++++++++++++++++++++++ 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/r2/r2/lib/pages/pages.py b/r2/r2/lib/pages/pages.py index 55b4045f7..6d75c5e93 100755 --- a/r2/r2/lib/pages/pages.py +++ b/r2/r2/lib/pages/pages.py @@ -74,9 +74,9 @@ from r2.lib.memoize import memoize from r2.lib.utils import trunc_string as _truncate, to_date from r2.lib.filters import safemarkdown from r2.lib.utils import Storage +from r2.lib.utils import precise_format_timedelta from babel.numbers import format_currency -from babel.dates import format_timedelta from collections import defaultdict import csv import cStringIO @@ -1745,7 +1745,8 @@ class ServerSecondsBar(Templated): self.message = '' else: delta = datetime.timedelta(seconds=seconds) - server_time = format_timedelta(delta, threshold=5, locale=c.locale) + server_time = precise_format_timedelta(delta, threshold=5, + locale=c.locale) if user == c.user: message = _("you have helped pay for %(time)s of reddit " diff --git a/r2/r2/lib/utils/utils.py b/r2/r2/lib/utils/utils.py index 6cff348b1..36be05f6c 100644 --- a/r2/r2/lib/utils/utils.py +++ b/r2/r2/lib/utils/utils.py @@ -26,6 +26,7 @@ import traceback import ConfigParser import codecs +from babel.dates import TIMEDELTA_UNITS from urllib import unquote_plus from urllib2 import urlopen, Request from urlparse import urlparse, urlunparse @@ -1492,3 +1493,25 @@ def canonicalize_email(email): localpart = localpart.partition("+")[0] return localpart + "@" + domain + + +def precise_format_timedelta(delta, locale, threshold=.85, decimals=2): + """Like babel.dates.format_datetime but with adjustable precision""" + seconds = delta.total_seconds() + + for unit, secs_per_unit in TIMEDELTA_UNITS: + value = abs(seconds) / secs_per_unit + if value >= threshold: + plural_form = locale.plural_form(value) + pattern = None + for choice in (unit + ':medium', unit): + patterns = locale._data['unit_patterns'].get(choice) + if patterns is not None: + pattern = patterns[plural_form] + break + if pattern is None: + return u'' + decimals = int(decimals) + format_string = "%." + str(decimals) + "f" + return pattern.replace('{0}', format_string % value) + return u''