fields: make items field accept a single integer as value (#50267)
This commit is contained in:
parent
2b69534d13
commit
eb60d7b514
|
@ -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()
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue