﻿id	summary	reporter	owner	description	type	status	component	version	severity	resolution	keywords	cc	stage	has_patch	needs_docs	needs_tests	needs_better_patch	easy	ui_ux
18202	inconsistent humanize naturaltime	oradoe	nobody	"Currently, if delta is less than a day, we have 1 level of difference:
4 minutes ago. (not 4 minutes, some seconds ago)
2 hours ago. (not 2 hours, some minutes ago)

Else, we have 2 levels of difference:
2 days, 14 hours ago. (not 2 days ago)
3 weeks, 3 days ago. (not 3 weeks ago)

Expected (now): consistent of only 1 level of difference.
Expected(near future): parameter for level of difference.

my workaround:


__author__ = 'truongsinh'
import re
from datetime import date, datetime, timedelta

from django import template
from django.conf import settings
from django.template import defaultfilters
from django.utils.encoding import force_unicode
from django.utils.formats import number_format
from django.utils.translation import pgettext, ungettext, ugettext as _
from django.utils.timezone import is_aware, utc

register = template.Library()

@register.filter
def naturaltime(value):
	""""""
		For date and time values shows how many seconds, minutes or hours ago
		compared to current timestamp returns representing string.
		""""""
	if not isinstance(value, date): # datetime is a subclass of date
		return value

	now = datetime.now(utc if is_aware(value) else None)
	if value < now:
		delta = now - value
		if delta.days:
			return pgettext(
				'naturaltime', '{delta:s} ago'
			).format(delta = '''defaultfilters.timesince(value).split(',')[0])'''
		elif not delta.seconds:
			return _(u'now')
		elif delta.seconds < 60:
			return ungettext(
				u'a second ago', u'%(count)s seconds ago', delta.seconds
			) % {'count': delta.seconds}
		elif delta.seconds // 60 < 60:
			count = delta.seconds // 60
			return ungettext(
				u'a minute ago', u'%(count)s minutes ago', count
			) % {'count': count}
		else:
			count = delta.seconds // 60 // 60
			return ungettext(
				u'an hour ago', u'%(count)s hours ago', count
			) % {'count': count}
	else:
		delta = value - now
		if delta.days:
			return pgettext(
				'naturaltime', '%(delta)s from now'
			) % {'delta': '''defaultfilters.timeuntil(value).split(',')[0]'''}
		elif not delta.seconds:
			return _(u'now')
		elif delta.seconds < 60:
			return ungettext(
				u'a second from now', u'%(count)s seconds from now', delta.seconds
			) % {'count': delta.seconds}
		elif delta.seconds // 60 < 60:
			count = delta.seconds // 60
			return ungettext(
				u'a minute from now', u'%(count)s minutes from now', count
			) % {'count': count}
		else:
			count = delta.seconds // 60 // 60
			return ungettext(
				u'an hour from now', u'%(count)s hours from now', count
			) % {'count': count}
"	Bug	closed	contrib.humanize	1.4	Normal	wontfix	naturaltime, humanize		Design decision needed	1	0	0	0	1	0
