# -*- coding: utf-8 -*- from django.utils import timezone from django.utils.translation import ngettext def duration_string(duration, precision='s'): """Format hours, minutes and seconds as a human-friendly string (e.g. "2 hours, 25 minutes, 31 seconds") with precision to h = hours, m = minutes or s = seconds. """ h, m, s = duration_parts(duration) duration = '' if h > 0: duration = ngettext('%(hours)s hour', '%(hours)s hours', h) % { 'hours': h } if m > 0 and precision != 'h': if duration != '': duration += ', ' duration += ngettext( '%(minutes)s minute', '%(minutes)s minutes', m ) % {'minutes': m} if s > 0 and precision != 'h' and precision != 'm': if duration != '': duration += ', ' duration += ngettext( '%(seconds)s second', '%(seconds)s seconds', s ) % {'seconds': s} return duration def duration_parts(duration): """Get hours, minutes and seconds from a timedelta. """ if not isinstance(duration, timezone.timedelta): raise TypeError('Duration provided must be a timedetla') h, remainder = divmod(duration.seconds, 3600) h += duration.days * 24 m, s = divmod(remainder, 60) return h, m, s