fields: item fields are stored as None if value is empty string (#59542)

This commit is contained in:
Lauréline Guérin 2021-12-09 17:09:12 +01:00
parent a64a01ed97
commit b8d8dc66ae
No known key found for this signature in database
GPG Key ID: 1FAB9B9B4F93D473
2 changed files with 59 additions and 2 deletions

View File

@ -2,7 +2,8 @@ import pytest
from quixote import cleanup, get_response
from wcs import sessions
from wcs.fields import EmailField, StringField
from wcs.carddef import CardDef
from wcs.fields import EmailField, ItemField, StringField
from wcs.formdef import FormDef
from wcs.qommon.http_request import HTTPRequest
from wcs.wf.create_formdata import CreateFormdataWorkflowStatusItem, Mapping
@ -278,3 +279,59 @@ def test_create_formdata_attach_to_history(two_pubs):
target_formdef.remove_self()
formdata.refresh_from_storage()
assert 'deleted' in str(formdata.evolution[-1].parts[0].view())
def test_create_formdata_item_optional_mapping(pub):
FormDef.wipe()
CardDef.wipe()
carddef = CardDef()
carddef.name = 'Bar'
carddef.fields = [
StringField(id='0', label='Bar', varname='bar'),
]
carddef.digest_templates = {'default': '{{ form_var_bar }}'}
carddef.store()
carddef.data_class().wipe()
for i in range(0, 4):
carddata = carddef.data_class()()
carddata.data = {'0': 'Bar %s' % (i + 1)}
carddata.store()
target_formdef = FormDef()
target_formdef.name = 'Foo'
target_formdef.fields = [
ItemField(id='0', label='Bar', type='item', data_source={'type': 'carddef:bar'}, required=False),
]
target_formdef.store()
target_formdef.data_class().wipe()
wf = Workflow(name='create-formdata')
wf.possible_status = Workflow.get_default_workflow().possible_status[:]
create = CreateFormdataWorkflowStatusItem()
create.label = 'create a new linked form'
create.id = '_create'
create.formdef_slug = 'foo'
create.mappings = [
Mapping(field_id='0', expression='{% if False %}3{% endif %}'),
]
create.parent = wf.possible_status[1]
wf.possible_status[1].items.insert(0, create)
wf.store()
source_formdef = FormDef()
source_formdef.name = 'Foo'
source_formdef.fields = []
source_formdef.workflow_id = wf.id
source_formdef.store()
source_formdef.data_class().wipe()
formdata = source_formdef.data_class()()
formdata.data = {}
formdata.just_created()
formdata.perform_workflow()
assert target_formdef.data_class().count() == 1
target_formdata = target_formdef.data_class().get(1)
assert target_formdata.data == {'0': None}

View File

@ -2100,7 +2100,7 @@ class ItemField(WidgetField, MapOptionsMixin, ItemFieldMixin):
return value
def convert_value_from_anything(self, value):
if value is None:
if not value:
return None
value = str(value)
if self.data_source: