wf: accept empty values in mapping of edit card action (#46031)

This commit is contained in:
Lauréline Guérin 2020-09-15 11:06:43 +02:00
parent 2b3e287b02
commit b5a8437129
No known key found for this signature in database
GPG Key ID: 1FAB9B9B4F93D473
3 changed files with 31 additions and 3 deletions

View File

@ -1477,11 +1477,19 @@ def test_workflows_global_actions_external_workflow_action(pub):
def test_workflows_edit_carddata_action(pub):
create_superuser(pub)
Workflow.wipe()
CardDef.wipe()
wf = Workflow(name='edit card')
st = wf.add_status('Update card', 'st')
wf.store()
carddef = CardDef()
carddef.name = 'My card'
carddef.fields = [
fields.StringField(id='1', label='string'),
]
carddef.store()
app = login(get_app(pub))
resp = app.get('/backoffice/workflows/%s/status/%s/' % (wf.id, st.id))
@ -1489,6 +1497,15 @@ def test_workflows_edit_carddata_action(pub):
resp.forms[0]['action-formdata-action'] = 'Edit Card Data'
resp = resp.forms[0].submit().follow()
assert 'Edit Card Data (not configured)' in resp.text
resp = app.get('/backoffice/workflows/%s/status/%s/items/1/' % (wf.id, st.id))
resp.forms[0]['formdef_slug'] = 'my-card'
resp = resp.forms[0].submit('submit')
assert 'Leaving the field blank will empty the value.' in resp.text
resp.forms[0]['mappings$element0$field_id'] = '1'
resp = resp.forms[0].submit('submit').follow()
assert 'Edit Card Data (not configured)' not in resp.text
def test_workflows_criticality_levels(pub):

View File

@ -44,6 +44,7 @@ class Mapping(object):
class MappingWidget(CompositeWidget):
def __init__(self, name, value=None, to_formdef=None, **kwargs):
value = value or Mapping(None, '')
self.accept_empty_value = kwargs.pop('accept_empty_value', False)
super(MappingWidget, self).__init__(name, value, **kwargs)
to_fields = self._fields_to_options(to_formdef)
@ -54,10 +55,15 @@ class MappingWidget(CompositeWidget):
value=value.field_id,
options=to_fields)
placeholder = ''
if self.accept_empty_value:
placeholder = _('Leaving the field blank will empty the value.')
self.add(ComputedExpressionWidget,
name='expression',
title=_('Expression'),
value=value.expression)
value=value.expression,
value_placeholder=placeholder)
def _fields_to_options(self, formdef):
return [(None, '---', '')] + [
@ -65,7 +71,7 @@ class MappingWidget(CompositeWidget):
def _parse(self, request):
super(MappingWidget, self)._parse(request)
if self.get('field_id') is not None and self.get('expression') is not None:
if self.get('field_id') is not None and self.accept_empty_value or self.get('expression') is not None:
self.value = Mapping(field_id=self.get('field_id'), expression=self.get('expression'))
else:
self.value = None
@ -87,11 +93,13 @@ class MappingsWidget(WidgetListAsTable):
# reorder mappings based on to_formdef fields order
value.sort(key=lambda mapping: self.ranks.get(str(mapping.field_id), 9999))
accept_empty_value = kwargs.pop('accept_empty_value', False)
super(MappingsWidget, self).__init__(
name,
element_type=MappingWidget,
element_kwargs={
'to_formdef': to_formdef,
'accept_empty_value': accept_empty_value,
},
**kwargs)
@ -197,6 +205,7 @@ class CreateFormdataWorkflowStatusItem(WorkflowStatusItem):
formdef_slug = None
formdef_label = N_('Form')
mappings_label = N_('Mappings to new form fields')
accept_empty_value = False
varname_hint = N_('This is used to get linked forms in expressions.')
draft = False
@ -256,6 +265,7 @@ class CreateFormdataWorkflowStatusItem(WorkflowStatusItem):
if 'mappings' in parameters and formdef:
widget = form.add(MappingsWidget, '%smappings' % prefix,
title=_(self.mappings_label),
accept_empty_value=self.accept_empty_value,
to_formdef=formdef,
value=self.mappings)
if form.is_submitted() and get_request().form.get('map_fields_by_varname') != 'yes':

View File

@ -14,7 +14,7 @@
# You should have received a copy of the GNU General Public License
# along with this program; if not, see <http://www.gnu.org/licenses/>.
from wcs.qommon import _
from ..qommon import _
from quixote import get_publisher
from wcs.workflows import register_item_class
@ -28,6 +28,7 @@ class EditCarddataWorkflowStatusItem(CreateCarddataWorkflowStatusItem, ExternalW
description = _('Edit Card Data')
key = 'edit_carddata'
mappings_label = _('Mappings to card fields')
accept_empty_value = True
@classmethod
def is_available(cls, workflow=None):