wcs/tests/test_formdef_import.py

813 lines
29 KiB
Python

# -*- coding: utf-8 -*-
import io
import shutil
import time
import xml.etree.ElementTree as ET
import pytest
from quixote import cleanup
from utilities import create_temporary_pub
from wcs.carddef import CardDef
from wcs.categories import Category
from wcs.formdef import FormDef, FormdefImportError, fields
from wcs.qommon.misc import indent_xml as indent
from wcs.workflows import Workflow
def setup_module(module):
cleanup()
global pub
pub = create_temporary_pub()
def teardown_module(module):
shutil.rmtree(pub.APP_DIR)
def export_to_indented_xml(formdef, include_id=False):
formdef_xml = ET.fromstring(ET.tostring(formdef.export_to_xml(include_id=include_id)))
indent(formdef_xml)
return formdef_xml
def assert_compare_formdef(formdef1, formdef2, include_id=False):
assert ET.tostring(export_to_indented_xml(formdef1, include_id=include_id)) == ET.tostring(
export_to_indented_xml(formdef2, include_id=include_id)
)
assert formdef1.export_to_json(include_id=include_id, indent=2) == formdef2.export_to_json(
include_id=include_id, indent=2
)
def assert_xml_import_export_works(formdef, include_id=False):
formdef_xml = formdef.export_to_xml(include_id=include_id)
formdef2 = FormDef.import_from_xml_tree(formdef_xml, include_id=include_id)
assert_compare_formdef(formdef, formdef2, include_id=include_id)
return formdef2
def assert_json_import_export_works(formdef, include_id=False):
formdef2 = FormDef.import_from_json(
io.StringIO(formdef.export_to_json(include_id=include_id)), include_id=include_id
)
assert_compare_formdef(formdef, formdef2, include_id=include_id)
return formdef2
def test_empty():
formdef = FormDef()
formdef.name = 'empty'
assert_xml_import_export_works(formdef)
assert_json_import_export_works(formdef)
def test_text_attributes():
formdef = FormDef()
formdef.name = 'Foo'
formdef.url_name = 'foo'
f2 = assert_xml_import_export_works(formdef)
assert f2.url_name == formdef.url_name
f2 = assert_json_import_export_works(formdef)
assert f2.url_name == formdef.url_name
def test_empty_description_tag():
formdef = FormDef()
formdef.name = 'empty'
assert_xml_import_export_works(formdef)
export = ET.tostring(export_to_indented_xml(formdef))
# add empty description tag
export = export.replace(b'<name>empty</name>', b'<name>empty</name><description></description>')
formdef2 = FormDef.import_from_xml_tree(ET.fromstring(export))
assert not formdef2.description
def test_empty_display_locations_tag():
formdef = FormDef()
formdef.name = 'Foo'
formdef.fields = [
fields.TitleField(type='title', label='title', display_locations=[]),
fields.SubtitleField(type='subtitle', label='subtitle', display_locations=[]),
fields.TextField(type='text', label='string', display_locations=[]),
]
formdef_xml = formdef.export_to_xml()
f1 = formdef_xml.findall('fields/field')[0]
f2 = formdef_xml.findall('fields/field')[1]
f3 = formdef_xml.findall('fields/field')[2]
assert '<display_locations />' in str(ET.tostring(f1))
assert '<display_locations />' in str(ET.tostring(f2))
assert '<display_locations />' in str(ET.tostring(f3))
formdef2 = assert_xml_import_export_works(formdef)
assert formdef2.fields[0].display_locations == []
assert formdef2.fields[1].display_locations == []
assert formdef2.fields[2].display_locations == []
formdef2_xml = formdef2.export_to_xml()
f1 = formdef2_xml.findall('fields/field')[0]
f2 = formdef2_xml.findall('fields/field')[1]
f3 = formdef2_xml.findall('fields/field')[2]
assert '<display_locations />' in str(ET.tostring(f1))
assert '<display_locations />' in str(ET.tostring(f2))
assert '<display_locations />' in str(ET.tostring(f3))
def test_boolean_attributes():
formdef = FormDef()
formdef.name = 'Foo'
formdef.url_name = 'foo'
formdef.confirmation = True
formdef.enable_tracking_codes = True
f2 = assert_xml_import_export_works(formdef)
assert f2.enable_tracking_codes == formdef.enable_tracking_codes
assert f2.confirmation == formdef.confirmation
f2 = assert_json_import_export_works(formdef)
assert f2.enable_tracking_codes == formdef.enable_tracking_codes
assert f2.confirmation == formdef.confirmation
def test_a_field():
formdef = FormDef()
formdef.name = 'Foo'
formdef.fields = [fields.StringField(type='string', id=1, label='Bar', size='40')]
f2 = assert_xml_import_export_works(formdef)
assert len(f2.fields) == len(formdef.fields)
f2 = assert_json_import_export_works(formdef)
assert len(f2.fields) == len(formdef.fields)
def test_more_fields():
formdef = FormDef()
formdef.name = 'Blah'
formdef.fields = [
fields.TextField(type='text', label='Bar', pre=True),
fields.EmailField(type='email', label='Bar'),
fields.BoolField(type='bool', label='Bar'),
fields.DateField(type='date', label='Bar', minimum_date='2014-01-01'),
fields.ItemField(type='item', label='Bar', items=['foo', 'bar', 'baz']),
]
f2 = assert_xml_import_export_works(formdef)
assert len(f2.fields) == len(formdef.fields)
assert f2.fields[2].type == formdef.fields[2].type
assert f2.fields[3].minimum_date == formdef.fields[3].minimum_date
assert f2.fields[4].items == formdef.fields[4].items
f2 = assert_json_import_export_works(formdef)
assert len(f2.fields) == len(formdef.fields)
assert f2.fields[2].type == formdef.fields[2].type
assert f2.fields[3].minimum_date == formdef.fields[3].minimum_date
assert f2.fields[4].items == formdef.fields[4].items
def test_item_radio():
formdef = FormDef()
formdef.name = 'Blah'
formdef.fields = [
fields.ItemField(
type='item',
label='Bar',
items=['foo', 'bar', 'baz'],
list_mode='radio',
id='1',
),
]
# test new mode
assert_json_import_export_works(formdef, include_id=True)
# test conversion of legacy show_as_radio attribute
formdef_xml = formdef.export_to_xml(include_id=True)
field = formdef_xml.findall('fields/field')[0]
ET.SubElement(field, 'show_as_radio').text = 'True'
field.remove(field.find('display_mode'))
fd2 = FormDef.import_from_xml_tree(formdef_xml, include_id=True)
assert fd2.fields[0].display_mode == 'radio'
# test conversion of legacy show_as_radio attribute
formdef_xml = formdef.export_to_xml(include_id=True)
field = formdef_xml.findall('fields/field')[0]
ET.SubElement(field, 'show_as_radio').text = 'False'
field.remove(field.find('display_mode'))
fd2 = FormDef.import_from_xml_tree(formdef_xml, include_id=True)
assert fd2.fields[0].display_mode == 'list'
def test_include_id():
formdef = FormDef()
formdef.name = 'Blah'
formdef.fields = [
fields.TextField(type='text', label='Bar', pre=True),
fields.EmailField(type='email', label='Bar'),
fields.BoolField(type='bool', label='Bar'),
fields.DateField(type='date', label='Bar', minimum_date='2014-01-01'),
fields.ItemField(type='item', label='Bar', items=['foo', 'bar', 'baz']),
]
for field in formdef.fields:
field.id = formdef.get_new_field_id()
formdef.fields[4].id = '10'
f2 = assert_xml_import_export_works(formdef, include_id=True)
assert len(f2.fields) == len(formdef.fields)
assert f2.fields[0].id == formdef.fields[0].id
assert f2.fields[4].id == formdef.fields[4].id
f2 = assert_json_import_export_works(formdef, include_id=True)
assert len(f2.fields) == len(formdef.fields)
assert f2.fields[0].id == formdef.fields[0].id
assert f2.fields[4].id == formdef.fields[4].id
def test_workflow_options():
formdef = FormDef()
formdef.name = 'workflow options'
formdef.workflow_options = {'foo': 'bar', 'foo2': 'baré'}
fd2 = assert_xml_import_export_works(formdef)
assert fd2.workflow_options == formdef.workflow_options
fd2 = assert_json_import_export_works(formdef)
assert fd2.workflow_options == formdef.workflow_options
def test_workflow_options_with_no_values():
formdef = FormDef()
formdef.name = 'foo'
formdef.workflow_options = {'foo': None, 'foo2': None}
fd2 = assert_xml_import_export_works(formdef)
assert fd2.workflow_options == formdef.workflow_options
fd2 = assert_json_import_export_works(formdef)
assert fd2.workflow_options == formdef.workflow_options
def test_workflow_options_with_file():
from quixote.http_request import Upload
from wcs.qommon.form import UploadedFile
upload = Upload('/foo/bar', content_type='application/vnd.oasis.opendocument.text')
file_content = b'''PK\x03\x04\x14\x00\x00\x08\x00\x00\'l\x8eG^\xc62\x0c\'\x00'''
upload.fp = io.BytesIO()
upload.fp.write(file_content)
upload.fp.seek(0)
model_file = UploadedFile(pub.APP_DIR, None, upload)
formdef = FormDef()
formdef.name = 'foo'
formdef.workflow_options = {'foo': model_file}
fd2 = assert_xml_import_export_works(formdef)
assert formdef.workflow_options['foo'].filename == fd2.workflow_options['foo'].filename
assert formdef.workflow_options['foo'].get_content() == fd2.workflow_options['foo'].get_content()
fd2 = assert_json_import_export_works(formdef)
assert formdef.workflow_options['foo'].filename == fd2.workflow_options['foo'].filename
assert formdef.workflow_options['foo'].get_content() == fd2.workflow_options['foo'].get_content()
def test_workflow_options_with_date():
formdef = FormDef()
formdef.name = 'foo'
formdef.workflow_options = {'foo': time.strptime('2014-02-02', '%Y-%m-%d')}
fd2 = assert_xml_import_export_works(formdef)
assert formdef.workflow_options['foo'] == fd2.workflow_options['foo']
def test_workflow_reference():
Workflow.wipe()
FormDef.wipe()
wf = Workflow()
wf.name = 'test workflow'
wf.store()
formdef = FormDef()
formdef.name = 'foo'
formdef.workflow_id = wf.id
f2 = assert_xml_import_export_works(formdef)
assert f2.workflow_id == formdef.workflow_id
f2 = assert_xml_import_export_works(formdef, include_id=True)
assert f2.workflow_id == formdef.workflow_id
formdef_xml_with_id = formdef.export_to_xml(include_id=True)
formdef_xml_without_id = formdef.export_to_xml(include_id=False)
# check there's no reference to a non-existing workflow
Workflow.wipe()
assert FormDef.import_from_xml_tree(formdef_xml_with_id, include_id=False).workflow_id is None
assert FormDef.import_from_xml_tree(formdef_xml_with_id, include_id=True).workflow_id is None
# check an import that is not using id fields will find the workflow by its
# name
wf = Workflow()
wf.id = '2'
wf.name = 'test workflow'
wf.store()
assert FormDef.import_from_xml_tree(formdef_xml_with_id, include_id=False).workflow_id == '2'
assert FormDef.import_from_xml_tree(formdef_xml_with_id, include_id=True).workflow_id is None
def test_category_reference():
Category.wipe()
FormDef.wipe()
cat = Category()
cat.name = 'test category'
cat.store()
formdef = FormDef()
formdef.name = 'foo'
formdef.category_id = cat.id
f2 = assert_xml_import_export_works(formdef)
assert f2.category_id == formdef.category_id
f2 = assert_xml_import_export_works(formdef, include_id=True)
assert f2.category_id == formdef.category_id
formdef_xml_with_id = formdef.export_to_xml(include_id=True)
formdef_xml_without_id = formdef.export_to_xml(include_id=False)
# check there's no reference to a non-existing category
Category.wipe()
assert FormDef.import_from_xml_tree(formdef_xml_with_id, include_id=False).category_id is None
assert FormDef.import_from_xml_tree(formdef_xml_with_id, include_id=True).category_id is None
# check an import that is not using id fields will find the category by its
# name
cat = Category()
cat.id = '2'
cat.name = 'test category'
cat.store()
assert FormDef.import_from_xml_tree(formdef_xml_with_id, include_id=False).category_id == '2'
assert FormDef.import_from_xml_tree(formdef_xml_with_id, include_id=True).category_id is None
def test_file_field():
formdef = FormDef()
formdef.name = 'foo'
formdef.fields = [
fields.FileField(
type='file',
id='1',
document_type={
'id': 'justificatif-de-domicile',
'fargo': True,
'mimetypes': [
'application/pdf,application/vnd.openxmlformats-officedocument.wordprocessingml.document',
'image/*',
],
},
)
]
assert_xml_import_export_works(formdef, include_id=True)
assert_xml_import_export_works(formdef)
assert_json_import_export_works(formdef, include_id=True)
assert_json_import_export_works(formdef)
def test_invalid_field_type():
formdef = FormDef()
formdef.name = 'foo'
formdef.fields = [fields.StringField(id='1', type='XXX')]
export = ET.tostring(export_to_indented_xml(formdef))
with pytest.raises(FormdefImportError):
FormDef.import_from_xml(io.BytesIO(export), include_id=True)
def test_invalid_data_source():
# manually edited exports
formdef = FormDef()
formdef.name = 'foo'
formdef.fields = [fields.StringField(id='1', type='string', data_source={'type': 'xxx'})]
export = ET.tostring(export_to_indented_xml(formdef))
export = export.replace(b'\n', b'').replace(b' ', b'')
export = export.replace(
b'<data_source><type>xxx</type></data_source>', b'<data_source><type/></data_source>'
)
formdef2 = FormDef.import_from_xml(io.BytesIO(export))
assert formdef2.fields[0].data_source == {}
export = export.replace(b'<data_source><type/></data_source>', b'<data_source> </data_source>')
formdef2 = FormDef.import_from_xml(io.BytesIO(export))
assert formdef2.fields[0].data_source == {}
def test_unknown_data_source():
formdef = FormDef()
formdef.name = 'foo'
formdef.fields = [
fields.StringField(id='1', type='string', data_source={'type': 'json', 'value': 'http://example.net'})
]
export = ET.tostring(export_to_indented_xml(formdef))
FormDef.import_from_xml(io.BytesIO(export))
formdef.fields = [fields.StringField(id='1', type='string', data_source={'type': 'foobar'})]
export = ET.tostring(export_to_indented_xml(formdef))
with pytest.raises(FormdefImportError, match='Unknown datasources'):
FormDef.import_from_xml(io.BytesIO(export))
# carddef as datasource
carddef = CardDef()
carddef.name = 'foo'
carddef.fields = [
fields.StringField(id='1', label='Test', type='string', varname='foo'),
]
carddef.store()
formdef.fields = [fields.StringField(id='1', type='string', data_source={'type': 'carddef:foo'})]
export = ET.tostring(export_to_indented_xml(formdef))
FormDef.import_from_xml(io.BytesIO(export))
formdef.fields = [fields.StringField(id='1', type='string', data_source={'type': 'carddef:unknown'})]
export = ET.tostring(export_to_indented_xml(formdef))
with pytest.raises(FormdefImportError):
FormDef.import_from_xml(io.BytesIO(export))
# carddef custom view as datasource
pub.custom_view_class.wipe()
custom_view = pub.custom_view_class()
custom_view.title = 'card view'
custom_view.formdef = carddef
custom_view.columns = {'list': [{'id': 'id'}]}
custom_view.filters = {}
custom_view.visibility = 'datasource'
custom_view.store()
formdef.fields = [
fields.StringField(id='1', type='string', data_source={'type': 'carddef:foo:card-view'})
]
export = ET.tostring(export_to_indented_xml(formdef))
FormDef.import_from_xml(io.BytesIO(export))
formdef.fields = [fields.StringField(id='1', type='string', data_source={'type': 'carddef:foo:unknown'})]
export = ET.tostring(export_to_indented_xml(formdef))
with pytest.raises(FormdefImportError):
FormDef.import_from_xml(io.BytesIO(export))
def test_duplicated_field_ids():
formdef = FormDef()
formdef.name = 'foo'
formdef.fields = [
fields.StringField(id='2', type='string'),
fields.StringField(id='2', type='string'),
fields.StringField(id='1', type='string'),
]
export = ET.tostring(export_to_indented_xml(formdef, include_id=True))
with pytest.raises(FormdefImportError):
FormDef.import_from_xml(io.BytesIO(export))
with pytest.raises(FormdefImportError):
FormDef.import_from_xml(io.BytesIO(export), include_id=True)
formdef2 = FormDef.import_from_xml(io.BytesIO(export), fix_on_error=True)
assert formdef2.fields[0].id == '1'
assert formdef2.fields[1].id == '2'
assert formdef2.fields[2].id == '3'
def test_wrong_max_field_id():
formdef = FormDef()
formdef.name = 'foo'
formdef.fields = [
fields.StringField(id='1', type='string'),
fields.StringField(id='2', type='string'),
]
formdef.max_field_id = 1
export = ET.tostring(export_to_indented_xml(formdef, include_id=True))
formdef2 = FormDef.import_from_xml(io.BytesIO(export), include_id=True)
assert formdef2.max_field_id == 2
def test_page_condition():
formdef = FormDef()
formdef.name = 'foo'
formdef.fields = [fields.PageField(id='1', type='page', condition={'type': 'python', 'value': 'blah'})]
fd2 = assert_xml_import_export_works(formdef)
assert fd2.fields[0].type == 'page'
assert fd2.fields[0].condition == formdef.fields[0].condition
# test legacy condition (simple string)
formdef_xml = formdef.export_to_xml(include_id=True)
condition = formdef_xml.findall('fields/field/condition')[0]
condition.clear()
condition.text = 'blah'
fd2 = FormDef.import_from_xml_tree(formdef_xml, include_id=True)
assert fd2.fields[0].condition == formdef.fields[0].condition
def test_page_post_conditions():
formdef = FormDef()
formdef.name = 'foo'
formdef.fields = [
fields.PageField(
id='1',
type='page',
post_conditions=[{'condition': {'type': 'python', 'value': 'blah'}, 'error_message': 'bar'}],
),
]
fd2 = assert_xml_import_export_works(formdef)
assert fd2.fields[0].type == 'page'
assert fd2.fields[0].post_conditions == formdef.fields[0].post_conditions
# test legacy condition (simple string)
formdef_xml = formdef.export_to_xml(include_id=True)
post_condition = formdef_xml.findall('fields/field/post_conditions/post_condition/condition')[0]
post_condition.clear()
post_condition.text = 'blah'
fd2 = FormDef.import_from_xml_tree(formdef_xml, include_id=True)
assert fd2.fields[0].post_conditions[0]['condition'] == {'type': 'python', 'value': 'blah'}
assert fd2.fields[0].post_conditions[0]['error_message'] == 'bar'
# test incomplete post condition (not allowed anymore but old formdefs may
# have this)
formdef.fields = [
fields.PageField(
id='1',
type='page',
post_conditions=[{'condition': {'type': 'python', 'value': 'blah'}, 'error_message': None}],
),
]
formdef_xml = formdef.export_to_xml(include_id=True)
fd2 = FormDef.import_from_xml_tree(formdef_xml, include_id=True)
assert fd2.fields[0].post_conditions[0]['condition'] == {'type': 'python', 'value': 'blah'}
assert fd2.fields[0].post_conditions[0]['error_message'] == ''
def test_workflow_roles():
pub.role_class.wipe()
role = pub.role_class(name='blah')
role.store()
formdef = FormDef()
formdef.name = 'foo'
formdef.fields = []
formdef.workflow_roles = {'_receiver': role.id}
fd2 = assert_xml_import_export_works(formdef, include_id=True)
assert fd2.workflow_roles.get('_receiver') == role.id
fd2 = assert_xml_import_export_works(formdef, include_id=False)
assert fd2.workflow_roles.get('_receiver') == role.id
xml_export = export_to_indented_xml(formdef, include_id=True)
xml_export_no_id = export_to_indented_xml(formdef, include_id=False)
# same id, different name
role.name = 'blah 2'
role.store()
fd2 = FormDef.import_from_xml_tree(xml_export, include_id=True)
assert fd2.workflow_roles.get('_receiver') == role.id
fd2 = FormDef.import_from_xml_tree(xml_export, include_id=False)
assert fd2.workflow_roles.get('_receiver') is None
role.remove_self()
fd2 = FormDef.import_from_xml_tree(xml_export, include_id=True)
assert fd2.workflow_roles.get('_receiver') is None
def test_geolocations():
formdef = FormDef()
formdef.name = 'foo'
formdef.fields = []
formdef.geolocations = {'base': 'Base'}
fd2 = assert_xml_import_export_works(formdef, include_id=True)
assert fd2.geolocations == formdef.geolocations
fd3 = assert_json_import_export_works(formdef)
assert fd3.geolocations == formdef.geolocations
def test_user_roles():
pub.role_class.wipe()
role = pub.role_class(name='blah')
role.store()
formdef = FormDef()
formdef.name = 'foo'
formdef.fields = []
formdef.roles = ['logged-users', role.id]
fd2 = assert_xml_import_export_works(formdef, include_id=True)
assert fd2.roles == formdef.roles
formdef_xml = formdef.export_to_xml(include_id=True)
formdef_xml_no_id = formdef.export_to_xml(include_id=False)
role.remove_self()
fd2 = FormDef.import_from_xml_tree(formdef_xml, include_id=True)
assert fd2.roles == ['logged-users']
fd2 = FormDef.import_from_xml_tree(formdef_xml, include_id=False)
assert fd2.roles == ['logged-users']
fd2 = FormDef.import_from_xml_tree(formdef_xml_no_id, include_id=True)
assert fd2.roles == ['logged-users']
fd2 = FormDef.import_from_xml_tree(formdef_xml_no_id, include_id=False)
assert fd2.roles == ['logged-users']
def test_backoffice_submission_roles():
pub.role_class.wipe()
role = pub.role_class(name='blah')
role.store()
formdef = FormDef()
formdef.name = 'foo'
formdef.fields = []
formdef.backoffice_submission_roles = [role.id]
fd2 = assert_xml_import_export_works(formdef, include_id=True)
assert fd2.backoffice_submission_roles == formdef.backoffice_submission_roles
def test_required_authentication_contexts():
formdef = FormDef()
formdef.name = 'foo'
formdef.fields = []
formdef.required_authentication_contexts = ['fedict']
fd2 = assert_xml_import_export_works(formdef, include_id=True)
assert fd2.required_authentication_contexts == formdef.required_authentication_contexts
def test_field_condition():
formdef = FormDef()
formdef.name = 'Foo'
formdef.fields = [
fields.StringField(
type='string', id=1, label='Bar', size='40', condition={'type': 'django', 'value': '1'}
)
]
f2 = assert_xml_import_export_works(formdef)
assert len(f2.fields) == len(formdef.fields)
assert f2.fields[0].condition == {'type': 'django', 'value': '1'}
def test_field_validation():
formdef = FormDef()
formdef.name = 'Foo'
formdef.fields = [fields.StringField(type='string', id=1, label='Bar', size='40', validation={})]
f2 = assert_xml_import_export_works(formdef)
assert len(f2.fields) == len(formdef.fields)
assert not f2.fields[0].validation
formdef.fields = [fields.StringField(type='string', id=1, label='Bar', size='40', validation=None)]
formdef_xml = formdef.export_to_xml()
f2 = FormDef.import_from_xml_tree(formdef_xml)
assert len(f2.fields) == len(formdef.fields)
assert not f2.fields[0].validation
formdef.fields = [
fields.StringField(
type='string', id=1, label='Bar', size='40', validation={'type': 'regex', 'value': r'\d'}
)
]
f2 = assert_xml_import_export_works(formdef)
assert len(f2.fields) == len(formdef.fields)
assert f2.fields[0].validation == formdef.fields[0].validation
# backward compatibility
formdef_xml = formdef.export_to_xml()
old_format = ET.tostring(formdef_xml).replace(
b'<validation><type>regex</type><value>\\d</value></validation>', b'<validation>\\d</validation>'
)
f2 = FormDef.import_from_xml(io.BytesIO(old_format))
assert len(f2.fields) == len(formdef.fields)
assert f2.fields[0].validation == {'type': 'regex', 'value': '\\d'}
def test_digest_template():
formdef = FormDef()
formdef.name = 'Foo'
formdef.fields = []
formdef.digest_template = '{{form_number}}'
f2 = assert_xml_import_export_works(formdef)
assert f2.digest_template == formdef.digest_template
def test_field_prefill():
formdef = FormDef()
formdef.name = 'Foo'
formdef.fields = [
fields.StringField(
type='string', id=1, label='Bar', size='40', prefill={'type': 'string', 'value': 'plop'}
)
]
f2 = assert_xml_import_export_works(formdef)
assert len(f2.fields) == len(formdef.fields)
assert f2.fields[0].prefill == {'type': 'string', 'value': 'plop'}
formdef.fields = [
fields.StringField(
type='string',
id=1,
label='Bar',
size='40',
prefill={'type': 'string', 'value': 'plop', 'locked': True},
)
]
f2 = assert_xml_import_export_works(formdef)
assert len(f2.fields) == len(formdef.fields)
assert f2.fields[0].prefill == {'type': 'string', 'value': 'plop', 'locked': True}
formdef.fields = [
fields.StringField(
type='string',
id=1,
label='Bar',
size='40',
prefill={'type': 'string', 'value': 'plop', 'locked': False},
)
]
formdef_xml = formdef.export_to_xml()
f2 = FormDef.import_from_xml_tree(formdef_xml)
assert len(f2.fields) == len(formdef.fields)
assert f2.fields[0].prefill == {'type': 'string', 'value': 'plop'}
formdef.fields = [
fields.StringField(
type='string',
id=1,
label='Bar',
size='40',
prefill={'type': 'string', 'value': 'plop', 'locked': False},
)
]
formdef_xml_str = ET.tostring(formdef.export_to_xml())
formdef_xml_str = formdef_xml_str.replace(b'<value>plop</value>', b'')
formdef_xml = ET.fromstring(formdef_xml_str)
f2 = FormDef.import_from_xml_tree(formdef_xml)
assert len(f2.fields) == len(formdef.fields)
assert f2.fields[0].prefill == {'type': 'string', 'value': None}
def test_custom_views():
formdef = FormDef()
formdef.name = 'foo'
formdef.fields = [
fields.StringField(id='1', label='Foo', type='string', varname='foo'),
fields.StringField(id='2', label='Bar', type='string', varname='bar'),
]
formdef.store()
# define also custom views
pub.custom_view_class.wipe()
custom_view = pub.custom_view_class()
custom_view.title = 'shared form view'
custom_view.formdef = formdef
custom_view.columns = {'list': [{'id': 'id'}, {'id': 'time'}, {'id': 'status'}]}
custom_view.filters = {'filter': 'done', 'filter-1': 'on', 'filter-status': 'on', 'filter-1-value': 'b'}
custom_view.visibility = 'any'
custom_view.order_by = 'receipt_time'
custom_view.store()
custom_view = pub.custom_view_class()
custom_view.title = 'private form view'
custom_view.formdef = formdef
custom_view.columns = {'list': [{'id': 'id'}]}
custom_view.filters = {}
custom_view.visibility = 'owner'
custom_view.usier_id = 42
custom_view.order_by = 'id'
custom_view.store()
formdef_xml = formdef.export_to_xml()
assert formdef_xml.tag == 'formdef'
formdef.data_class().wipe()
pub.custom_view_class.wipe()
formdef2 = FormDef.import_from_xml(io.BytesIO(ET.tostring(formdef_xml)))
assert formdef2.name == 'foo'
assert formdef2._custom_views
custom_views = formdef2._custom_views
assert len(custom_views) == 1
assert custom_views[0].title == 'shared form view'
assert custom_views[0].slug == 'shared-form-view'
assert custom_views[0].columns == {'list': [{'id': 'id'}, {'id': 'time'}, {'id': 'status'}]}
assert custom_views[0].filters == {
'filter': 'done',
'filter-1': 'on',
'filter-status': 'on',
'filter-1-value': 'b',
}
assert custom_views[0].visibility == 'any'
assert custom_views[0].order_by == 'receipt_time'
assert custom_views[0].formdef_id is None
assert custom_views[0].formdef_type is None
formdef2.store()
custom_views = pub.custom_view_class.select()
assert len(custom_views) == 1
assert custom_views[0].title == 'shared form view'
assert custom_views[0].slug == 'shared-form-view'
assert custom_views[0].columns == {'list': [{'id': 'id'}, {'id': 'time'}, {'id': 'status'}]}
assert custom_views[0].filters == {
'filter': 'done',
'filter-1': 'on',
'filter-status': 'on',
'filter-1-value': 'b',
}
assert custom_views[0].visibility == 'any'
assert custom_views[0].order_by == 'receipt_time'
assert custom_views[0].formdef_id == formdef2.id
assert custom_views[0].formdef_type == 'formdef'