Skip to content

Commit a7d060b

Browse files
author
Hugo Mercier
authoredMar 14, 2019
Merge pull request #9494 from mhugo/force_provider_constraints
Allow the strength of provider constraints to be soft
2 parents 2be6c47 + 1eaa5bb commit a7d060b

File tree

8 files changed

+73
-72
lines changed

8 files changed

+73
-72
lines changed
 

‎python/core/auto_generated/qgsfieldconstraints.sip.in‎

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -83,8 +83,7 @@ is not present on this field.
8383

8484
void setConstraintStrength( Constraint constraint, ConstraintStrength strength );
8585
%Docstring
86-
Sets the strength of a constraint. Note that the strength of constraints which originate
87-
from a provider cannot be changed. Constraints default to ConstraintStrengthHard unless
86+
Sets the strength of a constraint. Constraints default to ConstraintStrengthHard unless
8887
explicitly changed.
8988

9089
.. seealso:: :py:func:`constraintStrength`

‎src/app/qgsattributesformproperties.cpp‎

Lines changed: 46 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -240,16 +240,17 @@ void QgsAttributesFormProperties::loadAttributeTypeDialog()
240240
delete mAttributeTypeDialog;
241241
mAttributeTypeDialog = new QgsAttributeTypeDialog( mLayer, index, mAttributeTypeFrame );
242242

243+
QgsFieldConstraints constraints = cfg.mFieldConstraints;
244+
243245
mAttributeTypeDialog->setAlias( cfg.mAlias );
244246
mAttributeTypeDialog->setComment( cfg.mComment );
245247
mAttributeTypeDialog->setFieldEditable( cfg.mEditable );
246248
mAttributeTypeDialog->setLabelOnTop( cfg.mLabelOnTop );
247-
mAttributeTypeDialog->setNotNull( cfg.mConstraints & QgsFieldConstraints::ConstraintNotNull );
248-
mAttributeTypeDialog->setNotNullEnforced( cfg.mConstraintStrength.value( QgsFieldConstraints::ConstraintNotNull, QgsFieldConstraints::ConstraintStrengthHard ) == QgsFieldConstraints::ConstraintStrengthHard );
249-
mAttributeTypeDialog->setUnique( cfg.mConstraints & QgsFieldConstraints::ConstraintUnique );
250-
mAttributeTypeDialog->setUniqueEnforced( cfg.mConstraintStrength.value( QgsFieldConstraints::ConstraintUnique, QgsFieldConstraints::ConstraintStrengthHard ) == QgsFieldConstraints::ConstraintStrengthHard );
249+
mAttributeTypeDialog->setNotNull( constraints.constraints() & QgsFieldConstraints::ConstraintNotNull );
250+
mAttributeTypeDialog->setNotNullEnforced( constraints.constraintStrength( QgsFieldConstraints::ConstraintNotNull ) == QgsFieldConstraints::ConstraintStrengthHard );
251+
mAttributeTypeDialog->setUnique( constraints.constraints() & QgsFieldConstraints::ConstraintUnique );
252+
mAttributeTypeDialog->setUniqueEnforced( constraints.constraintStrength( QgsFieldConstraints::ConstraintUnique ) == QgsFieldConstraints::ConstraintStrengthHard );
251253

252-
QgsFieldConstraints constraints = cfg.mFieldConstraints;
253254
QgsFieldConstraints::Constraints providerConstraints = nullptr;
254255
if ( constraints.constraintOrigin( QgsFieldConstraints::ConstraintNotNull ) == QgsFieldConstraints::ConstraintOriginProvider )
255256
providerConstraints |= QgsFieldConstraints::ConstraintNotNull;
@@ -259,9 +260,9 @@ void QgsAttributesFormProperties::loadAttributeTypeDialog()
259260
providerConstraints |= QgsFieldConstraints::ConstraintExpression;
260261
mAttributeTypeDialog->setProviderConstraints( providerConstraints );
261262

262-
mAttributeTypeDialog->setConstraintExpression( cfg.mConstraint );
263-
mAttributeTypeDialog->setConstraintExpressionDescription( cfg.mConstraintDescription );
264-
mAttributeTypeDialog->setConstraintExpressionEnforced( cfg.mConstraintStrength.value( QgsFieldConstraints::ConstraintExpression, QgsFieldConstraints::ConstraintStrengthHard ) == QgsFieldConstraints::ConstraintStrengthHard );
263+
mAttributeTypeDialog->setConstraintExpression( constraints.constraintExpression() );
264+
mAttributeTypeDialog->setConstraintExpressionDescription( constraints.constraintDescription() );
265+
mAttributeTypeDialog->setConstraintExpressionEnforced( constraints.constraintStrength( QgsFieldConstraints::ConstraintExpression ) == QgsFieldConstraints::ConstraintStrengthHard );
265266
mAttributeTypeDialog->setDefaultValueExpression( mLayer->defaultValueDefinition( index ).expression() );
266267
mAttributeTypeDialog->setApplyDefaultValueOnUpdate( mLayer->defaultValueDefinition( index ).applyOnUpdate() );
267268

