Development of an internal social media platform with personalised dashboards for students
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

humanize.py 2.3KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. from __future__ import absolute_import, unicode_literals
  2. from datetime import datetime
  3. from django.utils.translation import ungettext, ugettext as _
  4. from .utils import now
  5. def pluralize_year(n):
  6. return ungettext(_('{num} year ago'), _('{num} years ago'), n)
  7. def pluralize_month(n):
  8. return ungettext(_('{num} month ago'), _('{num} months ago'), n)
  9. def pluralize_week(n):
  10. return ungettext(_('{num} week ago'), _('{num} weeks ago'), n)
  11. def pluralize_day(n):
  12. return ungettext(_('{num} day ago'), _('{num} days ago'), n)
  13. OLDER_CHUNKS = (
  14. (365.0, pluralize_year),
  15. (30.0, pluralize_month),
  16. (7.0, pluralize_week),
  17. (1.0, pluralize_day),
  18. )
  19. def _un(singular__plural, n=None):
  20. singular, plural = singular__plural
  21. return ungettext(singular, plural, n)
  22. def naturaldate(date, include_seconds=False):
  23. """Convert datetime into a human natural date string."""
  24. if not date:
  25. return ''
  26. right_now = now()
  27. today = datetime(right_now.year, right_now.month,
  28. right_now.day, tzinfo=right_now.tzinfo)
  29. delta = right_now - date
  30. delta_midnight = today - date
  31. days = delta.days
  32. hours = delta.seconds // 3600
  33. minutes = delta.seconds // 60
  34. seconds = delta.seconds
  35. if days < 0:
  36. return _('just now')
  37. if days == 0:
  38. if hours == 0:
  39. if minutes > 0:
  40. return ungettext(
  41. _('{minutes} minute ago'),
  42. _('{minutes} minutes ago'), minutes
  43. ).format(minutes=minutes)
  44. else:
  45. if include_seconds and seconds:
  46. return ungettext(
  47. _('{seconds} second ago'),
  48. _('{seconds} seconds ago'), seconds
  49. ).format(seconds=seconds)
  50. return _('just now')
  51. else:
  52. return ungettext(
  53. _('{hours} hour ago'), _('{hours} hours ago'), hours
  54. ).format(hours=hours)
  55. if delta_midnight.days == 0:
  56. return _('yesterday at {time}').format(time=date.strftime('%H:%M'))
  57. count = 0
  58. for chunk, pluralizefun in OLDER_CHUNKS:
  59. if days >= chunk:
  60. count = int(round((delta_midnight.days + 1) / chunk, 0))
  61. fmt = pluralizefun(count)
  62. return fmt.format(num=count)