Projet

Général

Profil

0001-ods-remove-invalid-XML-characters-from-ODS-export-31.patch

Frédéric Péters, 22 mars 2019 10:01

Télécharger (3,06 ko)

Voir les différences:

Subject: [PATCH] ods: remove invalid XML characters from ODS export (#31640)

 tests/test_backoffice_pages.py | 5 +++++
 wcs/qommon/ods.py              | 7 +++++++
 2 files changed, 12 insertions(+)
tests/test_backoffice_pages.py
880 880
    formdef.fields.append(fields.StringField(id='6', label='number field', type='string', in_listing=True))
881 881
    formdef.fields.append(fields.StringField(id='7', label='phone field', type='string', in_listing=True))
882 882
    formdef.fields.append(fields.DateField(id='8', label='very old field', type='date', in_listing=True))
883
    formdef.fields.append(fields.StringField(id='9', label='string field', type='string', in_listing=True))
883 884
    formdef.store()
884 885

  
885 886
    formdata = formdef.data_class().select(lambda x: x.status == 'wf-new')[0]
......
889 890
    formdata.data['6'] = '12345'
890 891
    formdata.data['7'] = '0102030405'
891 892
    formdata.data['8'] = time.strptime('1871-03-18', '%Y-%m-%d')
893
    formdata.data['9'] = 'plop\npl\x1dop'  # with control characters
892 894
    formdata.store()
893 895

  
894 896
    resp = app.get('/backoffice/management/form-title/')
......
911 913
    number_column = all_texts.index('number field')
912 914
    phone_column = all_texts.index('phone field')
913 915
    old_column = all_texts.index('very old field')
916
    string_column = all_texts.index('string field')
914 917

  
915 918
    for row in ods_sheet.findall('.//{%s}table-row' % ods.NS['table']):
916 919
        if row.findall('.//{%s}table-cell/{%s}p' % (
......
937 940
            '{%s}value-type' % ods.NS['office']] == 'date'
938 941
    assert row.findall('.//{%s}table-cell' % ods.NS['table'])[old_column].attrib[
939 942
            '{%s}date-value' % ods.NS['office']] == '1871-03-18'
943
    assert row.findall('.//{%s}table-cell' % ods.NS['table'])[
944
            string_column].find('{%s}p' % ods.NS['text']).text == 'plop\nplop'
940 945

  
941 946
@pytest.mark.skipif('xlwt is None')
942 947
def test_backoffice_xls(pub):
wcs/qommon/ods.py
170 170
        if type(value) is not unicode:
171 171
            value = unicode(value, 'utf-8')
172 172
        self.worksheet = worksheet
173
        for i in range(0x20):  # remove control characters
174
            char = chr(i)
175
            if char in ('\t', '\r', '\n'):
176
                # only allow tab, carriage return and line feed.
177
                continue
178
            value = value.replace(char, '')
179
        value = value.replace('\ufffe', '\uffff')  # fffe and ffff are also invalid characters
173 180
        self.value = value
174 181
        self.formdata = formdata
175 182
        self.data_field = data_field
176
-