@@ -287,54 +288,54 @@ void QgsAttributesFormProperties::storeAttributeTypeDialog()
287288
cfg.mLabelOnTop = mAttributeTypeDialog->labelOnTop();
288289
cfg.mAlias = mAttributeTypeDialog->alias();
289290

290-
//confustion (will be removed): wir laden teilweise sachen einfach beim store anstelle des applys auf die mLayer - eingie Sachen laden wir auch vom layer anstatt über das cfg. wieso
291-
QgsFieldConstraints constraints = mLayer->fields().at( mAttributeTypeDialog->fieldIdx() ).constraints();
292-
QgsFieldConstraints::Constraints providerConstraints = nullptr;
293-
if ( constraints.constraintOrigin( QgsFieldConstraints::ConstraintNotNull ) == QgsFieldConstraints::ConstraintOriginProvider )
294-
providerConstraints |= QgsFieldConstraints::ConstraintNotNull;
295-
if ( constraints.constraintOrigin( QgsFieldConstraints::ConstraintUnique ) == QgsFieldConstraints::ConstraintOriginProvider )
296-
providerConstraints |= QgsFieldConstraints::ConstraintUnique;
297-
if ( constraints.constraintOrigin( QgsFieldConstraints::ConstraintExpression ) == QgsFieldConstraints::ConstraintOriginProvider )
298-
providerConstraints |= QgsFieldConstraints::ConstraintExpression;
299-
cfg.mConstraints = nullptr;
300-
if ( mAttributeTypeDialog->notNull() && !( providerConstraints & QgsFieldConstraints::ConstraintNotNull ) )
291+
QgsFieldConstraints constraints;
292+
if ( mAttributeTypeDialog->notNull() )
301293
{
302-
cfg.mConstraints |= QgsFieldConstraints::ConstraintNotNull;
294+
constraints.setConstraint( QgsFieldConstraints::ConstraintNotNull );
303295
}
304-
if ( mAttributeTypeDialog->unique() && !( providerConstraints & QgsFieldConstraints::ConstraintUnique ) )
296+
else if ( mAttributeTypeDialog->notNullFromProvider() )
305297
{
306-
cfg.mConstraints |= QgsFieldConstraints::ConstraintUnique;
298+
constraints.setConstraint( QgsFieldConstraints::ConstraintNotNull, QgsFieldConstraints::ConstraintOriginProvider );
307299
}
308-
if ( !mAttributeTypeDialog->constraintExpression().isEmpty() && !( providerConstraints & QgsFieldConstraints::ConstraintExpression ) )
300+
301+
if ( mAttributeTypeDialog->unique() )
302+
{
303+
constraints.setConstraint( QgsFieldConstraints::ConstraintUnique );
304+
}
305+
else if ( mAttributeTypeDialog->uniqueFromProvider() )
306+
{
307+
constraints.setConstraint( QgsFieldConstraints::ConstraintUnique, QgsFieldConstraints::ConstraintOriginProvider );
308+
}
309+
310+
if ( !mAttributeTypeDialog->constraintExpression().isEmpty() )
309311
{
310-
cfg.mConstraints |= QgsFieldConstraints::ConstraintExpression;
312+
constraints.setConstraint( QgsFieldConstraints::ConstraintExpression );
311313
}
312314

