From 1a08c8a008c10f58c80b8beb6508298b9c352486 Mon Sep 17 00:00:00 2001 From: signedav Date: Tue, 25 Nov 2025 14:39:52 +0100 Subject: [PATCH 1/2] testmodel --- .../ilimodels/ColorsParentChildDomain_V2.ili | 51 +++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 tests/testdata/ilimodels/ColorsParentChildDomain_V2.ili diff --git a/tests/testdata/ilimodels/ColorsParentChildDomain_V2.ili b/tests/testdata/ilimodels/ColorsParentChildDomain_V2.ili new file mode 100644 index 00000000..7a5e23f3 --- /dev/null +++ b/tests/testdata/ilimodels/ColorsParentChildDomain_V2.ili @@ -0,0 +1,51 @@ +INTERLIS 2.3; + +MODEL Colors_V2 (es) +AT "mailto:PC-1@localhost" +VERSION "2020-08-26" = + + DOMAIN + + DomBaseColorType = ( + Green, + Red, + Blue + ); + + DomChildColorType + EXTENDS DomBaseColorType = ( + Blue( + Dark_Blue, + Light_Blue, + Medium_Blue + ) + ); + + DomAnotherChildColorType + EXTENDS DomBaseColorType = ( + Green( + Dark_Green, + Light_Green, + Medium_Green + ) + ); + + TOPIC Colors = + + CLASS BaseColor = + ColorType : Colors.DomBaseColorType; + END BaseColor; + + CLASS ChildColor + EXTENDS BaseColor = + ColorType (EXTENDED) : Colors.DomChildColorType; + END ChildColor; + + CLASS AnotherChildColor + EXTENDS BaseColor = + ColorType (EXTENDED) : Colors.DomAnotherChildColorType; + END AnotherChildColor; + + END Colors; + +END Colors_V2. From f909084631e4e1ac9679c826fe02e22637359d61 Mon Sep 17 00:00:00 2001 From: signedav Date: Mon, 8 Dec 2025 16:57:09 +0100 Subject: [PATCH 2/2] test base --- modelbaker/iliwrapper/ili2dbconfig.py | 8 +- tests/test_domain_class_relations.py | 307 ++++++++++++++++++ .../ilimodels/ColorsParentChildDomain_V2.ili | 6 +- 3 files changed, 317 insertions(+), 4 deletions(-) diff --git a/modelbaker/iliwrapper/ili2dbconfig.py b/modelbaker/iliwrapper/ili2dbconfig.py index 72c03452..ddd8b6c8 100644 --- a/modelbaker/iliwrapper/ili2dbconfig.py +++ b/modelbaker/iliwrapper/ili2dbconfig.py @@ -268,6 +268,7 @@ def __init__(self, other: Optional[Ili2DbCommandConfiguration] = None): self.pre_script = "" self.post_script = "" self.name_lang = "" + self.enum_tabs = "tabsid" # "tabs","singletabs" def to_ili2db_args( self, extra_args: list[str] = [], with_action: bool = True @@ -309,7 +310,12 @@ def to_ili2db_args( if self.db_ili_version is None or self.db_ili_version > 3: self.append_args(args, ["--createTypeConstraint"], True) - self.append_args(args, ["--createEnumTabsWithId"], True) + if self.enum_tabs == "tabs": + self.append_args(args, ["--createEnumTabs"], True) + elif self.enum_tabs == "singletabs": + self.append_args(args, ["--createSingleEnumTab"], True) + else: + self.append_args(args, ["--createEnumTabsWithId"], True) self.append_args(args, ["--createTidCol"], True) else: # version 3 backwards compatibility (not needed in newer versions) diff --git a/tests/test_domain_class_relations.py b/tests/test_domain_class_relations.py index 3099a6f9..083236a7 100644 --- a/tests/test_domain_class_relations.py +++ b/tests/test_domain_class_relations.py @@ -4086,6 +4086,313 @@ def test_widgets_for_domain_geopackage(self): assert count == 1 + def test_enumtabsid_for_domain_postgis(self): + # Schema Import + importer = iliimporter.Importer() + importer.tool = DbIliMode.ili2pg + importer.configuration = iliimporter_config(importer.tool, "ilimodels") + importer.configuration.ilimodels = "Colors_V2" + importer.configuration.dbschema = "colors_v2_{:%Y%m%d%H%M%S%f}".format( + datetime.datetime.now() + ) + importer.configuration.inheritance = "smart2" + importer.configuration.create_basket_col = False + importer.stdout.connect(self.print_info) + importer.stderr.connect(self.print_error) + assert importer.run() == iliimporter.Importer.SUCCESS + + generator = Generator( + DbIliMode.ili2pg, + get_pg_connection_string(), + importer.configuration.inheritance, + importer.configuration.dbschema, + ) + + available_layers = generator.layers() + relations, _ = generator.relations(available_layers) + + legend = generator.legend(available_layers) + + project = Project() + project.layers = available_layers + project.relations = relations + project.legend = legend + project.post_generate() + + qgis_project = QgsProject.instance() + project.create(None, qgis_project) + + count = 0 + for layer in available_layers: + if layer.name == "BaseColor": + field = layer.layer.fields().field("colortype") + type = field.editorWidgetSetup().type() + self.assertEqual(type, "ValueRelation") + + config = field.editorWidgetSetup().config() + # to do: there should be something - but it's not filtered at all + # assert ( + # config["FilterExpression"] + # == "\"thisclass\" = 'Colors.DomBaseColorType'" + # ) + count += 1 + + if layer.name == "ChildColor": + field = layer.layer.fields().field("colortype") + type = field.editorWidgetSetup().type() + self.assertEqual(type, "ValueRelation") + + config = field.editorWidgetSetup().config() + assert ( + config["FilterExpression"] + == "\"thisclass\" = 'Colors.DomChildColorType'" + ) + count += 1 + + if layer.name == "AnotherChildColor": + field = layer.layer.fields().field("colortype") + type = field.editorWidgetSetup().type() + self.assertEqual(type, "ValueRelation") + + config = field.editorWidgetSetup().config() + assert ( + config["FilterExpression"] + == "\"thisclass\" = 'Colors.DomAnotherChildColorType'" + ) + count += 1 + assert count == 3 + + def test_enumtabsid_for_domain_geopackage(self): + # Schema Import + importer = iliimporter.Importer() + importer.tool = DbIliMode.ili2gpkg + importer.configuration = iliimporter_config(importer.tool, "ilimodels") + importer.configuration.ilimodels = "Colors_V2" + importer.configuration.dbfile = os.path.join( + self.basetestpath, + "colors_v2_{:%Y%m%d%H%M%S%f}.gpkg".format(datetime.datetime.now()), + ) + importer.configuration.inheritance = "smart2" + importer.configuration.create_basket_col = False + importer.stdout.connect(self.print_info) + importer.stderr.connect(self.print_error) + assert importer.run() == iliimporter.Importer.SUCCESS + + config_manager = GpkgCommandConfigManager(importer.configuration) + uri = config_manager.get_uri() + + generator = Generator( + DbIliMode.ili2gpkg, uri, importer.configuration.inheritance + ) + + available_layers = generator.layers() + relations, _ = generator.relations(available_layers) + + legend = generator.legend(available_layers) + + project = Project() + project.layers = available_layers + project.relations = relations + project.legend = legend + project.post_generate() + + qgis_project = QgsProject.instance() + project.create(None, qgis_project) + + count = 0 + for layer in available_layers: + if layer.name == "BaseColor": + field = layer.layer.fields().field("colortype") + type = field.editorWidgetSetup().type() + self.assertEqual(type, "ValueRelation") + + config = field.editorWidgetSetup().config() + # to do: there should be something - but it's not filtered at all + # assert ( + # config["FilterExpression"] + # == "\"thisclass\" = 'Colors.DomBaseColorType'" + # ) + count += 1 + + if layer.name == "ChildColor": + field = layer.layer.fields().field("colortype") + type = field.editorWidgetSetup().type() + self.assertEqual(type, "ValueRelation") + + config = field.editorWidgetSetup().config() + assert ( + config["FilterExpression"] + == "\"thisclass\" = 'Colors.DomChildColorType'" + ) + count += 1 + + if layer.name == "AnotherChildColor": + field = layer.layer.fields().field("colortype") + type = field.editorWidgetSetup().type() + self.assertEqual(type, "ValueRelation") + + config = field.editorWidgetSetup().config() + assert ( + config["FilterExpression"] + == "\"thisclass\" = 'Colors.DomAnotherChildColorType'" + ) + count += 1 + assert count == 3 + + def test_enumtabs_for_domain_postgis(self): + # Schema Import + importer = iliimporter.Importer() + importer.tool = DbIliMode.ili2pg + importer.configuration = iliimporter_config(importer.tool, "ilimodels") + importer.configuration.ilimodels = "Colors_V2" + importer.configuration.dbschema = "colors_v2_{:%Y%m%d%H%M%S%f}".format( + datetime.datetime.now() + ) + importer.configuration.inheritance = "smart2" + importer.configuration.create_basket_col = False + # createEnumTabs + importer.configuration.enum_tabs = "tabs" + importer.stdout.connect(self.print_info) + importer.stderr.connect(self.print_error) + assert importer.run() == iliimporter.Importer.SUCCESS + + generator = Generator( + DbIliMode.ili2pg, + get_pg_connection_string(), + importer.configuration.inheritance, + importer.configuration.dbschema, + ) + + available_layers = generator.layers() + relations, _ = generator.relations(available_layers) + + legend = generator.legend(available_layers) + + project = Project() + project.layers = available_layers + project.relations = relations + project.legend = legend + project.post_generate() + + qgis_project = QgsProject.instance() + project.create(None, qgis_project) + + def test_enumtabs_for_domain_geopackage(self): + # Schema Import + importer = iliimporter.Importer() + importer.tool = DbIliMode.ili2gpkg + importer.configuration = iliimporter_config(importer.tool, "ilimodels") + importer.configuration.ilimodels = "Colors_V2" + importer.configuration.dbfile = os.path.join( + self.basetestpath, + "colors_v2_{:%Y%m%d%H%M%S%f}.gpkg".format(datetime.datetime.now()), + ) + importer.configuration.inheritance = "smart2" + importer.configuration.create_basket_col = False + # createEnumTabs + importer.configuration.enum_tabs = "tabs" + importer.stdout.connect(self.print_info) + importer.stderr.connect(self.print_error) + assert importer.run() == iliimporter.Importer.SUCCESS + + config_manager = GpkgCommandConfigManager(importer.configuration) + uri = config_manager.get_uri() + + generator = Generator( + DbIliMode.ili2gpkg, uri, importer.configuration.inheritance + ) + + available_layers = generator.layers() + relations, _ = generator.relations(available_layers) + + legend = generator.legend(available_layers) + + project = Project() + project.layers = available_layers + project.relations = relations + project.legend = legend + project.post_generate() + + qgis_project = QgsProject.instance() + project.create(None, qgis_project) + + def test_enumsingletab_for_domain_postgis(self): + # Schema Import + importer = iliimporter.Importer() + importer.tool = DbIliMode.ili2pg + importer.configuration = iliimporter_config(importer.tool, "ilimodels") + importer.configuration.ilimodels = "Colors_V2" + importer.configuration.dbschema = "colors_v2_{:%Y%m%d%H%M%S%f}".format( + datetime.datetime.now() + ) + importer.configuration.inheritance = "smart2" + importer.configuration.create_basket_col = False + # createSingleEnumTab + importer.configuration.enum_tabs = "singletabs" + importer.stdout.connect(self.print_info) + importer.stderr.connect(self.print_error) + assert importer.run() == iliimporter.Importer.SUCCESS + + generator = Generator( + DbIliMode.ili2pg, + get_pg_connection_string(), + importer.configuration.inheritance, + importer.configuration.dbschema, + ) + + available_layers = generator.layers() + relations, _ = generator.relations(available_layers) + + legend = generator.legend(available_layers) + + project = Project() + project.layers = available_layers + project.relations = relations + project.legend = legend + project.post_generate() + + qgis_project = QgsProject.instance() + project.create(None, qgis_project) + + def test_enumsingletab_for_domain_geopackage(self): + # Schema Import + importer = iliimporter.Importer() + importer.tool = DbIliMode.ili2gpkg + importer.configuration = iliimporter_config(importer.tool, "ilimodels") + importer.configuration.ilimodels = "Colors_V2" + importer.configuration.dbfile = os.path.join( + self.basetestpath, + "colors_v2_{:%Y%m%d%H%M%S%f}.gpkg".format(datetime.datetime.now()), + ) + importer.configuration.inheritance = "smart2" + importer.configuration.create_basket_col = False + # createSingleEnumTab + importer.configuration.enum_tabs = "singletabs" + importer.stdout.connect(self.print_info) + importer.stderr.connect(self.print_error) + assert importer.run() == iliimporter.Importer.SUCCESS + + config_manager = GpkgCommandConfigManager(importer.configuration) + uri = config_manager.get_uri() + + generator = Generator( + DbIliMode.ili2gpkg, uri, importer.configuration.inheritance + ) + + available_layers = generator.layers() + relations, _ = generator.relations(available_layers) + + legend = generator.legend(available_layers) + + project = Project() + project.layers = available_layers + project.relations = relations + project.legend = legend + project.post_generate() + + qgis_project = QgsProject.instance() + project.create(None, qgis_project) + def print_info(self, text): logging.info(text) diff --git a/tests/testdata/ilimodels/ColorsParentChildDomain_V2.ili b/tests/testdata/ilimodels/ColorsParentChildDomain_V2.ili index 7a5e23f3..7d16c913 100644 --- a/tests/testdata/ilimodels/ColorsParentChildDomain_V2.ili +++ b/tests/testdata/ilimodels/ColorsParentChildDomain_V2.ili @@ -33,17 +33,17 @@ VERSION "2020-08-26" = TOPIC Colors = CLASS BaseColor = - ColorType : Colors.DomBaseColorType; + ColorType : Colors_V2.DomBaseColorType; END BaseColor; CLASS ChildColor EXTENDS BaseColor = - ColorType (EXTENDED) : Colors.DomChildColorType; + ColorType (EXTENDED) : Colors_V2.DomChildColorType; END ChildColor; CLASS AnotherChildColor EXTENDS BaseColor = - ColorType (EXTENDED) : Colors.DomAnotherChildColorType; + ColorType (EXTENDED) : Colors_V2.DomAnotherChildColorType; END AnotherChildColor; END Colors;