1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
|
import calendar
import datetime
import time
from collections import OrderedDict
from typing import Generator, Optional, Tuple, Any
def _encode_datetime(dttime: datetime.datetime):
if dttime.tzinfo and dttime.tzinfo.utcoffset(dttime) is not None:
utc_timestamp = calendar.timegm(dttime.utctimetuple())
else:
utc_timestamp = time.mktime(dttime.timetuple())
return int(utc_timestamp)
def _encode_nested_dict(key, data, fmt="%s[%s]"):
d = OrderedDict()
for subkey, subvalue in data.items():
d[fmt % (key, subkey)] = subvalue
return d
def _json_encode_date_callback(value):
if isinstance(value, datetime.datetime):
return _encode_datetime(value)
return value
def _api_encode(
data, api_mode: Optional[str]
) -> Generator[Tuple[str, Any], None, None]:
for key, value in data.items():
if value is None:
continue
elif hasattr(value, "stripe_id"):
yield (key, value.stripe_id)
elif isinstance(value, list) or isinstance(value, tuple):
for i, sv in enumerate(value):
encoded_key = key if api_mode == "V2" else "%s[%d]" % (key, i)
if isinstance(sv, dict):
subdict = _encode_nested_dict(encoded_key, sv)
for k, v in _api_encode(subdict, api_mode):
yield (k, v)
else:
yield (encoded_key, sv)
elif isinstance(value, dict):
subdict = _encode_nested_dict(key, value)
for subkey, subvalue in _api_encode(subdict, api_mode):
yield (subkey, subvalue)
elif isinstance(value, datetime.datetime):
yield (key, _encode_datetime(value))
else:
yield (key, value)
|