0001-workflows-accept-empty-mappings-in-create-edit-form-.patch
tests/admin_pages/test_workflow.py | ||
---|---|---|
2656 | 2656 |
assert "syntax error: Could not parse the remainder: '{{' from '{{'" in resp |
2657 | 2657 | |
2658 | 2658 | |
2659 |
def test_workflows_create_formdata_config_with_empty_values(pub): |
|
2660 |
create_superuser(pub) |
|
2661 | ||
2662 |
FormDef.wipe() |
|
2663 |
target_formdef = FormDef() |
|
2664 |
target_formdef.name = 'target form' |
|
2665 |
target_formdef.fields = [ |
|
2666 |
fields.StringField(id='0', label='string1', varname='foo_string'), |
|
2667 |
fields.StringField(id='1', label='string2', varname='bar_string'), |
|
2668 |
] |
|
2669 |
target_formdef.store() |
|
2670 | ||
2671 |
Workflow.wipe() |
|
2672 |
wf = Workflow(name='create-formdata') |
|
2673 |
st = wf.add_status('New') |
|
2674 |
st.add_action('create_formdata') |
|
2675 |
wf.store() |
|
2676 | ||
2677 |
app = login(get_app(pub)) |
|
2678 |
resp = app.get('/backoffice/workflows/%s/status/%s/items/1/' % (wf.id, st.id)) |
|
2679 |
# only mapping error: custom error message |
|
2680 |
resp.forms[0]['formdef_slug'] = 'target-form' |
|
2681 |
resp = resp.forms[0].submit('submit') |
|
2682 |
assert 'Please define new mappings' in resp |
|
2683 |
resp.form['map_fields_by_varname'].checked = True |
|
2684 |
resp.form['mappings$element0$field_id'] = '1' |
|
2685 |
resp = resp.forms[0].submit('submit') |
|
2686 |
wf.refresh_from_storage() |
|
2687 |
assert wf.possible_status[0].items[0].mappings[0].field_id == '1' |
|
2688 |
assert wf.possible_status[0].items[0].mappings[0].expression is None |
|
2689 | ||
2690 | ||
2659 | 2691 |
def test_workflows_create_formdata_deleted_field(pub): |
2660 | 2692 |
create_superuser(pub) |
2661 | 2693 |
tests/backoffice_pages/test_all.py | ||
---|---|---|
4219 | 4219 |
assert not pq('.wf-links') |
4220 | 4220 | |
4221 | 4221 | |
4222 |
def test_backoffice_create_formdata_map_fields_by_varname_plus_empty(pub, create_formdata): |
|
4223 |
create_formdata['create_formdata'].map_fields_by_varname = True |
|
4224 |
create_formdata['create_formdata'].mappings = [ |
|
4225 |
Mapping(field_id='0', expression=None), |
|
4226 |
] |
|
4227 |
create_formdata['wf'].store() |
|
4228 |
create_formdata['source_formdef'].fields = [ |
|
4229 |
fields.StringField(id='0', label='string', varname='string0'), |
|
4230 |
fields.StringField(id='2', label='string', varname='string2', required=False), |
|
4231 |
] |
|
4232 |
create_formdata['source_formdef'].store() |
|
4233 |
create_formdata['target_formdef'].fields = [ |
|
4234 |
fields.StringField(id='0', label='string', varname='string0'), |
|
4235 |
fields.StringField(id='2', label='string', varname='string2', required=False), |
|
4236 |
] |
|
4237 |
create_formdata['target_formdef'].store() |
|
4238 | ||
4239 |
# create submitting user |
|
4240 |
user = create_formdata['pub'].user_class() |
|
4241 |
user.name = 'Jean Darmette' |
|
4242 |
user.email = 'jean.darmette@triffouilis.fr' |
|
4243 |
user.store() |
|
4244 | ||
4245 |
# create source formdata |
|
4246 |
formdata = create_formdata['source_formdef'].data_class()() |
|
4247 |
create_formdata['formdata'] = formdata |
|
4248 |
formdata.data = { |
|
4249 |
'0': 'foo', |
|
4250 |
'2': 'bar', |
|
4251 |
} |
|
4252 |
formdata.user = user |
|
4253 |
formdata.just_created() |
|
4254 |
formdata.store() |
|
4255 |
formdata.perform_workflow() |
|
4256 | ||
4257 |
# agent login and go to backoffice management pages |
|
4258 |
app = get_app(create_formdata['pub']) |
|
4259 |
app = login(app) |
|
4260 |
resp = app.get(create_formdata['source_formdef'].get_url(backoffice=True)) |
|
4261 | ||
4262 |
# click on first available formdata |
|
4263 |
resp = resp.click('%s-%s' % (create_formdata['source_formdef'].id, formdata.id)) |
|
4264 |
target_data_class = create_formdata['target_formdef'].data_class() |
|
4265 |
assert target_data_class.count() == 0 |
|
4266 |
# resubmit it through backoffice submission |
|
4267 |
resp = resp.form.submit(name='button_resubmit') |
|
4268 |
assert target_data_class.count() == 1 |
|
4269 |
target_formdata = target_data_class.select()[0] |
|
4270 | ||
4271 |
assert target_formdata.submission_context == { |
|
4272 |
'orig_object_type': 'formdef', |
|
4273 |
'orig_formdata_id': '1', |
|
4274 |
'orig_formdef_id': '1', |
|
4275 |
} |
|
4276 |
assert target_formdata.submission_agent_id == str(create_formdata['admin'].id) |
|
4277 |
assert target_formdata.user.id == user.id |
|
4278 |
assert target_formdata.status == 'draft' |
|
4279 |
assert target_formdata.data == {'0': None, '2': 'bar'} |
|
4280 | ||
4281 | ||
4222 | 4282 |
def test_backoffice_create_carddata_from_formdata(pub): |
4223 | 4283 |
CardDef.wipe() |
4224 | 4284 |
FormDef.wipe() |
wcs/wf/create_formdata.py | ||
---|---|---|
50 | 50 |
class MappingWidget(CompositeWidget): |
51 | 51 |
def __init__(self, name, value=None, to_formdef=None, cached_field_labels=None, **kwargs): |
52 | 52 |
value = value or Mapping(None, '') |
53 |
self.accept_empty_value = kwargs.pop('accept_empty_value', False) |
|
54 | 53 |
super().__init__(name, value, **kwargs) |
55 | 54 | |
56 | 55 |
to_fields = self._fields_to_options(to_formdef) |
... | ... | |
63 | 62 |
SingleSelectWidget, name='field_id', title=_('Field'), value=value.field_id, options=to_fields |
64 | 63 |
) |
65 | 64 | |
66 |
placeholder = '' |
|
67 |
if self.accept_empty_value: |
|
68 |
placeholder = _('Leaving the field blank will empty the value.') |
|
69 | ||
70 | 65 |
self.add( |
71 | 66 |
ComputedExpressionWidget, |
72 | 67 |
name='expression', |
73 | 68 |
title=_('Expression'), |
74 | 69 |
value=value.expression, |
75 |
value_placeholder=placeholder,
|
|
70 |
value_placeholder=_('Leaving the field blank will empty the value.'),
|
|
76 | 71 |
) |
77 | 72 | |
78 | 73 |
def _fields_to_options(self, formdef): |
... | ... | |
82 | 77 | |
83 | 78 |
def _parse(self, request): |
84 | 79 |
super()._parse(request) |
85 |
if self.get('field_id') is not None and self.accept_empty_value or self.get('expression') is not None:
|
|
80 |
if self.get('field_id') is not None: |
|
86 | 81 |
self.value = Mapping(field_id=self.get('field_id'), expression=self.get('expression')) |
87 | 82 |
else: |
88 | 83 |
self.value = None |
... | ... | |
104 | 99 |
# reorder mappings based on to_formdef fields order |
105 | 100 |
value.sort(key=lambda mapping: self.ranks.get(str(mapping.field_id), 9999)) |
106 | 101 | |
107 |
accept_empty_value = kwargs.pop('accept_empty_value', False) |
|
108 | 102 |
cached_field_labels = kwargs.pop('cached_field_labels', None) |
109 | 103 |
super().__init__( |
110 | 104 |
name, |
111 | 105 |
element_type=MappingWidget, |
112 | 106 |
element_kwargs={ |
113 | 107 |
'to_formdef': to_formdef, |
114 |
'accept_empty_value': accept_empty_value, |
|
115 | 108 |
'cached_field_labels': cached_field_labels, |
116 | 109 |
}, |
117 | 110 |
**kwargs, |
... | ... | |
305 | 298 |
formdef_slug = None |
306 | 299 |
formdef_label = _('Form') |
307 | 300 |
mappings_label = _('Mappings to new form fields') |
308 |
accept_empty_value = False |
|
309 | 301 |
varname_hint = _('This is used to get linked forms in expressions.') |
310 | 302 |
user_association_option_label = _('User to associate to form') |
311 | 303 | |
... | ... | |
411 | 403 |
MappingsWidget, |
412 | 404 |
'%smappings' % prefix, |
413 | 405 |
title=self.mappings_label, |
414 |
accept_empty_value=self.accept_empty_value, |
|
415 | 406 |
to_formdef=formdef, |
416 | 407 |
value=self.mappings, |
417 | 408 |
cached_field_labels=self.cached_field_labels, |
wcs/wf/edit_carddata.py | ||
---|---|---|
26 | 26 |
description = _('Edit Card Data') |
27 | 27 |
key = 'edit_carddata' |
28 | 28 |
mappings_label = _('Mappings to card fields') |
29 |
accept_empty_value = True |
|
30 | 29 |
automatic_targetting = _('Action on cards linked to this form/card') |
31 | 30 |
manual_targetting = _('Specify the list of cards on which the action will be applied') |
32 | 31 | |
33 |
- |