Projet

Général

Profil

0001-blocks-reset-block-errors-when-subwidget-is-prefille.patch

Frédéric Péters, 19 janvier 2021 13:52

Télécharger (2,83 ko)

Voir les différences:

Subject: [PATCH] blocks: reset block errors when subwidget is prefilled
 (#48453)

 tests/form_pages/test_block.py |  1 +
 wcs/blocks.py                  |  5 +++++
 wcs/forms/root.py              | 10 ++++++++++
 3 files changed, 16 insertions(+)
tests/form_pages/test_block.py
412 412
    resp = app.get(formdef.get_url())
413 413
    resp.form['f1'] = 'Hello'
414 414
    resp = resp.form.submit('submit')  # -> 2nd page
415
    assert not resp.pyquery('#form_error_f3')  # not marked as error
415 416
    assert resp.form['f3$element0$f123'].value == 'Hello World'
416 417
    resp = resp.form.submit('submit')  # -> validation page
417 418
    resp = resp.form.submit('submit')  # -> end page
wcs/blocks.py
284 284
            # database in JSON.
285 285
            self.value['schema'] = {x.id: x.key for x in self.block.fields}
286 286

  
287
    def unparse(self):
288
        self._parsed = False
289
        for widget in self.widgets:
290
            widget._parsed = False
291

  
287 292
    def parse(self, request=None):
288 293
        if not self._parsed:
289 294
            self._parsed = True
wcs/forms/root.py
384 384
                    v = field.convert_value_to_str(v)
385 385
                widget.set_value(v)
386 386
                widget.transfer_form_value(req)
387

  
388
                if block:
389
                    # reset parent block if subwidget has changed; this
390
                    # prevents "required field" to be displayed on fields that
391
                    # have just been prefilled.
392
                    form.get_widget('f%s' % block.id).unparse()
393
                    form.get_widget('f%s' % block.id).clear_error()
394

  
387 395
                if field.type == 'item' and v and widget.value != v:
388 396
                    # mark field as invalid if the value was not accepted
389 397
                    # (this is required by quixote>=3 as the value would
390 398
                    # not be evaluated in the initial GET request of the
391 399
                    # page).
392 400
                    widget.set_error(get_selection_error_text())
401

  
393 402
                if locked:
394 403
                    widget.readonly = 'readonly'
395 404
                    widget.attrs['readonly'] = 'readonly'
405

  
396 406
                had_prefill = True
397 407
        return had_prefill
398 408

  
399
-