- Replace dropdown tier selection with attractive visual buttons - Add tier-button CSS with hover effects and selection states - Remove 'or pay by card' divider from subscription form for cleaner UI - Update JavaScript to handle tier button selection events - Fix Stripe module import conflict by renaming stripe directory to stripe_config - Add responsive grid layout for tier buttons on mobile devices
46 lines
1.5 KiB
Python
46 lines
1.5 KiB
Python
import calendar
|
|
import datetime
|
|
import time
|
|
from collections import OrderedDict
|
|
from typing import Generator, 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 _api_encode(data) -> 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):
|
|
if isinstance(sv, dict):
|
|
subdict = _encode_nested_dict("%s[%d]" % (key, i), sv)
|
|
for k, v in _api_encode(subdict):
|
|
yield (k, v)
|
|
else:
|
|
yield ("%s[%d]" % (key, i), sv)
|
|
elif isinstance(value, dict):
|
|
subdict = _encode_nested_dict(key, value)
|
|
for subkey, subvalue in _api_encode(subdict):
|
|
yield (subkey, subvalue)
|
|
elif isinstance(value, datetime.datetime):
|
|
yield (key, _encode_datetime(value))
|
|
else:
|
|
yield (key, value)
|