Skip to content
Permalink
Browse files

Fix relations in offline editing

  • Loading branch information
m-kuhn committed Feb 23, 2017
1 parent 86c0a16 commit de966e2575cb5ffa99e0183a3b7d762b5dbd50a9
Showing with 30 additions and 0 deletions.
  1. +25 −0 src/core/qgsofflineediting.cpp
  2. +5 −0 src/core/qgsofflineediting.h
@@ -254,6 +254,7 @@ void QgsOfflineEditing::synchronize()

// copy style
copySymbology( offlineLayer, remoteLayer );
updateRelations( offlineLayer, remoteLayer );

// apply layer edit log
QString qgisLayerId = layer->id();
@@ -611,6 +612,7 @@ QgsVectorLayer* QgsOfflineEditing::copyVectorLayer( QgsVectorLayer* layer, sqlit
}
}

updateRelations( layer, newLayer );
// copy features
newLayer->startEditing();
QgsFeature f;
@@ -898,6 +900,29 @@ void QgsOfflineEditing::copySymbology( QgsVectorLayer* sourceLayer, QgsVectorLay
}
}

void QgsOfflineEditing::updateRelations( QgsVectorLayer* sourceLayer, QgsVectorLayer* targetLayer )
{
QgsRelationManager* relationManager = QgsProject::instance()->relationManager();
QList<QgsRelation> relations;
relations = relationManager->referencedRelations( sourceLayer );

Q_FOREACH ( QgsRelation relation, relations )
{
relationManager->removeRelation( relation );
relation.setReferencedLayer( targetLayer->id() );
relationManager->addRelation( relation );
}

relations = relationManager->referencingRelations( sourceLayer );

Q_FOREACH ( QgsRelation relation, relations )
{
relationManager->removeRelation( relation );
relation.setReferencingLayer( targetLayer->id() );
relationManager->addRelation( relation );
}
}

// NOTE: use this to map column indices in case the remote geometry column is not last
QMap<int, int> QgsOfflineEditing::attributeLookup( QgsVectorLayer* offlineLayer, QgsVectorLayer* remoteLayer )
{
@@ -108,6 +108,11 @@ class CORE_EXPORT QgsOfflineEditing : public QObject
void applyGeometryChanges( QgsVectorLayer* remoteLayer, sqlite3* db, int layerId, int commitNo );
void updateFidLookup( QgsVectorLayer* remoteLayer, sqlite3* db, int layerId );
void copySymbology( QgsVectorLayer* sourceLayer, QgsVectorLayer* targetLayer );

/**
* Updates all relations that reference or are referenced by the source layer to the targetLayer.
*/
void updateRelations( QgsVectorLayer* sourceLayer, QgsVectorLayer* targetLayer );
QMap<int, int> attributeLookup( QgsVectorLayer* offlineLayer, QgsVectorLayer* remoteLayer );

void showWarning( const QString& message );

0 comments on commit de966e2

Please sign in to comment.
You can’t perform that action at this time.