from django.utils.html import avoid_wrapping from . import registry def _format_size(bytes, callback): bytes = float(bytes) KB = 1 << 10 MB = 1 << 20 GB = 1 << 30 TB = 1 << 40 PB = 1 << 50 if bytes < KB: return callback('', bytes) elif bytes < MB: return callback('K', bytes / KB) elif bytes < GB: return callback('M', bytes / MB) elif bytes < TB: return callback('G', bytes / GB) elif bytes < PB: return callback('T', bytes / TB) else: return callback('P', bytes / PB) @registry.filter def kbdetailformat(bytes): return avoid_wrapping(_format_size(bytes * 1024, lambda x, y: ['%d %sB', '%.2f %sB'][bool(x)] % (y, x))) @registry.filter def kbsimpleformat(kb): return _format_size(kb * 1024, lambda x, y: '%.0f%s' % (y, x or 'B'))