Skip to content

Commit

Permalink
Return NotSet when not set
Browse files Browse the repository at this point in the history
  • Loading branch information
elpaso committed Oct 8, 2024
1 parent 29d0c98 commit 6ab87a1
Show file tree
Hide file tree
Showing 3 changed files with 22 additions and 52 deletions.
4 changes: 2 additions & 2 deletions src/core/qgsfieldconstraints.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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 )
Expand Down
50 changes: 4 additions & 46 deletions src/core/vector/qgsvectorlayer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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<QString, QgsFieldConstraints::Constraint> 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 );
Expand Down
20 changes: 16 additions & 4 deletions tests/src/python/test_qgsvectorlayer.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down

0 comments on commit 6ab87a1

Please sign in to comment.