Projet

Général

Profil

0001-form-fix-handling-of-various-optional-fields-8878.patch

Frédéric Péters, 05 novembre 2015 11:19

Télécharger (6,66 ko)

Voir les différences:

Subject: [PATCH] form: fix handling of various optional fields (#8878)

Fallout from #8862 there are various places where "value is None" should not be
used as a test for the empty value as it can now also be represented as an
empty string.
 tests/test_form_pages.py | 108 +++++++++++++++++++++++++++++++++++++++++++++++
 wcs/qommon/form.py       |   8 ++--
 2 files changed, 113 insertions(+), 3 deletions(-)
tests/test_form_pages.py
3 3
import os
4 4
import re
5 5
import StringIO
6
import time
6 7
import zipfile
7 8
from webtest import Upload
8 9

  
......
1505 1506

  
1506 1507
    resp = login(get_app(pub), username='foo', password='foo').get('/test/')
1507 1508
    assert resp.forms[0]['f0'].value == 'foo@localhost'
1509

  
1510
def test_form_date_field_submit(pub):
1511
    formdef = create_formdef()
1512
    formdef.fields = [fields.DateField(id='0', label='string', type='date',
1513
        required=False)]
1514
    formdef.store()
1515
    resp = get_app(pub).get('/test/')
1516
    formdef.data_class().wipe()
1517
    resp.forms[0]['f0'] = '2015-01-01'
1518
    resp = resp.forms[0].submit('submit')
1519
    assert 'Check values then click submit.' in resp.body
1520
    resp = resp.forms[0].submit('submit')
1521
    assert resp.status_int == 302
1522
    resp = resp.follow()
1523
    assert 'The form has been recorded' in resp.body
1524
    assert formdef.data_class().count() == 1
1525
    data_id = formdef.data_class().select()[0].id
1526
    data = formdef.data_class().get(data_id)
1527
    assert time.strftime('%Y-%m-%d', data.data['0']) == '2015-01-01'
1528

  
1529
    # without filling the field
1530
    resp = get_app(pub).get('/test/')
1531
    formdef.data_class().wipe()
1532
    resp = resp.forms[0].submit('submit')
1533
    assert 'Check values then click submit.' in resp.body
1534
    resp = resp.forms[0].submit('submit')
1535
    assert resp.status_int == 302
1536
    resp = resp.follow()
1537
    assert 'The form has been recorded' in resp.body
1538
    assert formdef.data_class().count() == 1
1539
    data_id = formdef.data_class().select()[0].id
1540
    data = formdef.data_class().get(data_id)
1541
    assert data.data['0'] is None
1542

  
1543
def test_form_string_regex_field_submit(pub):
1544
    formdef = create_formdef()
1545
    formdef.fields = [fields.StringField(id='0', label='string', type='string',
1546
        validation=r'\d{5}$', required=False)]
1547
    formdef.store()
1548

  
1549
    formdef.data_class().wipe()
1550
    resp = get_app(pub).get('/test/')
1551
    resp.forms[0]['f0'] = '12345'
1552
    resp = resp.forms[0].submit('submit')
1553
    assert 'Check values then click submit.' in resp.body
1554
    resp = resp.forms[0].submit('submit')
1555
    assert resp.status_int == 302
1556
    resp = resp.follow()
1557
    assert 'The form has been recorded' in resp.body
1558
    assert formdef.data_class().count() == 1
1559
    data_id = formdef.data_class().select()[0].id
1560
    data = formdef.data_class().get(data_id)
1561
    assert data.data['0'] == '12345'
1562

  
1563
    # without filling the field
1564
    formdef.data_class().wipe()
1565
    resp = get_app(pub).get('/test/')
1566
    resp = resp.forms[0].submit('submit')
1567
    assert 'Check values then click submit.' in resp.body
1568
    resp = resp.forms[0].submit('submit')
1569
    assert resp.status_int == 302
1570
    resp = resp.follow()
1571
    assert 'The form has been recorded' in resp.body
1572
    assert formdef.data_class().count() == 1
1573
    data_id = formdef.data_class().select()[0].id
1574
    data = formdef.data_class().get(data_id)
1575
    assert data.data['0'] == ''
1576

  
1577
    # with an invalid input
1578
    formdef.data_class().wipe()
1579
    resp = get_app(pub).get('/test/')
1580
    resp.forms[0]['f0'] = 'foobar'
1581
    resp = resp.forms[0].submit('submit')
1582
    assert 'wrong format' in resp.body
1583

  
1584
def test_form_text_field_submit(pub):
1585
    formdef = create_formdef()
1586
    formdef.fields = [fields.TextField(id='0', label='string', type='text', required=False)]
1587
    formdef.store()
1588

  
1589
    formdef.data_class().wipe()
1590
    resp = get_app(pub).get('/test/')
1591
    resp.forms[0]['f0'] = '12345'
1592
    resp = resp.forms[0].submit('submit')
1593
    assert 'Check values then click submit.' in resp.body
1594
    resp = resp.forms[0].submit('submit')
1595
    assert resp.status_int == 302
1596
    resp = resp.follow()
1597
    assert 'The form has been recorded' in resp.body
1598
    assert formdef.data_class().count() == 1
1599
    data_id = formdef.data_class().select()[0].id
1600
    data = formdef.data_class().get(data_id)
1601
    assert data.data['0'] == '12345'
1602

  
1603
    # without filling the field
1604
    formdef.data_class().wipe()
1605
    resp = get_app(pub).get('/test/')
1606
    resp = resp.forms[0].submit('submit')
1607
    assert 'Check values then click submit.' in resp.body
1608
    resp = resp.forms[0].submit('submit')
1609
    assert resp.status_int == 302
1610
    resp = resp.follow()
1611
    assert 'The form has been recorded' in resp.body
1612
    assert formdef.data_class().count() == 1
1613
    data_id = formdef.data_class().select()[0].id
1614
    data = formdef.data_class().get(data_id)
1615
    assert data.data['0'] is None
wcs/qommon/form.py
450 450
class TextWidget(quixote.form.TextWidget):
451 451
    def _parse(self, request):
452 452
        quixote.form.TextWidget._parse(self, request)
453
        if self.value is not None:
453
        if self.value:
454 454
            try:
455 455
                maxlength = int(self.attrs.get('maxlength', 0))
456 456
            except (TypeError, ValueError):
......
784 784

  
785 785
    def _parse(self, request):
786 786
        StringWidget._parse(self, request)
787
        if self.field and self.field.validation and self.value is not None:
787
        if self.field and self.field.validation and self.value:
788 788
            if not re.match(self.field.validation, self.value):
789 789
                self.error = _('wrong format')
790 790

  
......
835 835
        StringWidget.parse(self, request=request)
836 836
        if type(self.value) is unicode:
837 837
            self.value = self.value.encode(get_publisher().site_charset)
838
        if not self.value:
839
            self.value = None
838 840
        return self.value
839 841

  
840 842
    @classmethod
......
1220 1222

  
1221 1223
    def _parse(self, request):
1222 1224
        StringWidget._parse(self, request)
1223
        if self.value is not None:
1225
        if self.value:
1224 1226
            self.value = [x.strip() for x in self.value.split(',') if x.strip()]
1225 1227

  
1226 1228
    def render_content(self):
1227
-