From 22d4ef8fbf6bea3b4df176af096d3412f3bf67ec Mon Sep 17 00:00:00 2001 From: Mathieu Pellerin Date: Sun, 24 Mar 2024 15:01:43 +0700 Subject: [PATCH 1/2] Now that we allow children creation prior to parent creation, we need to update default values to take possible children into consideration --- src/core/featuremodel.cpp | 35 ++++++++++++++++++++++------------- 1 file changed, 22 insertions(+), 13 deletions(-) diff --git a/src/core/featuremodel.cpp b/src/core/featuremodel.cpp index b500ebdfd5..1170e36472 100644 --- a/src/core/featuremodel.cpp +++ b/src/core/featuremodel.cpp @@ -740,11 +740,13 @@ bool FeatureModel::create() return false; } + bool hasRelations = false; QList> revisitRelations; if ( mProject ) { // Gather any relationship children which would have relied on an auto-generated field value const QList relations = mProject->relationManager()->referencedRelations( mLayer ); + hasRelations = !relations.isEmpty(); QgsFeature temporaryFeature = mFeature; for ( const QgsRelation &relation : relations ) { @@ -781,25 +783,32 @@ bool FeatureModel::create() QgsFeature feat; if ( mLayer->getFeatures( QgsFeatureRequest().setFilterFid( createdFeatureId ) ).nextFeature( feat ) ) { - // Revisit relations in need of attribute updates - for ( const QPair &revisitRelation : std::as_const( revisitRelations ) ) + setFeature( feat ); + + if ( hasRelations ) { - const QList fieldPairs = revisitRelation.first.fieldPairs(); - revisitRelation.first.referencingLayer()->startEditing(); - QgsFeatureIterator it = revisitRelation.first.referencingLayer()->getFeatures( revisitRelation.second ); - QgsFeature childFeature; - while ( it.nextFeature( childFeature ) ) + // Revisit relations in need of attribute updates + for ( const QPair &revisitRelation : std::as_const( revisitRelations ) ) { - for ( const QgsRelation::FieldPair fieldPair : fieldPairs ) + const QList fieldPairs = revisitRelation.first.fieldPairs(); + revisitRelation.first.referencingLayer()->startEditing(); + QgsFeatureIterator it = revisitRelation.first.referencingLayer()->getFeatures( revisitRelation.second ); + QgsFeature childFeature; + while ( it.nextFeature( childFeature ) ) { - childFeature.setAttribute( fieldPair.referencingField(), feat.attribute( fieldPair.referencedField() ) ); + for ( const QgsRelation::FieldPair fieldPair : fieldPairs ) + { + childFeature.setAttribute( fieldPair.referencingField(), feat.attribute( fieldPair.referencedField() ) ); + } + revisitRelation.first.referencingLayer()->updateFeature( childFeature ); } - revisitRelation.first.referencingLayer()->updateFeature( childFeature ); + revisitRelation.first.referencingLayer()->commitChanges(); } - revisitRelation.first.referencingLayer()->commitChanges(); - } - setFeature( feat ); + // We need to update default values after creation to insure expression relying on relation children computer properly + updateDefaultValues(); + save(); + } } else { From 4d4f46e7e4c2514ad5164fab62908fe64d1c2cd0 Mon Sep 17 00:00:00 2001 From: Mathieu Pellerin Date: Sun, 24 Mar 2024 16:54:37 +0700 Subject: [PATCH 2/2] fix typo Co-authored-by: Matthias Kuhn --- src/core/featuremodel.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/core/featuremodel.cpp b/src/core/featuremodel.cpp index 1170e36472..04e1377a3e 100644 --- a/src/core/featuremodel.cpp +++ b/src/core/featuremodel.cpp @@ -805,7 +805,7 @@ bool FeatureModel::create() revisitRelation.first.referencingLayer()->commitChanges(); } - // We need to update default values after creation to insure expression relying on relation children computer properly + // We need to update default values after creation to insure expression relying on relation children compute properly updateDefaultValues(); save(); }