Projet

Général

Profil

0001-formdef-check-datasources-are-defined-on-import-9173.patch

Frédéric Péters, 02 décembre 2015 12:50

Télécharger (4,14 ko)

Voir les différences:

Subject: [PATCH 1/3] formdef: check datasources are defined on import (#9173)

 tests/test_formdef_import.py | 18 +++++++++++++++++-
 wcs/admin/forms.py           |  8 ++++++--
 wcs/formdef.py               | 22 ++++++++++++++++++++--
 3 files changed, 43 insertions(+), 5 deletions(-)
tests/test_formdef_import.py
1 1
# -*- coding: utf-8 -*-
2 2

  
3
import pytest
3 4
import sys
4 5
import shutil
5 6
import StringIO
......
9 10
from quixote import cleanup
10 11

  
11 12
from wcs.categories import Category
12
from wcs.formdef import FormDef, fields
13
from wcs.formdef import FormDef, fields, FormdefImportError
13 14
from wcs.workflows import Workflow
14 15
from qommon.misc import indent_xml as indent
15 16

  
......
241 242
    assert_xml_import_export_works(formdef)
242 243
    assert_json_import_export_works(formdef, include_id=True)
243 244
    assert_json_import_export_works(formdef)
245

  
246
def test_unknown_data_source():
247
    formdef = FormDef()
248
    formdef.name = 'foo'
249
    formdef.fields = [fields.StringField(id='1', type='string',
250
        data_source={'type': 'json', 'value': 'http://example.net'})]
251
    export = ET.tostring(export_to_indented_xml(formdef))
252

  
253
    FormDef.import_from_xml(StringIO.StringIO(export))
254

  
255
    formdef.fields = [fields.StringField(id='1', type='string',
256
        data_source={'type': 'foobar'})]
257
    export = ET.tostring(export_to_indented_xml(formdef))
258
    with pytest.raises(FormdefImportError):
259
        FormDef.import_from_xml(StringIO.StringIO(export))
wcs/admin/forms.py
846 846
            new_formdef = FormDef.import_from_xml(fp, include_id=True)
847 847
        except FormdefImportError, e:
848 848
            error = True
849
            reason = _(e)
849
            reason = _(e.msg)
850
            if e.details:
851
                reason += ' [%s]' % e.details
850 852
        except ValueError:
851 853
            error = True
852 854

  
......
1592 1594
            formdef = FormDef.import_from_xml(fp)
1593 1595
        except FormdefImportError, e:
1594 1596
            error = True
1595
            reason = _(e)
1597
            reason = _(e.msg)
1598
            if e.details:
1599
                reason += ' [%s]' % e.details
1596 1600
        except ValueError:
1597 1601
            error = True
1598 1602

  
wcs/formdef.py
34 34
from roles import logged_users_role
35 35
from categories import Category
36 36
import fields
37
import data_sources
37 38

  
38 39

  
39 40
class FormdefImportError(Exception):
40
    pass
41
    def __init__(self, msg, details=None):
42
        self.msg = msg
43
        self.details = details
41 44

  
42 45

  
43 46
class FormField(object):
......
683 686
            tree = ET.parse(fd)
684 687
        except:
685 688
            raise ValueError()
686
        return cls.import_from_xml_tree(tree, charset=charset,
689
        formdef = cls.import_from_xml_tree(tree, charset=charset,
687 690
                include_id=include_id)
691

  
692
        # check if datasources are defined
693
        unknown_datasources = set()
694
        for field in formdef.fields:
695
            data_source = getattr(field, 'data_source', None)
696
            if data_source:
697
                try:
698
                    data_sources.get_real(data_source)
699
                except KeyError:
700
                    unknown_datasources.add(data_source.get('type'))
701
        if unknown_datasources:
702
            raise FormdefImportError(N_('Unknown datasources'),
703
                    details=', '.join(sorted(unknown_datasources)))
704

  
705
        return formdef
688 706
    import_from_xml = classmethod(import_from_xml)
689 707

  
690 708
    def import_from_xml_tree(cls, tree, include_id=False, charset=None):
691
-