fields: make items field accept a single integer as value (#50267)

This commit is contained in:
Frédéric Péters 2021-01-18 14:47:00 +01:00
parent 2b69534d13
commit eb60d7b514
2 changed files with 64 additions and 0 deletions

View File

@ -4645,6 +4645,58 @@ def test_set_backoffice_field_items(two_pubs):
item.fields = [{'field_id': 'bo1', 'value': "{{form_var_items_raw}}"}]
item.perform(formdata)
# using a single int
datasource = {'type': 'formula',
'value': repr([{'id': 1, 'text': 'aa', 'more': 'aaa'},
{'id': 2, 'text': 'bb', 'more': 'bbb'},
{'id': 3, 'text': 'cc', 'more': 'ccc'}])}
wf.backoffice_fields_formdef.fields = [
ItemsField(id='bo1', label='1st backoffice field',
type='items', varname='backoffice_item',
data_source=datasource),
]
wf.store()
item = SetBackofficeFieldsWorkflowStatusItem()
item.parent = st1
item.fields = [{'field_id': 'bo1', 'value': "=2"}]
item.perform(formdata)
formdata = formdef.data_class().get(formdata.id)
if two_pubs.is_using_postgresql():
assert formdata.data['bo1'] == ['2']
else:
assert formdata.data['bo1'] == [2]
assert formdata.data['bo1_display'] == 'bb'
assert len(formdata.data['bo1_structured']) == 1
# using an invalid value
if two_pubs.is_using_postgresql():
formdata.data = {}
formdata.store()
two_pubs.loggederror_class.wipe()
item = SetBackofficeFieldsWorkflowStatusItem()
item.parent = st1
item.fields = [{'field_id': 'bo1', 'value': "=Ellipsis"}]
item.perform(formdata)
assert two_pubs.loggederror_class.count() == 1
logged_error = two_pubs.loggederror_class.select()[0]
assert 'Failed to convert' in logged_error.summary
# using a string with multiple values
item = SetBackofficeFieldsWorkflowStatusItem()
item.parent = st1
item.fields = [{'field_id': 'bo1', 'value': "1|3"}]
item.perform(formdata)
formdata = formdef.data_class().get(formdata.id)
assert formdata.data['bo1'] == ['1', '3']
assert formdata.data['bo1_display'] == 'aa, cc'
assert len(formdata.data['bo1_structured']) == 2
assert {'id': 1, 'more': 'aaa', 'text': 'aa'} in formdata.data['bo1_structured']
assert {'id': 3, 'more': 'ccc', 'text': 'cc'} in formdata.data['bo1_structured']
def test_set_backoffice_field_date(two_pubs):
Workflow.wipe()

View File

@ -1911,6 +1911,18 @@ class ItemsField(WidgetField):
return None
return [x.strip() for x in value.split('|') if x.strip()]
def convert_value_from_anything(self, value):
if isinstance(value, str):
return self.convert_value_from_str(value)
if isinstance(value, int):
return [value]
if not value:
return None
try:
return list(value)
except TypeError:
raise ValueError('invalid data for items type (%r)' % value)
def get_view_value(self, value, **kwargs):
if type(value) is str: # == display_value
return value