0001-formdef-check-datasources-are-defined-on-import-9173.patch
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 |
- |