evalutils: handle lazy dates in make_date and make_datetime (#29406)

This commit is contained in:
Thomas NOËL 2019-01-21 22:44:35 +01:00
parent 853c0e8e2b
commit 4daf8310ca
2 changed files with 30 additions and 2 deletions

View File

@ -1082,6 +1082,34 @@ def test_lazy_formdata_fields(pub):
tmpl = Template('{% if form_var_item != "Foo" %}HELLO{% endif %}')
assert tmpl.render(context) == ''
def test_date_conditions_python(pub, variable_test_data):
for pycondition in (
'utils.age_in_days(form_var_datefield, form_var_datefield2) == 31',
'utils.age_in_days(form_var_datefield, form_var_datefield) == 0',
'utils.age_in_days(form_var_datefield, form_var_datestring) == 0',
'utils.age_in_days(utils.add_days(today, -5)) == 5',
'date(form_var_datefield) < today',
'utils.add_days(form_var_datefield, 36500) > today',
'date(form_var_datefield) + days(36500) > today',
'utils.add_days(form_var_datefield, 31) == date(form_var_datefield2)',
'date(form_var_datefield) + days(31) == date(form_var_datefield2)',
'utils.add_days(form_var_datefield, 32) > date(form_var_datefield2)',
'date(form_var_datefield) + days(32) > date(form_var_datefield2)',
'utils.add_days(form_var_datefield, 30) < date(form_var_datefield2)',
'date(form_var_datefield) + days(30) < date(form_var_datefield2)',
'isinstance(now, datetime.datetime)',
'isinstance(today, datetime.date)',
'utils.age_in_days(today) == 0',
'utils.age_in_days(now) == 0',
'utils.age_in_years(today) == 0',
'utils.age_in_years(now) == 0',
'utils.age_in_years_and_months(today) == (0, 0)',
'utils.age_in_years_and_months(now) == (0, 0)',
'utils.age_in_years_and_months(form_var_datefield, form_var_datefield2) == (0, 1)',
):
condition = Condition({'type': 'python', 'value': pycondition})
assert condition.evaluate() is True
def test_form_digest_date(pub):
formdef = FormDef()
formdef.name = 'foobar'

View File

@ -34,7 +34,7 @@ def make_date(date_var):
if isinstance(date_var, datetime.datetime):
return date_var.date()
if isinstance(date_var, datetime.date):
return date_var
return date_var.replace() # use replace to un-lazy
if isinstance(date_var, time.struct_time) or (
isinstance(date_var, tuple) and len(date_var) == 9):
return datetime.date(*date_var[:3])
@ -47,7 +47,7 @@ def make_date(date_var):
def make_datetime(datetime_var):
'''Extract a date from a datetime, a date, a struct_time or a string'''
if isinstance(datetime_var, datetime.datetime):
return datetime_var
return datetime_var.replace() # use replace to un-lazy
if isinstance(datetime_var, datetime.date):
return datetime.datetime(year=datetime_var.year, month=datetime_var.month,
day=datetime_var.day)