Skip to content

Commit 92c691c

Browse files
authored
Merge pull request #158 from opengisch/namelang
nameLang parameter to create schema in translated language
2 parents dd3cce1 + 10801be commit 92c691c

File tree

2 files changed

+235
-19
lines changed

2 files changed

+235
-19
lines changed

modelbaker/iliwrapper/ili2dbconfig.py

Lines changed: 33 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -146,19 +146,28 @@ def __init__(self, other=None):
146146
self.__dict__ = other.__dict__.copy()
147147

148148
def append_args(self, args, values, consider_metaconfig=False, force_append=False):
149-
150-
if not force_append and self.metaconfig_id and values:
151-
if self.metaconfig_params_only:
152-
return
153-
if (
154-
consider_metaconfig
155-
and self.metaconfig
156-
and "ch.ehi.ili2db" in self.metaconfig.sections()
157-
):
158-
metaconfig_ili2db_params = self.metaconfig["ch.ehi.ili2db"]
159-
if values[0][2:] in metaconfig_ili2db_params.keys():
160-
# if the value is set in the metaconfig, then we do consider it instead
149+
"""
150+
Usually, there's no metaconfig, so we just add the value to the command's arguments.
151+
But if there is a metaconfig and the parameter isn't forced (i.e., it's not a technical parameter), we check:
152+
- Is metaconfig_params_only enabled?
153+
- If yes, we don't add the argument—even if the parameter isn't in the metaconfig (meaning the parameter remains disabled).
154+
- If no, we check whether we want to consider the metaconfig for this specific parameter.
155+
- If yes, we don't add the argument if it's already in the metaconfig.
156+
- If no, we add the argument.
157+
"""
158+
if self.metaconfig_id:
159+
if not force_append:
160+
if self.metaconfig_params_only:
161161
return
162+
if (
163+
consider_metaconfig
164+
and self.metaconfig
165+
and "ch.ehi.ili2db" in self.metaconfig.sections()
166+
):
167+
metaconfig_ili2db_params = self.metaconfig["ch.ehi.ili2db"]
168+
if values[0][2:] in metaconfig_ili2db_params.keys():
169+
# if the value is set in the metaconfig, then we do consider it instead
170+
return
162171
args += values
163172

164173
def to_ili2db_args(self):
@@ -252,11 +261,16 @@ def __init__(self, other: Ili2DbCommandConfiguration = None):
252261
self.stroke_arcs = True
253262
self.pre_script = ""
254263
self.post_script = ""
264+
self.name_lang = ""
255265

256266
def to_ili2db_args(self, extra_args=[], with_action=True):
257267
"""
258268
Create an ili2db argument array, with the password masked with ****** and optionally with the ``action``
259-
argument (--schemaimport) removed
269+
argument (--schemaimport) removed.
270+
271+
On all default parameter we consider the metaconfiguration if available.
272+
On those controlled by configuration (like create_basket_col) we don't consider the metaconfiguration (and always set or unset them - even when null).
273+
On technical parameters, we always force-add to the command — even if the metaconfig_params_only setting is enabled. Special case here are the SQL scripts. They are considered as technical and forced.
260274
"""
261275
args = list()
262276

@@ -309,7 +323,7 @@ def to_ili2db_args(self, extra_args=[], with_action=True):
309323

310324
if self.tool and (self.tool & DbIliMode.gpkg):
311325
if self.create_gpkg_multigeom:
312-
self.append_args(args, ["--gpkgMultiGeomPerTable"], True)
326+
self.append_args(args, ["--gpkgMultiGeomPerTable"])
313327
elif self.db_ili_version is None or self.db_ili_version > 3:
314328
self.append_args(args, ["--gpkgMultiGeomPerTable=False"])
315329

@@ -339,6 +353,11 @@ def to_ili2db_args(self, extra_args=[], with_action=True):
339353
if self.db_ili_version is None or self.db_ili_version > 3:
340354
self.append_args(args, ["--createNlsTab"])
341355

356+
if self.name_lang:
357+
self.append_args(args, ["--nameLang", self.name_lang])
358+
elif self.db_ili_version is None or self.db_ili_version > 3:
359+
self.append_args(args, ["--nameLang", "NULL"])
360+
342361
self.append_args(
343362
args, Ili2DbCommandConfiguration.to_ili2db_args(self), force_append=True
344363
)

tests/test_translations.py

Lines changed: 202 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,9 @@ def test_translated_db_objects_gpkg(self):
5252
importer.configuration = iliimporter_config(importer.tool)
5353
importer.configuration.ilimodels = "PlansDAffectation_V1_2"
5454
importer.configuration.dbfile = os.path.join(
55-
self.basetestpath, "tmp_translated_gpkg.gpkg"
55+
self.basetestpath, "tmp_translated_{:%Y%m%d%H%M%S%f}.gpkg".format(
56+
datetime.datetime.now()
57+
),
5658
)
5759
importer.configuration.inheritance = "smart2"
5860
importer.configuration.create_basket_col = True
@@ -231,13 +233,15 @@ def test_translated_db_objects_pg(self):
231233
== "Geometrie_Document_(Geometrie)_AffectationPrimaire_SurfaceDeZones_(t_id)"
232234
)
233235