313-
cfg.mConstraintDescription = mAttributeTypeDialog->constraintExpressionDescription();
314-
cfg.mConstraint = mAttributeTypeDialog->constraintExpression();
315+
constraints.setConstraintExpression( mAttributeTypeDialog->constraintExpressionDescription(), mAttributeTypeDialog->constraintExpression() );
316+
317+
constraints.setConstraintStrength( QgsFieldConstraints::ConstraintNotNull, mAttributeTypeDialog->notNullEnforced() ?
318+
QgsFieldConstraints::ConstraintStrengthHard : QgsFieldConstraints::ConstraintStrengthSoft );
319+
constraints.setConstraintStrength( QgsFieldConstraints::ConstraintUnique, mAttributeTypeDialog->uniqueEnforced() ?
320+
QgsFieldConstraints::ConstraintStrengthHard : QgsFieldConstraints::ConstraintStrengthSoft );
321+
constraints.setConstraintStrength( QgsFieldConstraints::ConstraintExpression, mAttributeTypeDialog->constraintExpressionEnforced() ?
322+
QgsFieldConstraints::ConstraintStrengthHard : QgsFieldConstraints::ConstraintStrengthSoft );
323+
324+
cfg.mFieldConstraints = constraints;
325+
315326
mLayer->setDefaultValueDefinition( mAttributeTypeDialog->fieldIdx(), QgsDefaultValue( mAttributeTypeDialog->defaultValueExpression(), mAttributeTypeDialog->applyDefaultValueOnUpdate() ) );
316327

317328
cfg.mEditorWidgetType = mAttributeTypeDialog->editorWidgetType();
318329
cfg.mEditorWidgetConfig = mAttributeTypeDialog->editorWidgetConfig();
319330

320-
cfg.mConstraintStrength.insert( QgsFieldConstraints::ConstraintNotNull, mAttributeTypeDialog->notNullEnforced() ?
321-
QgsFieldConstraints::ConstraintStrengthHard : QgsFieldConstraints::ConstraintStrengthSoft );
322-
cfg.mConstraintStrength.insert( QgsFieldConstraints::ConstraintUnique, mAttributeTypeDialog->uniqueEnforced() ?
323-
QgsFieldConstraints::ConstraintStrengthHard : QgsFieldConstraints::ConstraintStrengthSoft );
324-
cfg.mConstraintStrength.insert( QgsFieldConstraints::ConstraintExpression, mAttributeTypeDialog->constraintExpressionEnforced() ?
325-
QgsFieldConstraints::ConstraintStrengthHard : QgsFieldConstraints::ConstraintStrengthSoft );
326-
327331
QString fieldName = mLayer->fields().at( mAttributeTypeDialog->fieldIdx() ).name();
328332

329-
QTreeWidgetItemIterator itemIt( mAvailableWidgetsTree );
330-
while ( *itemIt )
333+
for ( auto itemIt = QTreeWidgetItemIterator( mAvailableWidgetsTree ); *itemIt; ++itemIt )
331334
{
332335
QTreeWidgetItem *item = *itemIt;
333336
if ( item->data( 0, FieldNameRole ).toString() == fieldName )
334337
item->setData( 0, FieldConfigRole, QVariant::fromValue<FieldConfig>( cfg ) );
335-
++itemIt;
336338
}
337-
338339
}
339340

340341

@@ -696,28 +697,29 @@ void QgsAttributesFormProperties::apply()
696697

697698
editFormConfig.setReadOnly( idx, !cfg.mEditable );
698699
editFormConfig.setLabelOnTop( idx, cfg.mLabelOnTop );
699-
mLayer->setConstraintExpression( idx, cfg.mConstraint, cfg.mConstraintDescription );
700700
mLayer->setEditorWidgetSetup( idx, QgsEditorWidgetSetup( cfg.mEditorWidgetType, cfg.mEditorWidgetConfig ) );
701701

