45 lines
1.6 KiB
Python
45 lines
1.6 KiB
Python
import re
|
|
from datetime import datetime, timedelta
|
|
|
|
from celery import current_app
|
|
from humanize import naturaltime
|
|
from pytz import timezone, utc
|
|
|
|
KEYWORDS_UP = ('ssl', 'uri', 'url', 'uuid', 'eta')
|
|
KEYWORDS_DOWN = ('args', 'kwargs')
|
|
UUID_REGEX = re.compile(r'^[\w]{8}(-[\w]{4}){3}-[\w]{12}$')
|
|
|
|
|
|
def format_time(time, tz):
|
|
dt = datetime.fromtimestamp(time, tz=tz)
|
|
return dt.strftime("%Y-%m-%d %H:%M:%S.%f %Z")
|
|
|
|
|
|
def humanize(obj, type=None, length=None):
|
|
if obj is None:
|
|
obj = ''
|
|
elif type and type.startswith('time'):
|
|
tz = type[len('time'):].lstrip('-')
|
|
tz = timezone(tz) if tz else getattr(current_app, 'timezone', '') or utc
|
|
obj = format_time(float(obj), tz) if obj else ''
|
|
elif type and type.startswith('natural-time'):
|
|
tz = type[len('natural-time'):].lstrip('-')
|
|
tz = timezone(tz) if tz else getattr(current_app, 'timezone', '') or utc
|
|
delta = datetime.now(tz) - datetime.fromtimestamp(float(obj), tz)
|
|
if delta < timedelta(days=1):
|
|
obj = naturaltime(delta)
|
|
else:
|
|
obj = format_time(float(obj), tz) if obj else ''
|
|
elif isinstance(obj, str) and not re.match(UUID_REGEX, obj):
|
|
obj = obj.replace('-', ' ').replace('_', ' ')
|
|
obj = re.sub('|'.join(KEYWORDS_UP),
|
|
lambda m: m.group(0).upper(), obj)
|
|
if obj and obj not in KEYWORDS_DOWN:
|
|
obj = obj[0].upper() + obj[1:]
|
|
elif isinstance(obj, list):
|
|
if all(isinstance(x, (int, float, str)) for x in obj):
|
|
obj = ', '.join(map(str, obj))
|
|
if length is not None and len(obj) > length:
|
|
obj = obj[:length - 4] + ' ...'
|
|
return obj
|