Skip to content

Commit

Permalink
Merge pull request #5142 from opengisch/backport-5141-to-release-3_2
Browse files Browse the repository at this point in the history
[Backport release-3_2] Now that we allow children creation prior to parent creation, we need to update default values to take possible children into consideration
  • Loading branch information
nirvn committed Mar 24, 2024
2 parents 1966625 + 4d4f46e commit 0e2d856
Showing 1 changed file with 22 additions and 13 deletions.
35 changes: 22 additions & 13 deletions src/core/featuremodel.cpp
Expand Up @@ -740,11 +740,13 @@ bool FeatureModel::create()
return false;
}

bool hasRelations = false;
QList<QPair<QgsRelation, QgsFeatureRequest>> revisitRelations;
if ( mProject )
{
// Gather any relationship children which would have relied on an auto-generated field value
const QList<QgsRelation> relations = mProject->relationManager()->referencedRelations( mLayer );
hasRelations = !relations.isEmpty();
QgsFeature temporaryFeature = mFeature;
for ( const QgsRelation &relation : relations )
{
Expand Down Expand Up @@ -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<QgsRelation, QgsFeatureRequest> &revisitRelation : std::as_const( revisitRelations ) )
setFeature( feat );

if ( hasRelations )
{
const QList<QgsRelation::FieldPair> 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<QgsRelation, QgsFeatureRequest> &revisitRelation : std::as_const( revisitRelations ) )
{
for ( const QgsRelation::FieldPair fieldPair : fieldPairs )
const QList<QgsRelation::FieldPair> 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 compute properly
updateDefaultValues();
save();
}
}
else
{
Expand Down

1 comment on commit 0e2d856

@qfield-fairy
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please sign in to comment.