Projet

Général

Profil

0001-workflows-don-t-run-custom-form-validation-code-in-V.patch

Frédéric Péters, 05 mars 2021 12:13

Télécharger (26,8 ko)

Voir les différences:

Subject: [PATCH] workflows: don't run custom form validation code in
 VariablesWidget (#51657)

 tests/admin_pages/test_workflow.py | 26 ++++++++++++++++
 wcs/admin/workflows.py             |  2 +-
 wcs/qommon/sessions.py             |  1 +
 wcs/wf/aggregation_email.py        |  6 ++--
 wcs/wf/attachment.py               |  6 ++--
 wcs/wf/backoffice_fields.py        |  6 ++--
 wcs/wf/create_formdata.py          | 10 +++---
 wcs/wf/criticality.py              |  6 ++--
 wcs/wf/dispatch.py                 |  6 ++--
 wcs/wf/export_to_model.py          |  4 +--
 wcs/wf/external_workflow.py        |  7 +++--
 wcs/wf/form.py                     |  6 ++--
 wcs/wf/geolocate.py                |  6 ++--
 wcs/wf/jump.py                     |  4 +--
 wcs/wf/notification.py             |  6 ++--
 wcs/wf/profile.py                  |  6 ++--
 wcs/wf/redirect_to_url.py          |  6 ++--
 wcs/wf/register_comment.py         |  6 ++--
 wcs/wf/resubmit.py                 |  6 ++--
 wcs/wf/roles.py                    | 12 +++----
 wcs/wf/wscall.py                   |  6 ++--
 wcs/workflows.py                   | 50 ++++++++++--------------------
 22 files changed, 92 insertions(+), 102 deletions(-)
tests/admin_pages/test_workflow.py
1277 1277
    assert Workflow.get(1).variables_formdef.fields[0].varname == '1*1*message'
1278 1278

  
1279 1279

  
1280
def test_workflows_variables_edit_with_all_action_types(pub):
1281
    test_workflows_add_all_actions(pub)
1282

  
1283
    app = login(get_app(pub))
1284
    resp = app.get('/backoffice/workflows/1/')
1285
    resp = resp.click(href='variables/')
1286
    assert resp.location == 'http://example.net/backoffice/workflows/1/variables/fields/'
1287
    resp = resp.follow()
1288

  
1289
    # add a simple field
1290
    resp.forms[0]['label'] = 'foobar'
1291
    resp.forms[0]['type'] = 'string'
1292
    resp = resp.forms[0].submit()
1293
    assert resp.location == 'http://example.net/backoffice/workflows/1/variables/fields/'
1294
    resp = resp.follow()
1295

  
1296
    resp = app.get('/backoffice/workflows/1/variables/fields/')
1297
    resp = resp.click('Edit', href='1/')
1298
    assert 'varname$select' in resp.forms[0].fields
1299
    resp.forms[0]['varname$name'].value = 'xxx'
1300
    resp = resp.forms[0].submit('submit')
1301

  
1302
    assert Workflow.get(1).variables_formdef.fields[0].key == 'string'
1303
    assert Workflow.get(1).variables_formdef.fields[0].varname == 'xxx'
1304

  
1305

  
1280 1306
def test_workflows_variables_with_export_to_model_action(pub):
1281 1307
    test_workflows_variables(pub)
1282 1308

  
wcs/admin/workflows.py
941 941
                    for parameter in parameters:
942 942
                        key = prefix + parameter
943 943
                        fake_form = Form()
944
                        item.add_parameters_widgets(fake_form, [parameter])
944
                        item.add_parameters_widgets(fake_form, [parameter], orig='variable_widget')
945 945
                        if not fake_form.widgets:
946 946
                            continue
947 947
                        parameter_label = fake_form.widgets[0].title
wcs/qommon/sessions.py
175 175

  
176 176
    def create_form_token(self):
177 177
        token = super(Session, self).create_form_token()
178
        print('created token:', token)
178 179
        open(self.get_form_token_filepath(token), 'wb').close()
179 180
        return token
180 181

  
wcs/wf/aggregation_email.py
39 39
        else:
40 40
            return _('not completed')
41 41

  
42
    def add_parameters_widgets(self, form, parameters, prefix='', formdef=None):
43
        super(AggregationEmailWorkflowStatusItem, self).add_parameters_widgets(
44
            form, parameters, prefix=prefix, formdef=formdef
45
        )
42
    def add_parameters_widgets(self, form, parameters, prefix='', formdef=None, **kwargs):
43
        super().add_parameters_widgets(form, parameters, prefix=prefix, formdef=formdef, **kwargs)
46 44
        if 'to' in parameters:
47 45
            form.add(
48 46
                WidgetList,
wcs/wf/attachment.py
178 178
        parameters += ('condition',)
179 179
        return parameters
180 180

  
181
    def add_parameters_widgets(self, form, parameters, prefix='', formdef=None):
182
        super(AddAttachmentWorkflowStatusItem, self).add_parameters_widgets(
183
            form, parameters, prefix=prefix, formdef=formdef
184
        )
181
    def add_parameters_widgets(self, form, parameters, prefix='', formdef=None, **kwargs):
182
        super().add_parameters_widgets(form, parameters, prefix=prefix, formdef=formdef, **kwargs)
185 183
        if 'by' in parameters:
186 184
            form.add(
187 185
                WidgetList,
wcs/wf/backoffice_fields.py
102 102
    def get_parameters(self):
103 103
        return ('label', 'fields', 'condition')
104 104

  
105
    def add_parameters_widgets(self, form, parameters, prefix='', formdef=None):
106
        super(SetBackofficeFieldsWorkflowStatusItem, self).add_parameters_widgets(
107
            form, parameters, prefix=prefix, formdef=formdef
108
        )
105
    def add_parameters_widgets(self, form, parameters, prefix='', formdef=None, **kwargs):
106
        super().add_parameters_widgets(form, parameters, prefix=prefix, formdef=formdef, **kwargs)
109 107
        if 'label' in parameters:
110 108
            form.add(StringWidget, '%slabel' % prefix, size=40, title=_('Label'), value=self.label)
111 109

  
wcs/wf/create_formdata.py
240 240
    def formdef(self):
241 241
        return self._resolve_formdef_slug(self.formdef_slug)
242 242

  
243
    def add_parameters_widgets(self, form, parameters, prefix='', formdef=None):
244
        super(CreateFormdataWorkflowStatusItem, self).add_parameters_widgets(
245
            form, parameters, prefix=prefix, formdef=formdef
246
        )
243
    def add_parameters_widgets(self, form, parameters, prefix='', formdef=None, **kwargs):
244
        super().add_parameters_widgets(form, parameters, prefix=prefix, formdef=formdef, **kwargs)
247 245
        if 'formdef_slug' in parameters:
248 246
            list_forms = [(None, '---', '')]
249 247
            list_forms += [
......
338 336
                title=_('Include new form in the form history'),
339 337
                value=self.attach_to_history,
340 338
            )
339

  
340
        if kwargs.get('orig') == 'variable_widget':
341
            return
342

  
341 343
        errors = [w.name for w in form.get_all_widgets() if w.has_error()]
342 344
        if set(errors) == set(['%smappings' % prefix]):
343 345
            form.ERROR_NOTICE = _('This action is configured in two steps. See below for details.')
wcs/wf/criticality.py
38 38
    def is_available(cls, workflow=None):
39 39
        return workflow and workflow.criticality_levels
40 40

  
41
    def add_parameters_widgets(self, form, parameters, prefix='', formdef=None):
42
        super(ModifyCriticalityWorkflowStatusItem, self).add_parameters_widgets(
43
            form, parameters, prefix=prefix, formdef=formdef
44
        )
41
    def add_parameters_widgets(self, form, parameters, prefix='', formdef=None, **kwargs):
42
        super().add_parameters_widgets(form, parameters, prefix=prefix, formdef=formdef, **kwargs)
45 43
        if 'mode' in parameters:
46 44
            form.add(
47 45
                SingleSelectWidget,
wcs/wf/dispatch.py
123 123
            return function_label
124 124
        return None
125 125

  
126
    def add_parameters_widgets(self, form, parameters, prefix='', formdef=None):
127
        super(DispatchWorkflowStatusItem, self).add_parameters_widgets(
128
            form, parameters, prefix=prefix, formdef=formdef
129
        )
126
    def add_parameters_widgets(self, form, parameters, prefix='', formdef=None, **kwargs):
127
        super().add_parameters_widgets(form, parameters, prefix=prefix, formdef=formdef, **kwargs)
130 128
        if 'role_key' in parameters:
131 129
            if not self.parent.parent.roles:
132 130
                self.parent.parent.roles = {}
wcs/wf/export_to_model.py
317 317
        parameters += ('method', 'by', 'label', 'backoffice_info_text', 'filename', 'condition')
318 318
        return parameters
319 319

  
320
    def add_parameters_widgets(self, form, parameters, prefix='', formdef=None):
321
        super(ExportToModel, self).add_parameters_widgets(form, parameters, prefix=prefix, formdef=formdef)
320
    def add_parameters_widgets(self, form, parameters, prefix='', formdef=None, **kwargs):
321
        super().add_parameters_widgets(form, parameters, prefix=prefix, formdef=formdef, **kwargs)
322 322
        methods = collections.OrderedDict(
323 323
            [('interactive', _('Interactive (button)')), ('non-interactive', _('Non interactive'))]
324 324
        )
wcs/wf/external_workflow.py
72 72
            if trigger.identifier == trigger_id:
73 73
                return trigger
74 74

  
75
    def add_parameters_widgets(self, form, parameters, prefix='', formdef=None):
76
        super().add_parameters_widgets(form, parameters, prefix=prefix, formdef=formdef)
75
    def add_parameters_widgets(self, form, parameters, prefix='', formdef=None, **kwargs):
76
        super().add_parameters_widgets(form, parameters, prefix=prefix, formdef=formdef, **kwargs)
77 77

  
78 78
        if 'slug' in parameters:
79 79
            objects = [(None, '---', '')]
......
139 139
                options=triggers_names,
140 140
            )
141 141

  
142
        if kwargs.get('orig') == 'variable_widget':
143
            return
144

  
142 145
        errors = [w.name for w in form.get_all_widgets() if w.has_error()]
143 146
        if set(errors) == set(['%strigger_id' % prefix]):
144 147
            form.ERROR_NOTICE = _('This action is configured in two steps. See below for details.')
wcs/wf/form.py
103 103
            FileDirectory._lookup_methods.append('lookup_wf_form_file')
104 104
            FileDirectory.lookup_wf_form_file = lookup_wf_form_file
105 105

  
106
    def add_parameters_widgets(self, form, parameters, prefix='', formdef=None):
107
        super(FormWorkflowStatusItem, self).add_parameters_widgets(
108
            form, parameters, prefix=prefix, formdef=formdef
109
        )
106
    def add_parameters_widgets(self, form, parameters, prefix='', formdef=None, **kwargs):
107
        super().add_parameters_widgets(form, parameters, prefix=prefix, formdef=formdef, **kwargs)
110 108
        if 'by' in parameters:
111 109
            form.add(
112 110
                WidgetList,
wcs/wf/geolocate.py
49 49
    def get_parameters(self):
50 50
        return ('method', 'address_string', 'map_variable', 'photo_variable', 'overwrite', 'condition')
51 51

  
52
    def add_parameters_widgets(self, form, parameters, prefix='', formdef=None):
53
        super(GeolocateWorkflowStatusItem, self).add_parameters_widgets(
54
            form, parameters, prefix=prefix, formdef=formdef
55
        )
52
    def add_parameters_widgets(self, form, parameters, prefix='', formdef=None, **kwargs):
53
        super().add_parameters_widgets(form, parameters, prefix=prefix, formdef=formdef, **kwargs)
56 54
        methods = collections.OrderedDict(
57 55
            [
58 56
                ('address_string', _('Address String')),
wcs/wf/jump.py
176 176
            return ('status', 'condition', 'by', 'timeout', 'set_marker_on_status')
177 177
        return ('status', 'condition', 'trigger', 'by', 'timeout', 'set_marker_on_status')
178 178

  
179
    def add_parameters_widgets(self, form, parameters, prefix='', formdef=None):
180
        super(JumpWorkflowStatusItem, self).add_parameters_widgets(form, parameters, prefix, formdef)
179
    def add_parameters_widgets(self, form, parameters, prefix='', formdef=None, **kwargs):
180
        super().add_parameters_widgets(form, parameters, prefix, formdef, **kwargs)
181 181
        if 'condition' in parameters:
182 182
            form.get_widget('%scondition' % prefix).advanced = False
183 183
        if 'trigger' in parameters:
wcs/wf/notification.py
72 72
    def get_parameters(self):
73 73
        return ('title', 'body', 'origin', 'condition')
74 74

  
75
    def add_parameters_widgets(self, form, parameters, prefix='', formdef=None):
75
    def add_parameters_widgets(self, form, parameters, prefix='', formdef=None, **kwargs):
76 76
        if 'to' in parameters:
77 77
            # never displayed in the current UI (no 'to' in get_parameters)
78 78
            form.add(
......
115 115
                required=False,
116 116
                advanced=not (self.origin),
117 117
            )
118
        WorkflowStatusItem.add_parameters_widgets(self, form, parameters, prefix=prefix, formdef=formdef)
118
        WorkflowStatusItem.add_parameters_widgets(
119
            self, form, parameters, prefix=prefix, formdef=formdef, **kwargs
120
        )
119 121

  
120 122
    def perform(self, formdata):
121 123
        if not (self.is_available() and self.to and self.title and self.body):
wcs/wf/profile.py
110 110
    def get_parameters(self):
111 111
        return ('fields', 'condition')
112 112

  
113
    def add_parameters_widgets(self, form, parameters, prefix='', formdef=None):
114
        super(UpdateUserProfileStatusItem, self).add_parameters_widgets(
115
            form, parameters, prefix=prefix, formdef=formdef
116
        )
113
    def add_parameters_widgets(self, form, parameters, prefix='', formdef=None, **kwargs):
114
        super().add_parameters_widgets(form, parameters, prefix=prefix, formdef=formdef, **kwargs)
117 115
        if 'fields' in parameters:
118 116
            form.add(
119 117
                ProfileUpdateTableWidget, '%sfields' % prefix, title=_('Profile Update'), value=self.fields
wcs/wf/redirect_to_url.py
37 37
    def get_parameters(self):
38 38
        return ('url', 'condition')
39 39

  
40
    def add_parameters_widgets(self, form, parameters, prefix='', formdef=None):
41
        super(RedirectToUrlWorkflowStatusItem, self).add_parameters_widgets(
42
            form, parameters, prefix=prefix, formdef=formdef
43
        )
40
    def add_parameters_widgets(self, form, parameters, prefix='', formdef=None, **kwargs):
41
        super().add_parameters_widgets(form, parameters, prefix=prefix, formdef=formdef, **kwargs)
44 42
        if 'url' in parameters:
45 43
            widget = form.add(
46 44
                ComputedExpressionWidget,
wcs/wf/register_comment.py
86 86
    to = None
87 87
    attachments = None
88 88

  
89
    def add_parameters_widgets(self, form, parameters, prefix='', formdef=None):
90
        super(RegisterCommenterWorkflowStatusItem, self).add_parameters_widgets(
91
            form, parameters, prefix=prefix, formdef=formdef
92
        )
89
    def add_parameters_widgets(self, form, parameters, prefix='', formdef=None, **kwargs):
90
        super().add_parameters_widgets(form, parameters, prefix=prefix, formdef=formdef, **kwargs)
93 91
        if 'comment' in parameters:
94 92
            form.add(
95 93
                TextWidget, '%scomment' % prefix, title=_('Message'), value=self.comment, cols=80, rows=10
wcs/wf/resubmit.py
118 118
        if formdata.user_id is None and not new_formdata.backoffice_submission:
119 119
            get_session().mark_anonymous_formdata(new_formdata)
120 120

  
121
    def add_parameters_widgets(self, form, parameters, prefix='', formdef=None):
122
        super(ResubmitWorkflowStatusItem, self).add_parameters_widgets(
123
            form, parameters, prefix=prefix, formdef=formdef
124
        )
121
    def add_parameters_widgets(self, form, parameters, prefix='', formdef=None, **kwargs):
122
        super().add_parameters_widgets(form, parameters, prefix=prefix, formdef=formdef, **kwargs)
125 123
        if 'by' in parameters:
126 124
            form.add(
127 125
                WidgetList,
wcs/wf/roles.py
55 55
    def get_parameters(self):
56 56
        return ('role_id', 'condition')
57 57

  
58
    def add_parameters_widgets(self, form, parameters, prefix='', formdef=None):
59
        super(AddRoleWorkflowStatusItem, self).add_parameters_widgets(
60
            form, parameters, prefix=prefix, formdef=formdef
61
        )
58
    def add_parameters_widgets(self, form, parameters, prefix='', formdef=None, **kwargs):
59
        super().add_parameters_widgets(form, parameters, prefix=prefix, formdef=formdef, **kwargs)
62 60
        if 'role_id' in parameters:
63 61
            form.add(
64 62
                SingleSelectWidgetWithOther,
......
135 133
    def get_parameters(self):
136 134
        return ('role_id', 'condition')
137 135

  
138
    def add_parameters_widgets(self, form, parameters, prefix='', formdef=None):
139
        super(RemoveRoleWorkflowStatusItem, self).add_parameters_widgets(
140
            form, parameters, prefix=prefix, formdef=formdef
141
        )
136
    def add_parameters_widgets(self, form, parameters, prefix='', formdef=None, **kwargs):
137
        super().add_parameters_widgets(form, parameters, prefix=prefix, formdef=formdef, **kwargs)
142 138
        if 'role_id' in parameters:
143 139
            form.add(
144 140
                SingleSelectWidgetWithOther,
wcs/wf/wscall.py
179 179
            'condition',
180 180
        )
181 181

  
182
    def add_parameters_widgets(self, form, parameters, prefix='', formdef=None):
183
        super(WebserviceCallStatusItem, self).add_parameters_widgets(
184
            form, parameters, prefix=prefix, formdef=formdef
185
        )
182
    def add_parameters_widgets(self, form, parameters, prefix='', formdef=None, **kwargs):
183
        super().add_parameters_widgets(form, parameters, prefix=prefix, formdef=formdef, **kwargs)
186 184
        if 'label' in parameters:
187 185
            form.add(StringWidget, '%slabel' % prefix, size=40, title=_('Label'), value=self.label)
188 186

  
wcs/workflows.py
1936 1936
        except RuntimeError:
1937 1937
            return False
1938 1938

  
1939
    def add_parameters_widgets(self, form, parameters, prefix='', formdef=None):
1939
    def add_parameters_widgets(self, form, parameters, prefix='', formdef=None, **kwargs):
1940 1940
        if 'condition' in parameters:
1941 1941
            form.add(
1942 1942
                ConditionWidget,
......
2339 2339
    set_marker_on_status = False
2340 2340
    category = 'status-change'
2341 2341

  
2342
    def add_parameters_widgets(self, form, parameters, prefix='', formdef=None):
2343
        super(WorkflowStatusJumpItem, self).add_parameters_widgets(
2344
            form, parameters, prefix=prefix, formdef=formdef
2345
        )
2342
    def add_parameters_widgets(self, form, parameters, prefix='', formdef=None, **kwargs):
2343
        super().add_parameters_widgets(form, parameters, prefix=prefix, formdef=formdef, **kwargs)
2346 2344
        if 'status' in parameters:
2347 2345
            destinations = [(x.id, x.name) for x in self.parent.parent.possible_status]
2348 2346

  
......
2499 2497
            'condition',
2500 2498
        )
2501 2499

  
2502
    def add_parameters_widgets(self, form, parameters, prefix='', formdef=None):
2503
        super(CommentableWorkflowStatusItem, self).add_parameters_widgets(
2504
            form, parameters, prefix=prefix, formdef=formdef
2505
        )
2500
    def add_parameters_widgets(self, form, parameters, prefix='', formdef=None, **kwargs):
2501
        super().add_parameters_widgets(form, parameters, prefix=prefix, formdef=formdef, **kwargs)
2506 2502
        if 'label' in parameters:
2507 2503
            if self.label is None:
2508 2504
                self.label = _('Comment')
......
2646 2642
                form.clear_errors()
2647 2643
                return True  # get out of processing loop
2648 2644

  
2649
    def add_parameters_widgets(self, form, parameters, prefix='', formdef=None):
2650
        super(ChoiceWorkflowStatusItem, self).add_parameters_widgets(
2651
            form, parameters, prefix=prefix, formdef=formdef
2652
        )
2645
    def add_parameters_widgets(self, form, parameters, prefix='', formdef=None, **kwargs):
2646
        super().add_parameters_widgets(form, parameters, prefix=prefix, formdef=formdef, **kwargs)
2653 2647
        if 'label' in parameters:
2654 2648
            form.add(ComputedExpressionWidget, '%slabel' % prefix, title=_('Label'), value=self.label)
2655 2649
        if 'by' in parameters:
......
2795 2789
    def get_parameters(self):
2796 2790
        return ('to', 'mail_template', 'subject', 'body', 'attachments', 'custom_from', 'condition')
2797 2791

  
2798
    def add_parameters_widgets(self, form, parameters, prefix='', formdef=None):
2799
        super(SendmailWorkflowStatusItem, self).add_parameters_widgets(
2800
            form, parameters, prefix=prefix, formdef=formdef
2801
        )
2792
    def add_parameters_widgets(self, form, parameters, prefix='', formdef=None, **kwargs):
2793
        super().add_parameters_widgets(form, parameters, prefix=prefix, formdef=formdef, **kwargs)
2802 2794
        subject_body_attrs = {}
2803 2795
        if 'subject' in parameters or 'body' in parameters:
2804 2796
            if get_publisher().has_site_option('mail-templates') and MailTemplate.count():
......
3054 3046
    def get_parameters(self):
3055 3047
        return ('to', 'body', 'condition')
3056 3048

  
3057
    def add_parameters_widgets(self, form, parameters, prefix='', formdef=None):
3058
        super(SendSMSWorkflowStatusItem, self).add_parameters_widgets(
3059
            form, parameters, prefix=prefix, formdef=formdef
3060
        )
3049
    def add_parameters_widgets(self, form, parameters, prefix='', formdef=None, **kwargs):
3050
        super().add_parameters_widgets(form, parameters, prefix=prefix, formdef=formdef, **kwargs)
3061 3051
        if 'to' in parameters:
3062 3052
            form.add(
3063 3053
                WidgetList,
......
3147 3137

  
3148 3138
        return Template(message, ezt_format=ezt.FORMAT_HTML).render(dict)
3149 3139

  
3150
    def add_parameters_widgets(self, form, parameters, prefix='', formdef=None):
3151
        super(DisplayMessageWorkflowStatusItem, self).add_parameters_widgets(
3152
            form, parameters, prefix=prefix, formdef=formdef
3153
        )
3140
    def add_parameters_widgets(self, form, parameters, prefix='', formdef=None, **kwargs):
3141
        super().add_parameters_widgets(form, parameters, prefix=prefix, formdef=formdef, **kwargs)
3154 3142
        if 'message' in parameters:
3155 3143
            form.add(
3156 3144
                TextWidget,
......
3223 3211
    def perform(self, formdata):
3224 3212
        return formdata.get_url(self.backoffice)
3225 3213

  
3226
    def add_parameters_widgets(self, form, parameters, prefix='', formdef=None):
3227
        super(RedirectToStatusWorkflowStatusItem, self).add_parameters_widgets(
3228
            form, parameters, prefix=prefix, formdef=formdef
3229
        )
3214
    def add_parameters_widgets(self, form, parameters, prefix='', formdef=None, **kwargs):
3215
        super().add_parameters_widgets(form, parameters, prefix=prefix, formdef=formdef, **kwargs)
3230 3216
        if 'backoffice' in parameters:
3231 3217
            form.add(
3232 3218
                CheckboxWidget,
......
3273 3259
        if form.get_submit() == 'button%s' % self.id:
3274 3260
            return formdata.get_url(backoffice=get_request().is_in_backoffice()) + 'wfedit-%s' % self.id
3275 3261

  
3276
    def add_parameters_widgets(self, form, parameters, prefix='', formdef=None):
3277
        super(EditableWorkflowStatusItem, self).add_parameters_widgets(
3278
            form, parameters, prefix=prefix, formdef=formdef
3279
        )
3262
    def add_parameters_widgets(self, form, parameters, prefix='', formdef=None, **kwargs):
3263
        super().add_parameters_widgets(form, parameters, prefix=prefix, formdef=formdef, **kwargs)
3280 3264
        if 'by' in parameters:
3281 3265
            form.add(
3282 3266
                WidgetList,
3283
-