formdata: improve compatibility of lazy date fields (#25961)

This commit is contained in:
Frédéric Péters 2018-08-30 12:18:24 +02:00
parent 76632d4694
commit 473f489dd4
2 changed files with 70 additions and 5 deletions

View File

@ -618,7 +618,14 @@ def test_lazy_formdata(pub, variable_test_data):
assert bool(lazy_formdata.var.boolfield) is False
assert lazy_formdata.var.boolfield2 == 'True'
assert bool(lazy_formdata.var.boolfield2) is True
assert lazy_formdata.var.datefield == time.strptime('2018-07-31', '%Y-%m-%d')
assert lazy_formdata.var.datefield == '2018-07-31'
assert lazy_formdata.var.datefield.raw == time.strptime('2018-07-31', '%Y-%m-%d')
assert lazy_formdata.var.datefield.tm_year == 2018
assert lazy_formdata.var.datefield.tm_mon == 7
assert lazy_formdata.var.datefield.tm_mday == 31
for attr in ('tm_year', 'tm_mon', 'tm_mday', 'tm_hour', 'tm_min', 'tm_sec',
'tm_wday', 'tm_yday'):
getattr(lazy_formdata.var.datefield, attr)
assert lazy_formdata.var.itemsfield == 'aa, ac'
assert 'aa' in lazy_formdata.var.itemsfield # taken as a list
assert 'aa,' not in lazy_formdata.var.itemsfield # not as a string
@ -689,3 +696,23 @@ def test_lazy_templates(pub, variable_test_data):
tmpl = Template('{{form_user_name_identifier_0}}')
assert tmpl.render(context) == pub.user_class.select()[0].name_identifiers[0]
def test_form_digest_date(pub):
formdef = FormDef()
formdef.name = 'foobar'
formdef.url_name = 'foobar'
formdef.fields = [fields.DateField(id='0', label='date', varname='date')]
formdef.digest_template = 'plop {{ form_var_date }} plop'
formdef.store()
formdata = formdef.data_class()()
formdata.data = {'0': time.strptime('2015-05-12', '%Y-%m-%d')}
formdata.store()
assert formdef.data_class().get(formdata.id).digest == 'plop 2015-05-12 plop'
pub.cfg['language'] = {'language': 'fr'}
pub.write_cfg()
formdata = formdef.data_class()()
formdata.data = {'0': time.strptime('2015-05-12', '%Y-%m-%d')}
formdata.store()
assert formdef.data_class().get(formdata.id).digest == 'plop 12/05/2015 plop'

View File

@ -306,9 +306,7 @@ class LazyFormDataVar(object):
raise KeyError(key)
if field.key == 'date':
# for backward compatibility with sites using time.struct_time
# methods we still have to return a raw value for date fields.
return self.data.get(field.id)
return LazyFieldVarDate(self.data, field, self.formdata)
return LazyFieldVar(self.data, field, self.formdata)
@ -327,7 +325,7 @@ class LazyFieldVar(object):
@property
def raw(self):
if self.field.store_display_value or self.field.key == 'file':
if self.field.store_display_value or self.field.key in ('file', 'date'):
return self.data.get(self.field.id)
raise KeyError('raw')
@ -395,6 +393,46 @@ class LazyFieldVar(object):
raise AssertionError('lazy cannot be pickled')
class LazyFieldVarDate(LazyFieldVar):
# for backward compatibility with sites using time.struct_time
# methods we still have to provide time.struct_time properties.
def get_raw(self):
return self.data.get(self.field.id)
@property
def tm_year(self):
return self.get_raw().tm_year
@property
def tm_mon(self):
return self.get_raw().tm_mon
@property
def tm_mday(self):
return self.get_raw().tm_mday
@property
def tm_hour(self):
return self.get_raw().tm_hour
@property
def tm_min(self):
return self.get_raw().tm_min
@property
def tm_sec(self):
return self.get_raw().tm_sec
@property
def tm_wday(self):
return self.get_raw().tm_wday
@property
def tm_yday(self):
return self.get_raw().tm_yday
class LazyUser(object):
def __init__(self, user):
self.user = user