Gracefully handle empty existing property values when creating auxiliary

fields

Fixes #46403
This commit is contained in:
Nyall Dawson 2022-01-31 17:03:08 +10:00
parent adacc90294
commit 304475806f
2 changed files with 37 additions and 1 deletions

View File

@ -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 );

View File

@ -429,6 +429,39 @@ class TestQgsAuxiliaryStorage(unittest.TestCase):
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()