From ea248f0107eb3bed5a4a0fb65d6065e5691bea0a Mon Sep 17 00:00:00 2001 From: Jannis Leidel Date: Fri, 22 Apr 2011 12:02:47 +0000 Subject: Fixed #12771 -- Added naturaltime filter to humanize contrib app. Thanks, phinpho, djansoft and xtrqt. git-svn-id: http://code.djangoproject.com/svn/django/trunk@16071 bcc190cf-cafb-0310-a4f2-bffc1f526a37 --- django/contrib/humanize/templatetags/humanize.py | 36 ++++++++++++++++++++++-- 1 file changed, 34 insertions(+), 2 deletions(-) (limited to 'django') diff --git a/django/contrib/humanize/templatetags/humanize.py b/django/contrib/humanize/templatetags/humanize.py index cfa93fe534..0c6d389e34 100644 --- a/django/contrib/humanize/templatetags/humanize.py +++ b/django/contrib/humanize/templatetags/humanize.py @@ -2,7 +2,7 @@ from django.utils.translation import ungettext, ugettext as _ from django.utils.encoding import force_unicode from django import template from django.template import defaultfilters -from datetime import date +from datetime import date, datetime import re register = template.Library() @@ -83,7 +83,7 @@ def naturalday(value, arg=None): present day returns representing string. Otherwise, returns a string formatted according to settings.DATE_FORMAT. """ - try: + try: value = date(value.year, value.month, value.day) except AttributeError: # Passed value wasn't a date object @@ -100,3 +100,35 @@ def naturalday(value, arg=None): return _(u'yesterday') return defaultfilters.date(value, arg) register.filter(naturalday) + +def naturaltime(value, arg=None): + """ + For date and time values shows how many seconds, minutes or hours ago compared to + current timestamp returns representing string. Otherwise, returns a string + formatted according to settings.DATE_FORMAT + """ + try: + value = datetime(value.year, value.month, value.day, value.hour, value.minute, value.second) + except AttributeError: + return value + except ValueError: + return value + + delta = datetime.now() - value + if delta.days != 0: + value = date(value.year, value.month, value.day) + return naturalday(value, arg) + elif delta.seconds == 0: + return _(u'now') + elif delta.seconds < 60: + return _(u'%s seconds ago' % (delta.seconds)) + elif delta.seconds / 60 < 2: + return _(r'a minute ago') + elif delta.seconds / 60 < 60: + return _(u'%s minutes ago' % (delta.seconds/60)) + elif delta.seconds / 60 / 60 < 2: + return _(u'an hour ago') + elif delta.seconds / 60 / 60 < 24: + return _(u'%s hours ago' % (delta.seconds/60/60)) + return naturalday(value, arg) +register.filter(naturaltime) -- cgit v1.3