Projet

Général

Profil

0001-forms-add-an-explicit-discard-button-instead-of-canc.patch

Frédéric Péters, 03 juin 2019 16:41

Télécharger (7,06 ko)

Voir les différences:

Subject: [PATCH] forms: add an explicit discard button (instead of "cancel")
 (#33026)

 tests/test_form_pages.py | 98 ++++++++++++++++++++++++++++++++++++++++
 wcs/forms/root.py        | 22 +++++++--
 2 files changed, 116 insertions(+), 4 deletions(-)
tests/test_form_pages.py
1633 1633
    assert resp.location == 'http://example.net/'
1634 1634
    assert formdef.data_class().count() == 0
1635 1635

  
1636
def test_form_discard_draft(pub):
1637
    user = create_user(pub)
1638

  
1639
    formdef = create_formdef()
1640
    formdef.fields = [fields.StringField(id='0', label='string')]
1641
    formdef.enable_tracking_codes = False
1642
    formdef.store()
1643
    formdef.data_class().wipe()
1644

  
1645
    # anonymous user, no tracking code (-> no draft)
1646
    app = get_app(pub)
1647
    resp = app.get('/test/')
1648
    resp.form['f0'] = 'foobar'
1649
    resp = resp.form.submit('submit')
1650
    resp = resp.form.submit('previous')
1651
    assert [x.status for x in formdef.data_class().select()] == []
1652
    assert 'Cancel' in resp.body
1653
    assert 'Discard' not in resp.body
1654
    resp = resp.form.submit('cancel')
1655

  
1656
    # anonymous user, tracking code (-> draft)
1657
    formdef.enable_tracking_codes = True
1658
    formdef.store()
1659
    app = get_app(pub)
1660
    resp = app.get('/test/')
1661
    resp.form['f0'] = 'foobar'
1662
    resp = resp.form.submit('submit')
1663
    resp = resp.form.submit('previous')
1664
    assert [x.status for x in formdef.data_class().select()] == ['draft']
1665
    assert 'Cancel' not in resp.body
1666
    assert 'Discard' in resp.body
1667
    resp = resp.form.submit('cancel')
1668
    assert [x.status for x in formdef.data_class().select()] == []  # discarded
1669

  
1670
    # logged-in user, no tracking code
1671
    formdef.enable_tracking_codes = False
1672
    formdef.store()
1673
    resp = login(get_app(pub), username='foo', password='foo').get('/test/')
1674
    resp.form['f0'] = 'foobar'
1675
    resp = resp.form.submit('submit')
1676
    resp = resp.form.submit('previous')
1677
    assert [x.status for x in formdef.data_class().select()] == ['draft']
1678
    assert 'Cancel' not in resp.body
1679
    assert 'Discard' in resp.body
1680
    resp = resp.form.submit('cancel')
1681
    assert [x.status for x in formdef.data_class().select()] == []  # discarded
1682

  
1683
    # logged-in user, tracking code
1684
    formdef.enable_tracking_codes = True
1685
    formdef.store()
1686
    resp = login(get_app(pub), username='foo', password='foo').get('/test/')
1687
    resp.form['f0'] = 'foobar'
1688
    resp = resp.form.submit('submit')
1689
    resp = resp.form.submit('previous')
1690
    assert [x.status for x in formdef.data_class().select()] == ['draft']
1691
    assert 'Cancel' not in resp.body
1692
    assert 'Discard' in resp.body
1693
    resp = resp.form.submit('cancel')
1694
    assert [x.status for x in formdef.data_class().select()] == []  # discarded
1695

  
1696
    # anonymous user, tracking code, recalled
1697
    formdef.enable_tracking_codes = True
1698
    formdef.store()
1699
    app = get_app(pub)
1700
    resp = app.get('/test/')
1701
    resp.form['f0'] = 'foobar'
1702
    resp = resp.form.submit('submit')
1703
    resp = resp.form.submit('previous')
1704
    assert [x.status for x in formdef.data_class().select()] == ['draft']
1705
    assert 'Cancel' not in resp.body
1706
    assert 'Discard' in resp.body
1707
    tracking_code = get_displayed_tracking_code(resp)
1708

  
1709
    resp = get_app(pub).get('/')
1710
    resp.form['code'] = tracking_code
1711
    resp = resp.form.submit().follow().follow().follow()
1712
    assert resp.forms[1]['f0'].value == 'foobar'
1713
    assert 'Cancel' in resp.body
1714
    assert 'Discard Draft' in resp.body
1715
    resp = resp.forms[1].submit('cancel')
1716
    assert [x.status for x in formdef.data_class().select()] == ['draft']
1717

  
1718
    # logged-in user, no tracking code, recalled
1719
    formdef.data_class().wipe()
1720
    formdef.enable_tracking_codes = False
1721
    formdef.store()
1722
    resp = login(get_app(pub), username='foo', password='foo').get('/test/')
1723
    resp.form['f0'] = 'foobar'
1724
    resp = resp.form.submit('submit')
1725
    resp = resp.form.submit('previous')
1726
    assert [x.status for x in formdef.data_class().select()] == ['draft']
1727
    resp = login(get_app(pub), username='foo', password='foo').get('/test/')
1728
    resp = resp.click('Continue with draft').follow()
1729
    assert 'Cancel' in resp.body
1730
    assert 'Discard Draft' in resp.body
1731
    resp = resp.forms[1].submit('cancel')
1732
    assert [x.status for x in formdef.data_class().select()] == ['draft']
1733

  
1636 1734
def test_form_invalid_tracking_code(pub):
1637 1735
    formdef = create_formdef()
1638 1736
    formdef.fields = [fields.StringField(id='0', label='string')]
wcs/forms/root.py
419 419
        if page:
420 420
            form.add_hidden('page_id', page.id)
421 421

  
422
        form.add_submit('cancel', _('Cancel'), css_class = 'cancel')
422
        cancel_label = _('Cancel')
423
        if self.has_draft_support() and not (data and data.get('is_recalled_draft')):
424
            cancel_label = _('Discard')
425
        form.add_submit('cancel', cancel_label, css_class='cancel')
426

  
423 427
        if self.has_draft_support():
424
            form.add_submit('savedraft', _('Save Draft'), css_class = 'save-draft',
428
            form.add_submit('savedraft', _('Save Draft'), css_class='save-draft',
425 429
                    attrs={'style': 'display: none'})
426 430

  
427 431
        context = {
......
479 483
        if data.get('is_recalled_draft'):
480 484
            r += htmltext('<form action="removedraft" method="POST">')
481 485
            r += htmltext('<input type="hidden" name="magictoken" value="%s">') % magictoken
482
            r += htmltext('<button>%s</button>') % _('Remove Draft')
486
            r += htmltext('<button>%s</button>') % _('Discard Draft')
483 487
            r += htmltext('</form>')
484 488

  
485 489
        text = r.getvalue()
......
703 707
            get_logger().info('form %s - cancel' % (self.formdef.name))
704 708
            if self.edit_mode:
705 709
                return redirect('.')
710
            magictoken = form.get_widget('magictoken').parse()
711
            if self.has_draft_support():
712
                current_draft = self.get_current_draft()
713
                if current_draft:
714
                    discard_draft = True
715
                    if magictoken:
716
                        data = session.get_by_magictoken(magictoken, {})
717
                        if data.get('is_recalled_draft'):
718
                            discard_draft = False
719
                    if discard_draft:
720
                        current_draft.remove_self()
706 721
            try:
707
                magictoken = form.get_widget('magictoken').parse()
708 722
                cancelurl = session.get_by_magictoken(magictoken, {}).get('__cancelurl')
709 723
                if cancelurl:
710 724
                    return redirect(cancelurl)
711
-