fields: add support for converting date value to string field (#58316)

This commit is contained in:
Frédéric Péters 2021-11-02 14:08:18 +01:00
parent 949d9ecfbb
commit b104b43dee
3 changed files with 41 additions and 1 deletions

View File

@ -5039,6 +5039,37 @@ def test_form_page_profile_verified_date_prefill(pub):
assert time.strftime('%Y-%m-%d', formdatas[0].data['0']) == '2018-09-27'
def test_form_page_profile_date_as_locked_string_prefill(pub):
user = create_user(pub)
from wcs.admin.settings import UserFieldsFormDef
user_formdef = UserFieldsFormDef(pub)
user_formdef.fields.append(fields.DateField(id='_date', label='date', type='date'))
user_formdef.store()
user.form_data = {'_date': time.strptime('2018-09-27', '%Y-%m-%d')}
user.set_attributes_from_formdata(user.form_data)
user.store()
formdef = create_formdef()
formdef.data_class().wipe()
formdef.fields = [
fields.PageField(id='1', label='1st page', type='page'),
fields.PageField(id='2', label='2nd page', type='page'),
fields.StringField(id='0', label='date', prefill={'type': 'user', 'value': '_date', 'locked': True}),
]
formdef.store()
resp = login(get_app(pub), username='foo', password='foo').get('/test/')
resp = resp.form.submit('submit') # -> second page
assert resp.form['f0'].value == '2018-09-27'
assert 'readonly' in resp.form['f0'].attrs
resp.form['f0'].value = '2015-09-27'
resp = resp.form.submit('submit')
assert 'Check values then click submit.' in resp.text
assert resp.form['f0'].value == '2018-09-27'
def test_form_page_profile_verified_radio_item_prefill(pub):
user = create_user(pub)
formdef = create_formdef()

View File

@ -253,6 +253,7 @@ class Field:
allow_complex = False
display_locations = []
prefill = None
keep_raw_value = True
store_display_value = None
store_structured_value = None
get_opendocument_node_value = None
@ -1022,6 +1023,7 @@ class StringField(WidgetField):
extra_attributes = ['size']
validation = {}
data_source = {}
keep_raw_value = False
def perform_more_widget_changes(self, form, kwargs, edit=True):
if self.data_source:
@ -1088,6 +1090,13 @@ class StringField(WidgetField):
def convert_value_from_str(self, value):
return value
def convert_value_to_str(self, value):
if value is None:
return None
if isinstance(value, (time.struct_time, datetime.date)):
return strftime(date_format(), value)
return str(value)
@classmethod
def convert_value_from_anything(cls, value):
if value is None:

View File

@ -41,7 +41,7 @@ def get_dict_with_varnames(fields, data, formdata=None, varnames_only=False):
raw_value = None
if data is not None:
value = data.get(field.id)
if field.convert_value_to_str:
if field.convert_value_to_str and field.keep_raw_value:
raw_value = value
value = field.convert_value_to_str(value)
display_value = data.get('%s_display' % field.id)