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 55 56 57 58 59 60 61 62 63 64 65 66 67 68
|
import datetime
from wtforms import Form
from wtforms.fields import FormField
from wtforms.utils import unset_value
from .html5 import DateField
from .time import TimeField
class Date:
date = None
time = None
class SplitDateTimeField(FormField):
def __init__(self, label=None, validators=None, separator="-", **kwargs):
FormField.__init__(
self,
datetime_form(kwargs.pop("datetime_form", {})),
label=label,
validators=validators,
separator=separator,
**kwargs,
)
def process(self, formdata, data=unset_value, extra_filters=None):
if data is unset_value:
try:
data = self.default()
except TypeError:
data = self.default
if data:
obj = Date()
obj.date = data.date()
obj.time = data.time()
else:
obj = None
kwargs = dict()
if extra_filters is not None:
# do not enforce extra_filters=None injection to wtforms<3
kwargs["extra_filters"] = extra_filters
FormField.process(self, formdata, data=obj, **kwargs)
def populate_obj(self, obj, name):
if hasattr(obj, name):
date = self.date.data
hours, minutes = self.time.data.hour, self.time.data.minute
setattr(
obj,
name,
datetime.datetime(date.year, date.month, date.day, hours, minutes),
)
def datetime_form(options):
options.setdefault("date", {})
options.setdefault("time", {})
options["date"].setdefault("label", "Date")
options["time"].setdefault("label", "Time")
base_form = options.get("base_form", Form)
class DateTimeForm(base_form):
date = DateField(**options["date"])
time = TimeField(**options["time"])
return DateTimeForm
|