Seconds-to-Duration Template Tag

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
# Import template library
from django import template

# Set register
register = template.Library()

# Register filter
@register.filter
def sectodur(value, arg = ''):
	
	"""
	#######################################################
	#                                                     #
	#   Seconds-to-Duration Template Tag                  #
	#   Dan Ward 2009 (http://d-w.me)                     #
	#                                                     #
	#######################################################
	
	Usage: {{ VALUE|sectodur[:"long"] }}
	
	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 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
		
		# If short string is enabled
		if arg != 'long':
			
			# Set short names
			dayUnitName = ' day'
			hourUnitName = ' hr'
			minUnitName = ' min'
			secUnitName = ' sec'
			
			# Set short duration unit splitters
			lastDurSplitter = ' '
			nextDurSplitter = lastDurSplitter
		
		# If short string is not provided or any other value
		else:
			
			# Set long names
			dayUnitName = ' day'
			hourUnitName = ' hour'
			minUnitName = ' minute'
			secUnitName = ' second'
			
			# Set long duration unit splitters
			lastDurSplitter = ' and '
			nextDurSplitter = ', '
		
		# 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:
			
			# Add multiple days to duration string
			durationString += ' ' + str(days) + dayUnitName + (days > 1 and 's' 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 + ' ' + str(hours) + hourUnitName + (hours > 1 and 's' 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 + ' ' + str(minutes) + minUnitName + (minutes > 1 and 's' 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 + ' ' + str(seconds) + secUnitName + (seconds > 1 and 's' or '')
			
		# Return duration string
		return durationString.strip()
		
	# If seconds are not greater than 0
	else:
		
		# Provide 'No duration' message
		return 'No duration'
	

More like this

  1. cache_smart template tag by michiel_1981 6 years, 1 month ago
  2. Pagination Template Tag by ioan1k 4 years, 7 months ago
  3. Template tag to convert number of seconds into mm:ss format by waitinforatrain 2 years, 4 months ago
  4. Inspect object debugging tag by dballanc 6 years, 9 months ago
  5. Alternative to Captchas (Without Human Interaction) by Archatas 5 years, 6 months ago

Comments

(Forgotten your password?)