Pretty size
snoop.data.templatetags.pretty_size
#
Django template tag for rendering multiple of bytes.
Used in the Admin page.
Functions#
pretty_size(size_bytes)
#
Returns prettified size originally passed in bytes.
>>> pretty_size(1)
'1 B'
>>> pretty_size(1024)
'1 KB'
>>> pretty_size(1024 * 1024)
'1 MB'
>>> pretty_size(1024 * 1024 * 1024)
'1 GB'
>>> pretty_size(1.111)
'1.12 B'
>>> pretty_size(11.111)
'11.2 B'
>>> pretty_size(111.111)
'112 B'
>>> pretty_size(2000)
'1.96 KB'
>>> pretty_size(21466238156.8)
'20 GB'
Source code in snoop/data/templatetags/pretty_size.py
@register.filter
def pretty_size(size_bytes):
""" Returns prettified size originally passed in bytes.
```python
>>> pretty_size(1)
'1 B'
>>> pretty_size(1024)
'1 KB'
>>> pretty_size(1024 * 1024)
'1 MB'
>>> pretty_size(1024 * 1024 * 1024)
'1 GB'
>>> pretty_size(1.111)
'1.12 B'
>>> pretty_size(11.111)
'11.2 B'
>>> pretty_size(111.111)
'112 B'
>>> pretty_size(2000)
'1.96 KB'
>>> pretty_size(21466238156.8)
'20 GB'
```
"""
if not size_bytes:
return '0'
try:
size = float(size_bytes)
except TypeError:
return size_bytes
# Find actual size.
cnt = 0
while size / 1024 >= 1 and cnt + 1 < _SIZES_LEN:
size /= 1024
cnt += 1
# Limit number of decimal digits (by _DIGITS value).
frac = 0
while size * 10 < _LIMIT_VALUE:
frac += 1
size *= 10
size = ceil(size) / 10 ** frac
# Strip 0 and . from the right side of prettified number.
_size = (('%%0.%df' % frac) % size).split('.')
if len(_size) > 1:
_size[1] = ('.' + _size[1]).rstrip('0.')
return '%s %s' % (''.join(_size), _SIZES[cnt])
pretty_timedelta(timedelta)
#
Returns pretty string for timedelta: 1d 3h 4m 5s
Source code in snoop/data/templatetags/pretty_size.py
@register.filter
def pretty_timedelta(timedelta):
"""Returns pretty string for timedelta: `1d 3h 4m 5s`"""
seconds = timedelta.total_seconds()
if not seconds:
return ''
sign_string = '-' if seconds < 0 else ''
seconds = abs(seconds)
days, seconds = divmod(seconds, 86400)
hours, seconds = divmod(seconds, 3600)
minutes, seconds = divmod(seconds, 60)
if days > 0:
return '%s%dd %dh %dm %ds' % (sign_string, days, hours, minutes, seconds)
elif hours > 0:
return '%s%dh %dm %ds' % (sign_string, hours, minutes, seconds)
elif minutes > 0:
return '%s%dm %ds' % (sign_string, minutes, seconds)
else:
return '%s%ss' % (sign_string, round(seconds, 3))