Skip to content

Commit

Permalink
Gracefully handle empty existing property values when creating auxiliary
Browse files Browse the repository at this point in the history
fields

Fixes #46403
  • Loading branch information
nyalldawson committed Feb 2, 2022
1 parent 20c289e commit 1f1e616
Show file tree
Hide file tree
Showing 2 changed files with 37 additions and 1 deletion.
5 changes: 4 additions & 1 deletion src/core/qgsauxiliarystorage.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -244,7 +244,10 @@ int QgsAuxiliaryLayer::createProperty( QgsPalLayerSettings::Property property, Q

// is there an existing property?
const QgsProperty existingProperty = c.property( property );
if ( existingProperty.propertyType() == QgsProperty::InvalidProperty || overwriteExisting )
if ( existingProperty.propertyType() == QgsProperty::InvalidProperty
|| ( existingProperty.propertyType() == QgsProperty::FieldBasedProperty && existingProperty.field().isEmpty() )
|| ( existingProperty.propertyType() == QgsProperty::ExpressionBasedProperty && existingProperty.expressionString().isEmpty() )
|| overwriteExisting )
{
const QgsProperty prop = QgsProperty::fromField( fieldName );
c.setProperty( property, prop );
Expand Down
33 changes: 33 additions & 0 deletions tests/src/python/test_qgsauxiliarystorage.py
Original file line number Diff line number Diff line change
Expand Up @@ -429,6 +429,39 @@ def testCreateProperty(self):
self.assertTrue(settings.dataDefinedProperties().property(key).isActive())
self.assertEqual(settings.dataDefinedProperties().property(key).asExpression(), 'coalesce("auxiliary_storage_labeling_positiony",$y + 20)')

# with existing but invalid field name
key = QgsPalLayerSettings.PositionY
settings = QgsPalLayerSettings()
settings.dataDefinedProperties().setProperty(key, QgsProperty.fromField(''))
vl.setLabeling(QgsVectorLayerSimpleLabeling(settings))

# even when asked to not overwrite existing, this is an invalid property and should be overwritten
index = QgsAuxiliaryLayer.createProperty(key, vl, False)
p = QgsPalLayerSettings.propertyDefinitions()[key]
afName = QgsAuxiliaryLayer.nameFromProperty(p, True)
afIndex = vl.fields().indexOf(afName)
self.assertEqual(index, afIndex)

settings = vl.labeling().settings()
self.assertTrue(settings.dataDefinedProperties().property(key).isActive())
self.assertEqual(settings.dataDefinedProperties().property(key).asExpression(), '"auxiliary_storage_labeling_positiony"')

# with existing valid field name
key = QgsPalLayerSettings.PositionY
settings = QgsPalLayerSettings()
settings.dataDefinedProperties().setProperty(key, QgsProperty.fromField('asd'))
vl.setLabeling(QgsVectorLayerSimpleLabeling(settings))

index = QgsAuxiliaryLayer.createProperty(key, vl, False)
p = QgsPalLayerSettings.propertyDefinitions()[key]
afName = QgsAuxiliaryLayer.nameFromProperty(p, True)
afIndex = vl.fields().indexOf(afName)
self.assertEqual(index, afIndex)

settings = vl.labeling().settings()
self.assertTrue(settings.dataDefinedProperties().property(key).isActive())
self.assertEqual(settings.dataDefinedProperties().property(key).asExpression(), 'coalesce("auxiliary_storage_labeling_positiony","asd")')

# with overwrite existing
key = QgsPalLayerSettings.Show
settings = QgsPalLayerSettings()
Expand Down

0 comments on commit 1f1e616

Please sign in to comment.