234-
def test_available_langs_gpkg(self):
236+
def test_translated_available_langs_gpkg(self):
235237
importer = iliimporter.Importer()
236238
importer.tool = DbIliMode.ili2gpkg
237239
importer.configuration = iliimporter_config(importer.tool)
238240
importer.configuration.ilimodels = "PlansDAffectation_V1_2"
239241
importer.configuration.dbfile = os.path.join(
240-
self.basetestpath, "tmp_translated_gpkg.gpkg"
242+
self.basetestpath, "tmp_translated_{:%Y%m%d%H%M%S%f}.gpkg".format(
243+
datetime.datetime.now()
244+
),
241245
)
242246
importer.configuration.inheritance = "smart2"
243247
importer.configuration.create_basket_col = True
@@ -269,7 +273,7 @@ def test_available_langs_gpkg(self):
269273
# ... as well as ignoring the translated models and alowing it again and the english one
270274
assert {'de','en'} == set(db_connector.get_available_languages(["PlansDAffectation_V1_2"]))
271275

272-
def test_translated_db_objects_pg(self):
276+
def test_translated_available_langs_pg(self):
273277
importer = iliimporter.Importer()
274278
importer.tool = DbIliMode.ili2pg
275279
importer.configuration = iliimporter_config(importer.tool)
@@ -306,7 +310,200 @@ def test_translated_db_objects_pg(self):
306310

