cards: add support for importing items field (#48775)

This commit is contained in:
Frédéric Péters 2020-11-24 13:25:35 +01:00
parent 901b2006ae
commit 9fd6500aea
3 changed files with 20 additions and 4 deletions

View File

@ -287,6 +287,7 @@ def test_backoffice_cards_import_data_from_csv(pub, studio):
fields.EmailField(id='8', label='Email'),
fields.TextField(id='9', label='Long'),
fields.ItemField(id='10', label='List2', data_source=data_source),
fields.ItemsField(id='11', label='Items', data_source=data_source, required=False),
]
carddef.workflow_roles = {'_editor': user.roles[0]}
carddef.store()
@ -315,7 +316,7 @@ def test_backoffice_cards_import_data_from_csv(pub, studio):
sample_resp = resp.click('Download sample file for this card')
today = datetime.date.today()
assert sample_resp.text == (
"Table,Map,Test,Boolean,List,Date,File,Email,Long,List2\r\n"
"Table,Map,Test,Boolean,List,Date,File,Email,Long,List2,Items\r\n"
"will be ignored - type Table not supported,"
"%s,"
"value,"
@ -325,7 +326,8 @@ def test_backoffice_cards_import_data_from_csv(pub, studio):
"will be ignored - type File Upload not supported,"
"foo@example.com,"
"value,"
"value\r\n" % (pub.get_default_position(), today))
"value,"
"id1|id2|...\r\n" % (pub.get_default_position(), today))
# missing file
resp = resp.forms[0].submit()
@ -345,9 +347,9 @@ def test_backoffice_cards_import_data_from_csv(pub, studio):
resp = resp.forms[0].submit()
assert 'CSV file contains less columns than card fields.' in resp.text
data = [b'Table,Map,Test,Boolean,List,Date,File,Email,Long,List2']
data = [b'Table,Map,Test,Boolean,List,Date,File,Email,Long,List2,Items']
for i in range(1, 150):
data.append(b'table,48.81;2.37,data%d ,%s,item%d,2020-01-%02d,filename-%d,test@localhost,"plop\nplop",1' % (
data.append(b'table,48.81;2.37,data%d ,%s,item%d,2020-01-%02d,filename-%d,test@localhost,"plop\nplop",1,1|2' % (
i, str(bool(i % 2)).encode('utf-8'), i, i % 31 + 1, i))
resp.forms[0]['file'] = Upload('test.csv', b'\n'.join(data),
@ -365,6 +367,11 @@ def test_backoffice_cards_import_data_from_csv(pub, studio):
assert card1.data['10'] == '1'
assert card1.data['10_display'] == 'un'
assert card1.data['10_structured'] == {'id': '1', 'text': 'un', 'more': 'foo'}
assert card1.data['11'] == ['1', '2']
assert card1.data['11_display'] == 'un, deux'
assert card1.data['11_structured'] == [
{'id': '1', 'text': 'un', 'more': 'foo'},
{'id': '2', 'text': 'deux', 'more': 'bar'}]
assert card2.data['2'] == 'data2'
assert card2.data['3'] is False
assert card2.data['5'].tm_mday == 3

View File

@ -160,6 +160,8 @@ class CardPage(FormPage):
value = 'foo@example.com'
elif isinstance(f, fields.MapField):
value = get_publisher().get_default_position()
elif isinstance(f, fields.ItemsField):
value = 'id1|id2|...'
else:
value = 'value'
sample_line.append(value)

View File

@ -1785,6 +1785,13 @@ class ItemsField(WidgetField):
def convert_value_to_str(self, value):
return value
def convert_value_from_str(self, value):
if not isinstance(value, str):
return value
if not value.strip():
return None
return [x.strip() for x in value.split('|') if x.strip()]
def get_view_value(self, value, **kwargs):
if type(value) is str: # == display_value
return value