def connect_features(self, source, target): """ Connects the source feature with the target feature. @param source: A QgsPointLocator.Match object. Its foreign key will be updated. A dialog will be opened which asks the user for which foreign key(s) he wants to update. @param target: A QgsPointLocator.Match object. This feature will be used as link target. Its obj_id attribute will be used as primary key. """ dlg = QDialog(self.iface.mainWindow()) dlg.setWindowTitle(self.tr('Select properties to connect')) dlg.setLayout(QFormLayout()) properties = list() for prop in self.network_element_sources[source.layer()]['fields']: if 'filter' in prop.keys(): if not prop['filter'](source, target): continue cbx = QCheckBox(prop['name']) cbx.setObjectName(prop['id']) if 'is_checked' in prop.keys(): cbx.setChecked(prop['is_checked'](source, target)) properties.append(cbx) dlg.layout().addWidget(cbx) btn_box = QDialogButtonBox( QDialogButtonBox.Ok | QDialogButtonBox.Cancel) dlg.layout().addWidget(btn_box) btn_box.accepted.connect(dlg.accept) btn_box.rejected.connect(dlg.reject) source_feature = self.get_feature_for_match(source) target_feature = self.get_feature_for_match(target) if dlg.exec_(): for cbx in properties: if cbx.isChecked(): source_feature[cbx.objectName()] = target_feature['obj_id'] if not source.layer().isEditable(): self.iface.messageBar().pushMessage('QGEP', self.tr('Layer "{layername}" is not in edit mode').format( layername=source.layer().name()), Qgis.Warning, 5) elif source.layer().updateFeature(source_feature): self.iface.messageBar().pushMessage('QGEP', self.tr('Connected {} to {}').format( source_feature['identifier'], target_feature['identifier']), Qgis.Info, 5) else: self.iface.messageBar().pushMessage('QGEP', self.tr( 'Error connecting features'), Qgis.Warning, 5) self.reset()