702-
if ( cfg.mConstraints & QgsFieldConstraints::ConstraintNotNull )
702+
QgsFieldConstraints constraints = cfg.mFieldConstraints;
703+
mLayer->setConstraintExpression( idx, constraints.constraintExpression(), constraints.constraintDescription() );
704+
if ( constraints.constraints() & QgsFieldConstraints::ConstraintNotNull )
703705
{
704-
mLayer->setFieldConstraint( idx, QgsFieldConstraints::ConstraintNotNull, cfg.mConstraintStrength.value( QgsFieldConstraints::ConstraintNotNull, QgsFieldConstraints::ConstraintStrengthHard ) );
706+
mLayer->setFieldConstraint( idx, QgsFieldConstraints::ConstraintNotNull, constraints.constraintStrength( QgsFieldConstraints::ConstraintNotNull ) );
705707
}
706708
else
707709
{
708710
mLayer->removeFieldConstraint( idx, QgsFieldConstraints::ConstraintNotNull );
709711
}
710-
if ( cfg.mConstraints & QgsFieldConstraints::ConstraintUnique )
712+
if ( constraints.constraints() & QgsFieldConstraints::ConstraintUnique )
711713
{
712-
mLayer->setFieldConstraint( idx, QgsFieldConstraints::ConstraintUnique, cfg.mConstraintStrength.value( QgsFieldConstraints::ConstraintUnique, QgsFieldConstraints::ConstraintStrengthHard ) );
714+
mLayer->setFieldConstraint( idx, QgsFieldConstraints::ConstraintUnique, constraints.constraintStrength( QgsFieldConstraints::ConstraintUnique ) );
713715
}
714716
else
715717
{
716718
mLayer->removeFieldConstraint( idx, QgsFieldConstraints::ConstraintUnique );
717719
}
718-
if ( cfg.mConstraints & QgsFieldConstraints::ConstraintExpression )
720+
if ( constraints.constraints() & QgsFieldConstraints::ConstraintExpression )
719721
{
720-
mLayer->setFieldConstraint( idx, QgsFieldConstraints::ConstraintExpression, cfg.mConstraintStrength.value( QgsFieldConstraints::ConstraintExpression, QgsFieldConstraints::ConstraintStrengthHard ) );
722+
mLayer->setFieldConstraint( idx, QgsFieldConstraints::ConstraintExpression, constraints.constraintStrength( QgsFieldConstraints::ConstraintExpression ) );
721723
}
722724
else
723725
{
@@ -780,12 +782,6 @@ QgsAttributesFormProperties::FieldConfig::FieldConfig( QgsVectorLayer *layer, in
780782
&& layer->fields().fieldOrigin( idx ) != QgsFields::OriginExpression;
781783
mLabelOnTop = layer->editFormConfig().labelOnTop( idx );
782784
mFieldConstraints = layer->fields().at( idx ).constraints();
783-
mConstraints = mFieldConstraints.constraints();
784-
mConstraint = mFieldConstraints.constraintExpression();
785-
mConstraintStrength.insert( QgsFieldConstraints::ConstraintNotNull, mFieldConstraints.constraintStrength( QgsFieldConstraints::ConstraintNotNull ) );
786-
mConstraintStrength.insert( QgsFieldConstraints::ConstraintUnique, mFieldConstraints.constraintStrength( QgsFieldConstraints::ConstraintUnique ) );
787-
mConstraintStrength.insert( QgsFieldConstraints::ConstraintExpression, mFieldConstraints.constraintStrength( QgsFieldConstraints::ConstraintExpression ) );
788-
mConstraintDescription = mFieldConstraints.constraintDescription();
789785
const QgsEditorWidgetSetup setup = QgsGui::editorWidgetRegistry()->findBest( layer, layer->fields().field( idx ).name() );
790786
mEditorWidgetType = setup.type();
791787
mEditorWidgetConfig = setup.config();

‎src/app/qgsattributesformproperties.h‎

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -154,10 +154,6 @@ class APP_EXPORT QgsAttributesFormProperties : public QWidget, private Ui_QgsAtt
154154
bool mEditableEnabled = true ;
155155
bool mLabelOnTop = false ;
156156
QgsFieldConstraints mFieldConstraints;
157-
QgsFieldConstraints::Constraints mConstraints = nullptr;
158-
QHash< QgsFieldConstraints::Constraint, QgsFieldConstraints::ConstraintStrength > mConstraintStrength;
159-
QString mConstraint;
160-
QString mConstraintDescription;
161157
QPushButton *mButton = nullptr;
162158
QString mEditorWidgetType;
163159
QMap<QString, QVariant> mEditorWidgetConfig;

‎src/app/qgsattributetypedialog.cpp‎

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -194,17 +194,13 @@ void QgsAttributeTypeDialog::setProviderConstraints( QgsFieldConstraints::Constr
194194
notNullCheckBox->setChecked( true );
195195
notNullCheckBox->setEnabled( false );
196196
notNullCheckBox->setToolTip( tr( "The provider for this layer has a NOT NULL constraint set on the field." ) );
197-
mCheckBoxEnforceNotNull->setChecked( true );
198-
mCheckBoxEnforceNotNull->setEnabled( false );
199197
}
200198

201199
if ( constraints & QgsFieldConstraints::ConstraintUnique )
202200
{
203201
mUniqueCheckBox->setChecked( true );
204202
mUniqueCheckBox->setEnabled( false );
205203
mUniqueCheckBox->setToolTip( tr( "The provider for this layer has a UNIQUE constraint set on the field." ) );
206-
mCheckBoxEnforceUnique->setChecked( true );
207-
mCheckBoxEnforceUnique->setEnabled( false );
208204
}
209205
}
210206

@@ -230,7 +226,12 @@ QString QgsAttributeTypeDialog::constraintExpressionDescription()
230226

231227
bool QgsAttributeTypeDialog::notNull() const
232228
{
233-
return notNullCheckBox->isChecked();
229+
return notNullCheckBox->isEnabled() && notNullCheckBox->isChecked();
230+
}
231+
232+
bool QgsAttributeTypeDialog::notNullFromProvider() const
233+
{
234+
return ( !notNullCheckBox->isEnabled() ) && notNullCheckBox->isChecked();
234235
}
235236

236237
void QgsAttributeTypeDialog::setNotNullEnforced( bool enforced )
@@ -250,7 +251,12 @@ void QgsAttributeTypeDialog::setUnique( bool unique )
250251

251252
bool QgsAttributeTypeDialog::unique() const
252253
{
253-
return mUniqueCheckBox->isChecked();
254+
return mUniqueCheckBox->isEnabled() && mUniqueCheckBox->isChecked();
255+
}
256+
257+
bool QgsAttributeTypeDialog::uniqueFromProvider() const
258+
{
259+
return ( !mUniqueCheckBox->isEnabled() ) && mUniqueCheckBox->isChecked();
254260
}
255261

256262
void QgsAttributeTypeDialog::setUniqueEnforced( bool enforced )

‎src/app/qgsattributetypedialog.h‎

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,16 @@ class APP_EXPORT QgsAttributeTypeDialog: public QWidget, private Ui::QgsAttribut
103103
*/
104104
bool notNull() const;
105105

106+
/**
107+
* Returns whether the not null constraint is set by the provider
108+
*/
109+
bool notNullFromProvider() const;
110+
111+
/**
112+
* Returns whether the unique constraint is set by the provider
113+
*/
114+
bool uniqueFromProvider() const;
115+
106116
/**
107117
* Sets whether the not null constraint is enforced.
108118
*/

‎src/core/qgsfieldconstraints.cpp‎

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -35,12 +35,7 @@ QgsFieldConstraints::ConstraintStrength QgsFieldConstraints::constraintStrength(
3535

3636
void QgsFieldConstraints::setConstraintStrength( QgsFieldConstraints::Constraint constraint, QgsFieldConstraints::ConstraintStrength strength )
3737
{
38-
if ( constraintOrigin( constraint ) == ConstraintOriginProvider )
39-
{
40-
// cannot be overwritten
41-
return;
42-
}
43-
else if ( strength == ConstraintStrengthNotSet )
38+
if ( strength == ConstraintStrengthNotSet )
4439
{
4540
mConstraintStrengths.remove( constraint );
4641
}
@@ -62,7 +57,7 @@ void QgsFieldConstraints::setConstraint( QgsFieldConstraints::Constraint constra
6257
{
6358
mConstraints |= constraint;
6459
mConstraintOrigins.insert( constraint, origin );
65-
if ( !mConstraintStrengths.contains( constraint ) || origin == ConstraintOriginProvider )
60+
if ( !mConstraintStrengths.contains( constraint ) )
6661
{
6762
mConstraintStrengths.insert( constraint, ConstraintStrengthHard );
6863
}

‎src/core/qgsfieldconstraints.h‎

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -96,8 +96,7 @@ class CORE_EXPORT QgsFieldConstraints
9696
ConstraintStrength constraintStrength( Constraint constraint ) const;
9797

9898
/**
99-
* Sets the strength of a constraint. Note that the strength of constraints which originate
100-
* from a provider cannot be changed. Constraints default to ConstraintStrengthHard unless
99+
* Sets the strength of a constraint. Constraints default to ConstraintStrengthHard unless
101100
* explicitly changed.
102101
* \see constraintStrength()
103102
*/

‎tests/src/core/testqgsfield.cpp‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -174,7 +174,7 @@ void TestQgsField::gettersSetters()
174174
constraints.setConstraint( QgsFieldConstraints::ConstraintUnique, QgsFieldConstraints::ConstraintOriginProvider );
175175
constraints.setConstraintStrength( QgsFieldConstraints::ConstraintUnique, QgsFieldConstraints::ConstraintStrengthSoft );
176176
field.setConstraints( constraints );
177-
QCOMPARE( field.constraints().constraintStrength( QgsFieldConstraints::ConstraintUnique ), QgsFieldConstraints::ConstraintStrengthHard );
177+
QCOMPARE( field.constraints().constraintStrength( QgsFieldConstraints::ConstraintUnique ), QgsFieldConstraints::ConstraintStrengthSoft );
178178
}
179179

180180
void TestQgsField::isNumeric()

0 commit comments

Comments
 (0)
Please sign in to comment.