Projet

Général

Profil

0001-workflows-handle-add-block-buttons-in-display-form-a.patch

Frédéric Péters, 23 février 2021 16:24

Télécharger (5,9 ko)

Voir les différences:

Subject: [PATCH] workflows: handle "add block" buttons in display form action
 (#47898)

 tests/backoffice_pages/test_all.py | 58 ++++++++++++++++++++++++++++++
 wcs/forms/common.py                | 15 +++++---
 wcs/wf/form.py                     |  9 ++++-
 wcs/workflows.py                   |  4 +++
 4 files changed, 80 insertions(+), 6 deletions(-)
tests/backoffice_pages/test_all.py
4232 4232
        ]
4233 4233

  
4234 4234

  
4235
def test_backoffice_workflow_display_form_with_block_add(pub):
4236
    user = create_user(pub)
4237
    create_environment(pub)
4238

  
4239
    block = BlockDef()
4240
    block.name = 'foobar'
4241
    block.fields = [
4242
        fields.StringField(id='123', required=True, label='Test', type='string'),
4243
    ]
4244
    block.store()
4245

  
4246
    wf = Workflow.get_default_workflow()
4247
    wf.id = '2'
4248
    wf.store()
4249
    wf = Workflow.get(wf.id)
4250
    status = wf.get_status('new')
4251
    status.items = []
4252
    display_form = FormWorkflowStatusItem()
4253
    display_form.id = '_display_form'
4254
    display_form.by = [user.roles[0]]
4255
    display_form.varname = 'blah'
4256
    display_form.formdef = WorkflowFormFieldsFormDef(item=display_form)
4257
    display_form.formdef.fields = [
4258
        fields.StringField(id='1', label='Test', varname='str', type='string', required=True),
4259
        fields.BlockField(id='2', label='Blocks', type='block:foobar', varname='data', max_items=3),
4260
    ]
4261
    status.items.append(display_form)
4262
    display_form.parent = status
4263

  
4264
    jump = JumpOnSubmitWorkflowStatusItem()
4265
    jump.id = '_jump'
4266
    jump.status = 'accepted'
4267
    status.items.append(jump)
4268
    jump.parent = status
4269

  
4270
    wf.store()
4271
    formdef = FormDef.get_by_urlname('form-title')
4272
    formdef.workflow_id = wf.id
4273
    formdef.store()
4274

  
4275
    for formdata in formdef.data_class().select():
4276
        if formdata.status == 'wf-new':
4277
            break
4278
    app = login(get_app(pub))
4279
    resp = app.get(formdata.get_url(backoffice=True))
4280
    resp.form['fblah_1'] = 'blah'
4281
    resp.form['fblah_2$element0$f123'] = 'foo'
4282
    resp = resp.form.submit('fblah_2$add_element')
4283
    resp.form['fblah_2$element1$f123'] = 'bar'
4284
    resp = resp.form.submit('submit')
4285

  
4286
    assert formdef.data_class().get(formdata.id).workflow_data == {
4287
        'blah_var_data': 'foobar, foobar',
4288
        'blah_var_data_raw': {'data': [{'123': 'foo'}, {'123': 'bar'}], 'schema': {'123': 'string'}},
4289
        'blah_var_str': 'blah',
4290
    }
4291

  
4292

  
4235 4293
def test_backoffice_criticality_in_formdef_listing(pub):
4236 4294
    if not pub.is_using_postgresql():
4237 4295
        pytest.skip('this requires SQL')
wcs/forms/common.py
26 26
from wcs import data_sources
27 27
from wcs.api_utils import get_user_from_api_query_string, is_url_signed, sign_url_auto_orig
28 28
from wcs.fields import WidgetField, FileField
29
from wcs.workflows import EditableWorkflowStatusItem
29
from wcs.workflows import EditableWorkflowStatusItem, RedisplayFormException
30 30

  
31 31
from ..qommon import _
32 32
from ..qommon import misc
......
547 547

  
548 548
        user = self.check_receiver()
549 549
        form = self.get_workflow_form(user)
550
        response = self.check_submitted_form(form)
551
        if response:
552
            get_session().unmark_visited_object(self.filled)
553
            return response
550
        try:
551
            response = self.check_submitted_form(form)
552
        except RedisplayFormException:
553
            # don't display errors after "add block" button has been clicked.
554
            form.clear_errors()
555
        else:
556
            if response:
557
                get_session().unmark_visited_object(self.filled)
558
                return response
554 559

  
555 560
        get_logger().info('form %s - id: %s - view status' % (self.formdef.name, self.filled.id))
556 561
        get_response().add_javascript(['jquery.js', 'qommon.forms.js'])
wcs/wf/form.py
19 19
from ..qommon import _, N_
20 20
from ..qommon.form import *
21 21

  
22
from wcs.workflows import WorkflowStatusItem, register_item_class
22
from wcs.workflows import WorkflowStatusItem, register_item_class, RedisplayFormException
23 23
from wcs.formdef import FormDef, lax_int
24 24

  
25 25
from wcs.admin.fields import FieldDefPage, FieldsDirectory
......
244 244
    def submit_form(self, form, formdata, user, evo):
245 245
        if not self.formdef:
246 246
            return
247
        if form.get_submit() is True:
248
            # non-submit button, maybe a "add block" button, look for them.
249
            for widget in form.widgets:
250
                if isinstance(widget, WidgetList):  # BlockWidget
251
                    add_element_widget = widget.get_widget('add_element')
252
                    if add_element_widget and add_element_widget.parse():
253
                        raise RedisplayFormException()
247 254
        if form.get_submit() == 'submit' and not form.has_errors():
248 255
            self.evaluate_live_form(form, formdata, user)
249 256
            formdata.store()
wcs/workflows.py
104 104
    pass
105 105

  
106 106

  
107
class RedisplayFormException(Exception):
108
    pass
109

  
110

  
107 111
class AttachmentSubstitutionProxy(object):
108 112
    def __init__(self, formdata, attachment_evolution_part):
109 113
        self.formdata = formdata
110
-