Projet

Général

Profil

0001-workflows-add-option-to-hide-submit-button-of-form-a.patch

Frédéric Péters, 09 septembre 2022 15:46

Télécharger (5,56 ko)

Voir les différences:

Subject: [PATCH] workflows: add option to hide submit button of form action
 (#65324)

 tests/workflow/test_all.py | 74 ++++++++++++++++++++++++++++++++++++++
 wcs/wf/form.py             | 18 ++++++++--
 2 files changed, 89 insertions(+), 3 deletions(-)
tests/workflow/test_all.py
2912 2912
    assert wf.possible_status[0].items[0].formdef.fields[0].display_mode == 'radio'
2913 2913

  
2914 2914

  
2915
def test_display_form_hide_submit_button(pub):
2916
    wf = Workflow(name='test')
2917
    st1 = wf.add_status('Status1', 'st1')
2918
    st2 = wf.add_status('Status2', 'st2')
2919

  
2920
    display_form = st1.add_action('form', id='_x')
2921
    display_form.varname = 'xxx'
2922
    display_form.by = ['_submitter']
2923
    display_form.formdef = WorkflowFormFieldsFormDef(item=display_form)
2924
    display_form.formdef.fields.append(StringField(id='1', label='Test', varname='test', type='string'))
2925

  
2926
    wf.store()
2927

  
2928
    formdef = FormDef()
2929
    formdef.name = 'baz'
2930
    formdef.fields = []
2931
    formdef.workflow = wf
2932
    formdef.store()
2933

  
2934
    formdef.data_class().wipe()
2935

  
2936
    app = get_app(pub)
2937
    resp = app.get(formdef.get_url())
2938
    resp = resp.form.submit(name='submit')  # -> validation
2939
    resp = resp.form.submit(name='submit')  # -> submission
2940
    resp = resp.follow()
2941
    assert resp.pyquery('#wf-actions button')
2942
    formdata = formdef.data_class().select()[0]
2943

  
2944
    display_form.hide_submit_button = True
2945
    wf.store()
2946
    resp = app.get(resp.request.path)
2947
    assert not resp.pyquery('#wf-actions button')
2948

  
2949
    button = st1.add_action('choice')
2950
    button.label = 'button'
2951
    button.by = ['_submitter']
2952
    button.status = st2.id
2953
    wf.store()
2954

  
2955
    resp = app.get(resp.request.path)
2956
    assert resp.pyquery('#wf-actions button')
2957
    resp.form['fxxx_1'] = 'plop'
2958
    resp = resp.form.submit(resp.pyquery('#wf-actions button').attr.name)
2959

  
2960
    formdata.refresh_from_storage()
2961
    assert formdata.get_status().id == st2.id
2962

  
2963
    pub.substitutions.feed(formdata)
2964
    context = pub.substitutions.get_context_variables(mode='lazy')
2965
    assert context['form_workflow_form_xxx_var_test'] == 'plop'
2966

  
2967
    # try with button that do not record form
2968
    formdef.data_class().wipe()
2969
    button.ignore_form_errors = True
2970
    wf.store()
2971

  
2972
    resp = app.get(formdef.get_url())
2973
    resp = resp.form.submit(name='submit')  # -> validation
2974
    resp = resp.form.submit(name='submit')  # -> submission
2975
    resp = resp.follow()
2976
    resp.form['fxxx_1'] = 'plop'
2977
    resp = resp.form.submit(resp.pyquery('#wf-actions button').attr.name)
2978
    formdata = formdef.data_class().select()[0]
2979
    assert formdata.get_status().id == st2.id
2980

  
2981
    pub.substitutions.reset()
2982
    pub.substitutions.feed(formdata)
2983
    context = pub.substitutions.get_context_variables(mode='lazy')
2984
    with pytest.raises(KeyError):
2985
        # check workflow form was not recorded
2986
        assert context['form_workflow_form_xxx_var_test']
2987

  
2988

  
2915 2989
def test_choice_button_no_label(pub):
2916 2990
    role = pub.role_class(name='bar1')
2917 2991
    role.store()
wcs/wf/form.py
29 29
from wcs.workflows import EvolutionPart, RedisplayFormException, WorkflowStatusItem, register_item_class
30 30

  
31 31
from ..qommon import _
32
from ..qommon.form import HtmlWidget, SingleSelectWidget, VarnameWidget, WidgetList
32
from ..qommon.form import CheckboxWidget, HtmlWidget, SingleSelectWidget, VarnameWidget, WidgetList
33 33

  
34 34

  
35 35
class WorkflowFormEvolutionPart(EvolutionPart):
......
119 119
    by = []
120 120
    formdef = None
121 121
    varname = None
122
    hide_submit_button = False
122 123

  
123 124
    @property
124 125
    def submit_button_label(self):
......
154 155
                    'options': [(None, '---', None)] + self.get_list_of_roles(include_logged_in_users=False),
155 156
                },
156 157
            )
158
        if 'hide_submit_button' in parameters:
159
            form.add(
160
                CheckboxWidget,
161
                '%shide_submit_button' % prefix,
162
                title=_('Hide Submit Button'),
163
                value=self.hide_submit_button,
164
                hint=_(
165
                    'If the default submit button is hidden the form will only be submitted through manual jump buttons.'
166
                ),
167
                advanced=True,
168
            )
157 169
        if 'varname' in parameters:
158 170
            form.add(
159 171
                VarnameWidget,
......
173 185
                form.widgets.append(widget)
174 186

  
175 187
    def get_parameters(self):
176
        return ('by', 'varname', 'condition')
188
        return ('by', 'varname', 'hide_submit_button', 'condition')
177 189

  
178 190
    def clean_varname(self, form):
179 191
        widget = form.get_widget('varname')
......
264 276
        ]
265 277

  
266 278
        self.formdef.add_fields_to_form(form, displayed_fields=displayed_fields)
267
        if 'submit' not in form._names:
279
        if 'submit' not in form._names and not self.hide_submit_button:
268 280
            form.add_submit('submit', _('Submit'))
269 281

  
270 282
        # put varname in a form attribute so it can be used in templates to
271
-