From 36d0df7fef2425828787d941bfd9d4d40a11e6af Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20P=C3=A9ters?= Date: Wed, 2 Dec 2015 12:49:48 +0100 Subject: [PATCH 3/3] formdef: fix max_field_id on import (#9173) --- tests/test_formdef_import.py | 12 ++++++++++++ wcs/formdef.py | 12 +++++++++--- 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/tests/test_formdef_import.py b/tests/test_formdef_import.py index 91835b3..2bfc74e 100644 --- a/tests/test_formdef_import.py +++ b/tests/test_formdef_import.py @@ -270,3 +270,15 @@ def test_duplicated_field_ids(): with pytest.raises(FormdefImportError): FormDef.import_from_xml(StringIO.StringIO(export), include_id=True) + +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(StringIO.StringIO(export), include_id=True) + assert formdef2.max_field_id == 2 diff --git a/wcs/formdef.py b/wcs/formdef.py index 859875f..f84ccae 100644 --- a/wcs/formdef.py +++ b/wcs/formdef.py @@ -613,7 +613,7 @@ class FormDef(StorableObject): formdef.fields.append(field_o) if formdef.fields and not formdef.max_field_id: - formdef.max_field_id = max([lax_int(x.id) for x in formdef.fields])+1 + formdef.max_field_id = max([lax_int(x.id) for x in formdef.fields]) if value.get('options'): formdef.workflow_options = value.get('options') @@ -689,6 +689,12 @@ class FormDef(StorableObject): formdef = cls.import_from_xml_tree(tree, charset=charset, include_id=include_id) + # fix max_field_id if necessary + if formdef.max_field_id is not None: + max_field_id = max([lax_int(x.id) for x in formdef.fields]) + if formdef.max_field_id < max_field_id: + formdef.max_field_id = max_field_id + # check if datasources are defined unknown_datasources = set() for field in formdef.fields: @@ -750,7 +756,7 @@ class FormDef(StorableObject): field_o.init_with_xml(field, charset, include_id=include_id) if not field_o.id: # this assumes all fields will have id, or none of them - field_o.id = str(i) + field_o.id = str(i+1) formdef.fields.append(field_o) if formdef.fields: @@ -758,7 +764,7 @@ class FormDef(StorableObject): if value is not None: formdef.max_field_id = int(value.text) else: - formdef.max_field_id = max([lax_int(x.id) for x in formdef.fields])+1 + formdef.max_field_id = max([lax_int(x.id) for x in formdef.fields]) formdef.workflow_options = {} for option in tree.findall('options/option'): -- 2.6.2