Skip to content

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))