# Import template library from django import template # Set register register = template.Library() # Register filter @register.filter def sectodur(value, arg = 'normal'): """ ####################################################### # # # Seconds-to-Duration Extended Template Tag # # Dan Ward 2009 (http://d-w.me) # # # # modified: # # Gregor Volkmann 2014 (http://gregor.volkmann.me) # # # ####################################################### Usage: {{ VALUE|sectodur[:'short' | :'normal' | :'long'] }} Default: :'normal' NOTE: Please read up 'Custom template tags and filters' if you are unsure as to how the template tag is implemented in your project. """ # Place seconds in to integer secs = int(value) # If short string is enabled if arg == 'short': # Set short names dayUnitName = ':' hourUnitName = ':' minUnitName = ':' secUnitName = '' # Set short duration unit splitters splitterSplitter = '' lastDurSplitter = '' nextDurSplitter = lastDurSplitter dayPluralizeString = '' hourPluralizeString = '' minPluralizeString = '' secPluralizeString = '' padZero = '0' noDurMessage = '0' # If short string is enabled if arg == 'normal': # Set short names dayUnitName = ' Tag' hourUnitName = ' Std' minUnitName = ' Min' secUnitName = ' Sek' # Set short duration unit splitters splitterSplitter = ' ' lastDurSplitter = splitterSplitter nextDurSplitter = lastDurSplitter dayPluralizeString = '' hourPluralizeString = '' minPluralizeString = '' secPluralizeString = '' padZero = '' noDurMessage = 'Keine Dauer' # If normal string is enabled or no mode set if arg == 'long': # Set long names dayUnitName = ' Tag' hourUnitName = ' Stunde' minUnitName = ' Minute' secUnitName = ' Sekunde' # Set long duration unit splitters splitterSplitter = ' ' lastDurSplitter = ' und ' nextDurSplitter = ', ' dayPluralizeString = 'e' hourPluralizeString = 'n' minPluralizeString = 'n' secPluralizeString = 'n' padZero = '' noDurMessage = 'Keine Dauer' # If seconds are greater than 0 if secs > 0: # Import math library import math # Place durations of given units in to variables daySecs = 86400 hourSecs = 3600 minSecs = 60 dayPadZero = '' # Create string to hold outout durationString = '' # Calculate number of days from seconds days = int(math.floor(secs / int(daySecs))) # Subtract days from seconds secs = secs - (days * int(daySecs)) # Calculate number of hours from seconds (minus number of days) hours = int(math.floor(secs / int(hourSecs))) # Subtract hours from seconds secs = secs - (hours * int(hourSecs)) # Calculate number of minutes from seconds (minus number of days and hours) minutes = int(math.floor(secs / int(minSecs))) # Subtract days from seconds secs = secs - (minutes * int(minSecs)) # Calculate number of seconds (minus days, hours and minutes) seconds = secs # If number of days is greater than 0 if days > 0: if arg == 'short': if days < 10: dayPadZero = 2*padZero if days < 100: dayPadZero = padZero # Add multiple days to duration string durationString += splitterSplitter + dayPadZero + str(days) + dayUnitName + (days > 1 and dayPluralizeString or '') # Determine if next string is to be shown if hours > 0: # If there are no more units after this if minutes <= 0 and seconds <= 0: # Set hour splitter to last hourSplitter = lastDurSplitter # If there are unit after this else: # Set hour splitter to next hourSplitter = (len(durationString) > 0 and nextDurSplitter or '') # If number of hours is greater than 0 if hours > 0: # Add multiple days to duration string durationString += hourSplitter + splitterSplitter + (hours < 10 and padZero or '') + str(hours) + hourUnitName + (hours > 1 and hourPluralizeString or '') # Determine if next string is to be shown if minutes > 0: # If there are no more units after this if seconds <= 0: # Set minute splitter to last minSplitter = lastDurSplitter # If there are unit after this else: # Set minute splitter to next minSplitter = (len(durationString) > 0 and nextDurSplitter or '') # If number of minutes is greater than 0 if minutes > 0: # Add multiple days to duration string durationString += minSplitter + splitterSplitter + (minutes < 10 and padZero or '') + str(minutes) + minUnitName + (minutes > 1 and minPluralizeString or '') # Determine if next string is last if seconds > 0: # Set second splitter secSplitter = (len(durationString) > 0 and lastDurSplitter or '') # If number of seconds is greater than 0 if seconds > 0: # Add multiple days to duration string durationString += secSplitter + splitterSplitter + (seconds < 10 and padZero or '') + str(seconds) + secUnitName + (seconds > 1 and secPluralizeString or '') # Return duration string return durationString.strip() # If seconds are not greater than 0 else: # Provide 'No duration' message return noDurMessage