From 6ab87a17fee9ff00d3379391f6d0bed297fd82ac Mon Sep 17 00:00:00 2001 From: Alessandro Pasotti Date: Tue, 8 Oct 2024 09:52:42 +0200 Subject: [PATCH] Return NotSet when not set --- src/core/qgsfieldconstraints.cpp | 4 +- src/core/vector/qgsvectorlayer.cpp | 50 ++----------------------- tests/src/python/test_qgsvectorlayer.py | 20 ++++++++-- 3 files changed, 22 insertions(+), 52 deletions(-) diff --git a/src/core/qgsfieldconstraints.cpp b/src/core/qgsfieldconstraints.cpp index c9007529145f..371ea825b199 100644 --- a/src/core/qgsfieldconstraints.cpp +++ b/src/core/qgsfieldconstraints.cpp @@ -29,8 +29,8 @@ QgsFieldConstraints::ConstraintStrength QgsFieldConstraints::constraintStrength( if ( !( mConstraints & constraint ) ) return ConstraintStrengthNotSet; - // defaults to hard strength unless explicitly set - return mConstraintStrengths.value( constraint, ConstraintStrengthHard ); + // defaults to not set + return mConstraintStrengths.value( constraint, ConstraintStrengthNotSet ); } void QgsFieldConstraints::setConstraintStrength( QgsFieldConstraints::Constraint constraint, QgsFieldConstraints::ConstraintStrength strength ) diff --git a/src/core/vector/qgsvectorlayer.cpp b/src/core/vector/qgsvectorlayer.cpp index eaa62e0edce1..e41fcc853292 100644 --- a/src/core/vector/qgsvectorlayer.cpp +++ b/src/core/vector/qgsvectorlayer.cpp @@ -3141,53 +3141,11 @@ bool QgsVectorLayer::writeSymbology( QDomNode &node, QDomDocument &doc, QString { QDomElement constraintElem = doc.createElement( QStringLiteral( "constraint" ) ); constraintElem.setAttribute( QStringLiteral( "field" ), field.name() ); + constraintElem.setAttribute( QStringLiteral( "constraints" ), field.constraints().constraints() ); + constraintElem.setAttribute( QStringLiteral( "unique_strength" ), field.constraints().constraintStrength( QgsFieldConstraints::ConstraintUnique ) ); + constraintElem.setAttribute( QStringLiteral( "notnull_strength" ), field.constraints().constraintStrength( QgsFieldConstraints::ConstraintNotNull ) ); + constraintElem.setAttribute( QStringLiteral( "exp_strength" ), field.constraints().constraintStrength( QgsFieldConstraints::ConstraintExpression ) ); - // This manipulation is required because when the strength is set to NotSet the constraint is removed from - // the field but when the field is queried for the strength of a not-existing constraint it returns Hard by default, - // see issue #58431 - QgsFieldConstraints::Constraints constraints { mFieldConstraints.value( field.name() ) }; - QgsFieldConstraints::ConstraintStrength uniqueStrength { QgsFieldConstraints::ConstraintStrength::ConstraintStrengthNotSet }; - QgsFieldConstraints::ConstraintStrength notNullStrength { QgsFieldConstraints::ConstraintStrength::ConstraintStrengthNotSet }; - QgsFieldConstraints::ConstraintStrength expressionStrength { QgsFieldConstraints::ConstraintStrength::ConstraintStrengthNotSet }; - - QPair strengthKey { qMakePair( field.name(), QgsFieldConstraints::ConstraintUnique ) }; - - if ( mFieldConstraintStrength.contains( strengthKey ) && mFieldConstraintStrength.value( strengthKey ) == QgsFieldConstraints::ConstraintStrength::ConstraintStrengthNotSet ) - { - constraints.setFlag( QgsFieldConstraints::Constraint::ConstraintUnique, false ); - } - else - { - uniqueStrength = mFieldConstraintStrength.value( strengthKey ); - } - - strengthKey = qMakePair( field.name(), QgsFieldConstraints::ConstraintNotNull ); - - if ( mFieldConstraintStrength.contains( strengthKey ) && mFieldConstraintStrength.value( strengthKey ) == QgsFieldConstraints::ConstraintStrength::ConstraintStrengthNotSet ) - { - constraints.setFlag( QgsFieldConstraints::Constraint::ConstraintNotNull, false ); - } - else - { - notNullStrength = mFieldConstraintStrength.value( strengthKey ); - } - - strengthKey = qMakePair( field.name(), QgsFieldConstraints::ConstraintExpression ); - - if ( mFieldConstraintStrength.contains( strengthKey ) && mFieldConstraintStrength.value( strengthKey ) == QgsFieldConstraints::ConstraintStrength::ConstraintStrengthNotSet ) - { - constraints.setFlag( QgsFieldConstraints::Constraint::ConstraintExpression, false ); - } - else - { - expressionStrength = mFieldConstraintStrength.value( strengthKey ); - } - - - constraintElem.setAttribute( QStringLiteral( "constraints" ), constraints ); - constraintElem.setAttribute( QStringLiteral( "unique_strength" ), uniqueStrength ); - constraintElem.setAttribute( QStringLiteral( "notnull_strength" ), notNullStrength ); - constraintElem.setAttribute( QStringLiteral( "exp_strength" ), expressionStrength ); constraintsElem.appendChild( constraintElem ); } node.appendChild( constraintsElem ); diff --git a/tests/src/python/test_qgsvectorlayer.py b/tests/src/python/test_qgsvectorlayer.py index 14d6c3efc260..8a630a13878d 100644 --- a/tests/src/python/test_qgsvectorlayer.py +++ b/tests/src/python/test_qgsvectorlayer.py @@ -4675,18 +4675,30 @@ def test_selection_properties(self): self.assertEqual(vl2.selectionProperties().selectionColor(), QColor(255, 0, 0)) - def testConstraintsStrengthNotSet(self): - """Test issue GH #58431 when strength NotSet becomes Hard""" + def testConstraintsotSet(self): + """Test that a NotSet constraint does not become a Hard constraint + when saving and loading a layer style, see issue GH #58431""" # Create a memory layer with unique constraints layer = QgsVectorLayer("Point?field=fldtxt:string&field=fldint:integer", "test_unique", "memory") self.assertTrue(layer.isValid()) - # Se not constraint on fldtxt + # Se not constraints on fldtxt layer.setFieldConstraint(0, QgsFieldConstraints.Constraint.ConstraintNotNull, QgsFieldConstraints.ConstraintStrength.ConstraintStrengthSoft) layer.setFieldConstraint(0, QgsFieldConstraints.Constraint.ConstraintUnique, QgsFieldConstraints.ConstraintStrength.ConstraintStrengthNotSet) - # Export the style to QML + # Check constraints at the field level + field = layer.fields().at(0) + constraints = field.constraints() + self.assertEqual(constraints.constraintStrength(QgsFieldConstraints.Constraint.ConstraintNotNull), QgsFieldConstraints.ConstraintStrength.ConstraintStrengthSoft) + self.assertEqual(constraints.constraintStrength(QgsFieldConstraints.Constraint.ConstraintUnique), QgsFieldConstraints.ConstraintStrength.ConstraintStrengthNotSet) + + # Check constraints at the layer level + constraints = layer.fieldConstraintsAndStrength(0) + self.assertEquals(constraints[QgsFieldConstraints.Constraint.ConstraintNotNull], QgsFieldConstraints.ConstraintStrength.ConstraintStrengthSoft) + self.assertEquals(constraints[QgsFieldConstraints.Constraint.ConstraintUnique], QgsFieldConstraints.ConstraintStrength.ConstraintStrengthNotSet) + + # Export the style to QML and reload it style = QgsMapLayerStyle() temp_file = tempfile.mktemp(suffix='.qml') layer.saveNamedStyle(temp_file)