Projet

Général

Profil

0001-workflows-accept-empty-mappings-in-create-edit-form-.patch

Frédéric Péters, 31 mai 2022 10:47

Télécharger (8,52 ko)

Voir les différences:

Subject: [PATCH] workflows: accept empty mappings in (create/edit) (form/card)
 actions (#58632)

 tests/admin_pages/test_workflow.py | 32 ++++++++++++++++
 tests/backoffice_pages/test_all.py | 60 ++++++++++++++++++++++++++++++
 wcs/wf/create_formdata.py          | 13 +------
 wcs/wf/edit_carddata.py            |  1 -
 4 files changed, 94 insertions(+), 12 deletions(-)
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
-