def create(self, path: str, qgis_project: QgsProject): qgis_project.setAutoTransaction(self.auto_transaction) qgis_project.setEvaluateDefaultValues(self.evaluate_default_values) qgis_layers = list() for layer in self.layers: qgis_layer = layer.create() self.layer_added.emit(qgis_layer.id()) if not self.crs and qgis_layer.isSpatial(): self.crs = qgis_layer.crs() qgis_layers.append(qgis_layer) qgis_project.addMapLayers(qgis_layers, not self.legend) if self.crs: if isinstance(self.crs, QgsCoordinateReferenceSystem): qgis_project.setCrs(self.crs) else: qgis_project.setCrs( QgsCoordinateReferenceSystem.fromEpsgId(self.crs)) qgis_relations = list( qgis_project.relationManager().relations().values()) dict_domains = { layer.layer.id(): layer.is_domain for layer in self.layers } for relation in self.relations: rel = relation.create(qgis_project, qgis_relations) assert rel.isValid() qgis_relations.append(rel) if rel.referencedLayerId() in dict_domains and dict_domains[ rel.referencedLayerId()]: editor_widget_setup = QgsEditorWidgetSetup( 'RelationReference', { 'Relation': rel.id(), 'ShowForm': False, 'OrderByValue': True, 'ShowOpenFormButton': False }) referencing_layer = rel.referencingLayer() referencing_layer.setEditorWidgetSetup( rel.referencingFields()[0], editor_widget_setup) qgis_project.relationManager().setRelations(qgis_relations) for layer in self.layers: layer.create_form(self) if self.legend: self.legend.create(qgis_project) if path: qgis_project.write(path)
def create(self, path: str, qgis_project: QgsProject): qgis_project.setAutoTransaction(self.auto_transaction) qgis_project.setEvaluateDefaultValues(self.evaluate_default_values) qgis_layers = list() for layer in self.layers: qgis_layer = layer.create() self.layer_added.emit(qgis_layer.id()) if not self.crs and qgis_layer.isSpatial(): self.crs = qgis_layer.crs() qgis_layers.append(qgis_layer) qgis_project.addMapLayers(qgis_layers, not self.legend) if self.crs: if isinstance(self.crs, QgsCoordinateReferenceSystem): qgis_project.setCrs(self.crs) else: crs = QgsCoordinateReferenceSystem.fromEpsgId(self.crs) if not crs.isValid(): crs = QgsCoordinateReferenceSystem(self.crs) # Fallback qgis_project.setCrs(crs) qgis_relations = list( qgis_project.relationManager().relations().values()) dict_layers = {layer.layer.id(): layer for layer in self.layers} for relation in self.relations: rel = relation.create(qgis_project, qgis_relations) assert rel.isValid() qgis_relations.append(rel) referenced_layer = dict_layers.get(rel.referencedLayerId(), None) referencing_layer = dict_layers.get(rel.referencingLayerId(), None) if referenced_layer and referenced_layer.is_domain: editor_widget_setup = QgsEditorWidgetSetup( "RelationReference", { "Relation": rel.id(), "ShowForm": False, "OrderByValue": True, "ShowOpenFormButton": False, "AllowNULL": True, "FilterExpression": "\"{}\" = '{}'".format(ENUM_THIS_CLASS_COLUMN, relation.child_domain_name) if relation.child_domain_name else "", "FilterFields": list(), }, ) elif referenced_layer and referenced_layer.is_basket_table: editor_widget_setup = QgsEditorWidgetSetup( "RelationReference", { "Relation": rel.id(), "ShowForm": False, "OrderByValue": True, "ShowOpenFormButton": False, "AllowNULL": True, "AllowAddFeatures": False, "FilterExpression": "\"topic\" = '{}' and attribute(get_feature('{}', 't_id', \"dataset\"), 'datasetname') != '{}'" .format( referencing_layer.model_topic_name, "T_ILI2DB_DATASET" if referenced_layer.provider == "ogr" else "t_ili2db_dataset", CATALOGUE_DATASETNAME, ) if referencing_layer.model_topic_name else "", "FilterFields": list(), }, ) else: editor_widget_setup = QgsEditorWidgetSetup( "RelationReference", { "Relation": rel.id(), "ShowForm": False, "OrderByValue": True, "ShowOpenFormButton": False, "AllowAddFeatures": True, "AllowNULL": True, }, ) referencing_layer = rel.referencingLayer() referencing_layer.setEditorWidgetSetup(rel.referencingFields()[0], editor_widget_setup) qgis_project.relationManager().setRelations(qgis_relations) # Set Bag of Enum widget for layer_name, bag_of_enum in self.bags_of_enum.items(): for attribute, bag_of_enum_info in bag_of_enum.items(): layer_obj = bag_of_enum_info[0] cardinality = bag_of_enum_info[1] domain_table = bag_of_enum_info[2] key_field = bag_of_enum_info[3] value_field = bag_of_enum_info[4] minimal_selection = cardinality.startswith("1") current_layer = layer_obj.create() field_widget = "ValueRelation" field_widget_config = { "AllowMulti": True, "UseCompleter": False, "Value": value_field, "OrderByValue": False, "AllowNull": True, "Layer": domain_table.create().id(), "FilterExpression": "", "Key": key_field, "NofColumns": 1, } field_idx = current_layer.fields().indexOf(attribute) setup = QgsEditorWidgetSetup(field_widget, field_widget_config) current_layer.setEditorWidgetSetup(field_idx, setup) if minimal_selection: constraint_expression = 'array_length("{}")>0'.format( attribute) current_layer.setConstraintExpression( field_idx, constraint_expression, self.tr("The minimal selection is 1"), ) for layer in self.layers: layer.create_form(self) if self.legend: self.legend.create(qgis_project) custom_layer_order = list() for custom_layer_name in self.custom_layer_order_structure: custom_layer = qgis_project.mapLayersByName(custom_layer_name) if custom_layer: custom_layer_order.append(custom_layer[0]) if custom_layer_order: root = qgis_project.layerTreeRoot() order = root.customLayerOrder() if root.hasCustomLayerOrder( ) else [] order.extend(custom_layer_order) root.setCustomLayerOrder(custom_layer_order) root.setHasCustomLayerOrder(True) if path: qgis_project.write(path)
def create(self, path: str, qgis_project: QgsProject, group: QgsLayerTreeGroup): qgis_project.setAutoTransaction(self.auto_transaction) qgis_project.setEvaluateDefaultValues(self.evaluate_default_values) qgis_layers = list() for layer in self.layers: qgis_layer = layer.create() self.layer_added.emit(qgis_layer.id()) if not self.crs and qgis_layer.isSpatial(): self.crs = qgis_layer.crs() qgis_layers.append(qgis_layer) qgis_project.addMapLayers(qgis_layers, not self.legend) if self.crs: if isinstance(self.crs, QgsCoordinateReferenceSystem): qgis_project.setCrs(self.crs) else: crs = QgsCoordinateReferenceSystem.fromEpsgId(self.crs) if not crs.isValid(): crs = QgsCoordinateReferenceSystem(self.crs) # Fallback qgis_project.setCrs(crs) qgis_relations = list( qgis_project.relationManager().relations().values()) dict_domains = { layer.layer.id(): layer.is_domain for layer in self.layers } for relation in self.relations: rel = relation.create(qgis_project, qgis_relations) assert rel.isValid() qgis_relations.append(rel) referencing_layer = rel.referencingLayer() referencing_field_constraints = referencing_layer.fieldConstraints( rel.referencingFields()[0]) allow_null = not bool(referencing_field_constraints & QgsFieldConstraints.ConstraintNotNull) # If we have an extended ili2db domain, we need to filter its values filter_expression = "\"{}\" = '{}'".format( ENUM_THIS_CLASS_COLUMN, relation.child_domain_name ) if relation.child_domain_name else '' if rel.referencedLayerId() in dict_domains and dict_domains[ rel.referencedLayerId()]: editor_widget_setup = QgsEditorWidgetSetup( 'RelationReference', { 'Relation': rel.id(), 'ShowForm': False, 'OrderByValue': True, 'ShowOpenFormButton': False, 'AllowNULL': allow_null, 'FilterExpression': filter_expression, 'FilterFields': list() }) else: editor_widget_setup = QgsEditorWidgetSetup( 'RelationReference', { 'Relation': rel.id(), 'ShowForm': False, 'OrderByValue': True, 'ShowOpenFormButton': False, 'AllowAddFeatures': True, 'AllowNULL': allow_null }) referencing_layer = rel.referencingLayer() referencing_layer.setEditorWidgetSetup(rel.referencingFields()[0], editor_widget_setup) qgis_project.relationManager().setRelations(qgis_relations) # Set Bag of Enum widget for layer_name, bag_of_enum in self.bags_of_enum.items(): for attribute, bag_of_enum_info in bag_of_enum.items(): layer_obj = bag_of_enum_info[0] cardinality = bag_of_enum_info[1] domain_table = bag_of_enum_info[2] key_field = bag_of_enum_info[3] value_field = bag_of_enum_info[4] minimal_selection = cardinality.startswith('1') current_layer = layer_obj.create() field_widget = 'ValueRelation' field_widget_config = { 'AllowMulti': True, 'UseCompleter': False, 'Value': value_field, 'OrderByValue': False, 'AllowNull': True, 'Layer': domain_table.create().id(), 'FilterExpression': '', 'Key': key_field, 'NofColumns': 1 } field_idx = current_layer.fields().indexOf(attribute) setup = QgsEditorWidgetSetup(field_widget, field_widget_config) current_layer.setEditorWidgetSetup(field_idx, setup) if minimal_selection: constraint_expression = 'array_length("{}")>0'.format( attribute) current_layer.setConstraintExpression( field_idx, constraint_expression, self.tr('The minimal selection is 1')) for layer in self.layers: layer.create_form(self) if self.legend: self.legend.create(qgis_project, group) if path: qgis_project.write(path)
def create(self, path: str, qgis_project: QgsProject): qgis_project.setAutoTransaction(self.auto_transaction) qgis_project.setEvaluateDefaultValues(self.evaluate_default_values) qgis_layers = list() for layer in self.layers: qgis_layer = layer.create() self.layer_added.emit(qgis_layer.id()) if not self.crs and qgis_layer.isSpatial(): self.crs = qgis_layer.crs() qgis_layers.append(qgis_layer) qgis_project.addMapLayers(qgis_layers, not self.legend) if self.crs: if isinstance(self.crs, QgsCoordinateReferenceSystem): qgis_project.setCrs(self.crs) else: qgis_project.setCrs( QgsCoordinateReferenceSystem.fromEpsgId(self.crs)) qgis_relations = list( qgis_project.relationManager().relations().values()) dict_domains = { layer.layer.id(): layer.is_domain for layer in self.layers } for relation in self.relations: rel = relation.create(qgis_project, qgis_relations) assert rel.isValid() qgis_relations.append(rel) if rel.referencedLayerId() in dict_domains and dict_domains[ rel.referencedLayerId()]: editor_widget_setup = QgsEditorWidgetSetup( 'RelationReference', { 'Relation': rel.id(), 'ShowForm': False, 'OrderByValue': True, 'ShowOpenFormButton': False }) else: editor_widget_setup = QgsEditorWidgetSetup( 'RelationReference', { 'Relation': rel.id(), 'ShowForm': False, 'OrderByValue': True, 'ShowOpenFormButton': False, 'AllowAddFeatures': True }) referencing_layer = rel.referencingLayer() referencing_layer.setEditorWidgetSetup(rel.referencingFields()[0], editor_widget_setup) qgis_project.relationManager().setRelations(qgis_relations) # Set Bag of Enum widget for layer_name, bag_of_enum in self.bags_of_enum.items(): for attribute, bag_of_enum_info in bag_of_enum.items(): layer_obj = bag_of_enum_info[0] cardinality = bag_of_enum_info[1] domain_table = bag_of_enum_info[2] key_field = bag_of_enum_info[3] value_field = bag_of_enum_info[4] allow_null = cardinality.startswith('0') allow_multi = cardinality.endswith('*') current_layer = layer_obj.create() field_widget = 'ValueRelation' field_widget_config = { 'AllowMulti': allow_multi, 'UseCompleter': False, 'Value': value_field, 'OrderByValue': False, 'AllowNull': allow_null, 'Layer': domain_table.create().id(), 'FilterExpression': '', 'Key': key_field, 'NofColumns': 1 } field_idx = current_layer.fields().indexOf(attribute) setup = QgsEditorWidgetSetup(field_widget, field_widget_config) current_layer.setEditorWidgetSetup(field_idx, setup) for layer in self.layers: layer.create_form(self) if self.legend: self.legend.create(qgis_project) if path: qgis_project.write(path)