diff --git a/aiogram/utils/payload.py b/aiogram/utils/payload.py index 823009d0..8ab7467d 100644 --- a/aiogram/utils/payload.py +++ b/aiogram/utils/payload.py @@ -2,10 +2,19 @@ import datetime from . import json -DEFAULT_FILTER = ['self'] +DEFAULT_FILTER = ['self', 'cls'] def generate_payload(exclude=None, **kwargs): + """ + Generate payload + + Usage: payload = generate_payload(**locals(), exclude=['foo']) + + :param exclude: + :param kwargs: + :return: dict + """ if exclude is None: exclude = [] return {key: value for key, value in kwargs.items() if @@ -14,13 +23,33 @@ def generate_payload(exclude=None, **kwargs): and not key.startswith('_')} +def _normalize(obj): + """ + Normalize dicts and lists + + :param obj: + :return: normalized object + """ + if isinstance(obj, list): + return [_normalize(item) for item in obj] + elif isinstance(obj, dict): + return {k: _normalize(v) for k, v in obj.items() if v is not None} + elif hasattr(obj, 'to_python'): + return obj.to_python() + return obj + + def prepare_arg(value): + """ + Stringify dicts/lists and convert datetime/timedelta to unix-time + + :param value: + :return: + """ if value is None: return value - elif isinstance(value, (list, dict)): - return json.dumps(value) - elif hasattr(value, 'to_python'): - return json.dumps(value.to_python()) + elif isinstance(value, (list, dict)) or hasattr(value, 'to_python'): + return json.dumps(_normalize(value)) elif isinstance(value, datetime.timedelta): now = datetime.datetime.now() return int((now + value).timestamp())