307311
# ... as well as ignoring the translated models and alowing it again and the english one
308312
assert {'de','en'} == set(db_connector.get_available_languages(["PlansDAffectation_V1_2"]))
309-
313+
314+
def test_translated_namelang_gpkg(self):
315+
# same as translated_db_objects but this time is the schema in French (namelang) and the preferred language German.
316+
importer = iliimporter.Importer()
317+
importer.tool = DbIliMode.ili2gpkg
318+
importer.configuration = iliimporter_config(importer.tool)
319+
importer.configuration.ilimodels = "PlansDAffectation_V1_2"
320+
importer.configuration.dbfile = os.path.join(
321+
self.basetestpath, "tmp_translated_{:%Y%m%d%H%M%S%f}.gpkg".format(
322+
datetime.datetime.now()
323+
)
324+
)
325+
importer.configuration.inheritance = "smart2"
326+
importer.configuration.create_basket_col = True
327+
importer.configuration.name_lang = 'fr'
328+
importer.stdout.connect(self.print_info)
329+
importer.stderr.connect(self.print_error)
330+
assert importer.run() == iliimporter.Importer.SUCCESS
331+
332+
config_manager = GpkgCommandConfigManager(importer.configuration)
333+
uri = config_manager.get_uri()
334+
335+
generator = Generator(
336+
DbIliMode.ili2gpkg,
337+
uri,
338+
importer.configuration.inheritance,
339+
consider_basket_handling=True,
340+
preferred_language="de",
341+
)
342+
343+
available_layers = generator.layers()
344+
relations, _ = generator.relations(available_layers)
345+
legend = generator.legend(available_layers)
346+
347+
project = Project()
348+
project.layers = available_layers
349+
project.relations = relations
350+
project.legend = legend
351+
project.post_generate()
352+
353+
qgis_project = QgsProject.instance()
354+
project.create(None, qgis_project)
355+
356+
count = 0
357+
fr_layer = None
358+
for layer in available_layers:
359+
if layer.name == "affectationprimaire_surfacedezones":
360+
assert layer.alias == "Grundnutzung_Zonenflaeche"
361+
de_layer = layer.layer
362+
count += 1
363+
fields = de_layer.fields()
364+
field_idx = fields.lookupField("publiedepuis")
365+
assert field_idx != -1
366+
field = fields.field(field_idx)
367+
assert field.name() == "publiedepuis"
368+
assert field.alias() == "publiziertAb"
369+
370+
edit_form_config = de_layer.editFormConfig()
371+
tabs = edit_form_config.tabs()
372+
tab_list = [tab.name() for tab in tabs]
373+
expected_tab_list = [
374+
"General",
375+
"Dokument",
376+
"Objektbezogene_Festlegung",
377+
"Ueberlagernde_Festlegung",
378+
"Linienbezogene_Festlegung",
379+
]
380+
assert len(tab_list) == len(expected_tab_list)
381+
assert set(tab_list) == set(expected_tab_list)
382+
383+
# check domain table and translated domains
384+
if layer.name == "statutjuridique":
385+
count += 1
386+
assert layer.alias == "RechtsStatus"
387+
assert layer.layer.displayExpression() == "\n".join(
388+
[
389+
"CASE",
390+
"WHEN iliCode = 'AenderungOhneVorwirkung' THEN 'AenderungOhneVorwirkung'",
391+
"WHEN iliCode = 'inKraft' THEN 'inKraft'",
392+
"WHEN iliCode = 'AenderungMitVorwirkung' THEN 'AenderungMitVorwirkung'",
393+
"END",
394+
]
395+
)
396+
397+
# check if the layers have been considered
398+
assert count == 2
399+
assert de_layer
400+
401+
# Check translated relation
402+
rels = qgis_project.relationManager().referencedRelations(de_layer)
403+
assert len(rels) == 1
404+
assert (
405+
rels[0].id()
406+
== "geometrie_document_geometrie_affectationprimaire_surfacedezones_affectationprimaire_surfacedezones_T_Id"
407+
)
408+
assert (
409+
rels[0].name()
410+
== "Geometrie_Dokument_(Geometrie)_Grundnutzung_Zonenflaeche_(T_Id)"
411+
)
412+
413+
def test_translated_namelang_pg(self):
414+
# same as translated_db_objects but this time is the schema in French (namelang) and the preferred language German.
415+
importer = iliimporter.Importer()
416+
importer.tool = DbIliMode.ili2pg
417+
importer.configuration = iliimporter_config(importer.tool)
418+
importer.configuration.ilimodels = "PlansDAffectation_V1_2"
419+
importer.configuration.dbschema = "tid_{:%Y%m%d%H%M%S%f}".format(
420+
datetime.datetime.now()
421+
)
422+
importer.configuration.inheritance = "smart2"
423+
importer.configuration.create_basket_col = True
424+
importer.configuration.name_lang = 'fr'
425+
importer.stdout.connect(self.print_info)
426+
importer.stderr.connect(self.print_error)
427+
assert importer.run() == iliimporter.Importer.SUCCESS
428+
429+
generator = Generator(
430+
DbIliMode.ili2pg,
431+
get_pg_connection_string(),
432+
importer.configuration.inheritance,
433+
importer.configuration.dbschema,
434+
consider_basket_handling=True,
435+
preferred_language="de",
436+
)
437+
available_layers = generator.layers()
438+
relations, _ = generator.relations(available_layers)
439+
legend = generator.legend(available_layers)
440+
441+
project = Project()
442+
project.layers = available_layers
443+
project.relations = relations
444+
project.legend = legend
445+
project.post_generate()
446+
447+
qgis_project = QgsProject.instance()
448+
project.create(None, qgis_project)
449+
450+
count = 0
451+
fr_layer = None
452+
for layer in available_layers:
453+
if layer.name == "affectationprimaire_surfacedezones":
454+
assert layer.alias == "Grundnutzung_Zonenflaeche"
455+
de_layer = layer.layer
456+
count += 1
457+
fields = de_layer.fields()
458+
field_idx = fields.lookupField("publiedepuis")
459+
assert field_idx != -1
460+
field = fields.field(field_idx)
461+
assert field.name() == "publiedepuis"
462+
assert field.alias() == "publiziertAb"
463+
464+
edit_form_config = de_layer.editFormConfig()
465+
tabs = edit_form_config.tabs()
466+
tab_list = [tab.name() for tab in tabs]
467+
expected_tab_list = [
468+
"General",
469+
"Dokument",
470+
"Objektbezogene_Festlegung",
471+
"Ueberlagernde_Festlegung",
472+
"Linienbezogene_Festlegung",
473+
]
474+
assert len(tab_list) == len(expected_tab_list)
475+
assert set(tab_list) == set(expected_tab_list)
476+
477+
# check domain table and translated domains
478+
if layer.name == "statutjuridique":
479+
count += 1
480+
assert layer.alias == "RechtsStatus"
481+
assert layer.layer.displayExpression() == "\n".join(
482+
[
483+
"CASE",
484+
"WHEN iliCode = 'AenderungMitVorwirkung' THEN 'AenderungMitVorwirkung'",
485+
"WHEN iliCode = 'AenderungOhneVorwirkung' THEN 'AenderungOhneVorwirkung'",
486+
"WHEN iliCode = 'inKraft' THEN 'inKraft'",
487+
"END",
488+
]
489+
)
490+
491+
# check if the layers have been considered
492+
assert count == 2
493+
assert de_layer
494+
495+
# Check translated relation
496+
rels = qgis_project.relationManager().referencedRelations(de_layer)
497+
assert len(rels) == 1
498+
assert (
499+
rels[0].id()
500+
== "geometrie_document_geomtr_ffcttnrmr_srfcdznes_fkey"
501+
)
502+
assert (
503+
rels[0].name()
504+
== "Geometrie_Dokument_(Geometrie)_Grundnutzung_Zonenflaeche_(t_id)"
505+
)
506+
310507
def print_info(self, text):
311508
logging.info(text)
312509

0 commit comments

Comments
 (0)