Skip to content

Commit

Permalink
Constraints fail on non existent joined fields
Browse files Browse the repository at this point in the history
  • Loading branch information
pblottiere committed Jul 24, 2017
1 parent 94034c5 commit 588fe49
Show file tree
Hide file tree
Showing 2 changed files with 63 additions and 38 deletions.
82 changes: 50 additions & 32 deletions src/gui/editorwidgets/core/qgseditorwidgetwrapper.cpp
Expand Up @@ -126,53 +126,71 @@ void QgsEditorWidgetWrapper::updateConstraint( const QgsFeature &ft, QgsFieldCon

void QgsEditorWidgetWrapper::updateConstraint( const QgsVectorLayer *layer, int index, const QgsFeature &ft, QgsFieldConstraints::ConstraintOrigin constraintOrigin )
{
QStringList errors;
QStringList softErrors;
QStringList expressions;
QStringList descriptions;
bool toEmit( false );
QgsField field = layer->fields().at( index );
bool hardConstraintsOk( true );
bool softConstraintsOk( true );

QgsField field = layer->fields().at( index );
QString expression = field.constraints().constraintExpression();
QStringList expressions, descriptions;

if ( ! expression.isEmpty() )
{
expressions << expression;
descriptions << field.constraints().constraintDescription();
toEmit = true;
}

if ( field.constraints().constraints() & QgsFieldConstraints::ConstraintNotNull )
if ( ft.isValid() )
{
descriptions << tr( "Not NULL" );
if ( !expression.isEmpty() )
if ( ! expression.isEmpty() )
{
expressions << field.name() + QStringLiteral( " IS NOT NULL" );
expressions << expression;
descriptions << field.constraints().constraintDescription();
toEmit = true;
}
else
{
expressions << QStringLiteral( "IS NOT NULL" );
}
toEmit = true;
}

if ( field.constraints().constraints() & QgsFieldConstraints::ConstraintUnique )
{
descriptions << tr( "Unique" );
if ( !expression.isEmpty() )
if ( field.constraints().constraints() & QgsFieldConstraints::ConstraintNotNull )
{
expressions << field.name() + QStringLiteral( " IS UNIQUE" );
descriptions << tr( "Not NULL" );
if ( !expression.isEmpty() )
{
expressions << field.name() + QStringLiteral( " IS NOT NULL" );
}
else
{
expressions << QStringLiteral( "IS NOT NULL" );
}
toEmit = true;
}
else

if ( field.constraints().constraints() & QgsFieldConstraints::ConstraintUnique )
{
expressions << QStringLiteral( "IS UNIQUE" );
descriptions << tr( "Unique" );
if ( !expression.isEmpty() )
{
expressions << field.name() + QStringLiteral( " IS UNIQUE" );
}
else
{
expressions << QStringLiteral( "IS UNIQUE" );
}
toEmit = true;
}
toEmit = true;

hardConstraintsOk = QgsVectorLayerUtils::validateAttribute( layer, ft, index, errors, QgsFieldConstraints::ConstraintStrengthHard, constraintOrigin );

softConstraintsOk = QgsVectorLayerUtils::validateAttribute( layer, ft, index, softErrors, QgsFieldConstraints::ConstraintStrengthSoft, constraintOrigin );
errors << softErrors;
}
else // invalid feature
{
if ( ! expression.isEmpty() )
{
hardConstraintsOk = true;
softConstraintsOk = false;

QStringList errors;
bool hardConstraintsOk = QgsVectorLayerUtils::validateAttribute( layer, ft, index, errors, QgsFieldConstraints::ConstraintStrengthHard, constraintOrigin );
errors << "Invalid feature";

QStringList softErrors;
bool softConstraintsOk = QgsVectorLayerUtils::validateAttribute( layer, ft, index, softErrors, QgsFieldConstraints::ConstraintStrengthSoft, constraintOrigin );
errors << softErrors;
toEmit = true;
}
}

mValidConstraint = hardConstraintsOk && softConstraintsOk;
mIsBlockingCommit = !hardConstraintsOk;
Expand Down
19 changes: 13 additions & 6 deletions src/gui/qgsattributeform.cpp
Expand Up @@ -747,15 +747,23 @@ void QgsAttributeForm::updateConstraint( const QgsFeature &ft, QgsEditorWidgetWr
{
QgsFieldConstraints::ConstraintOrigin constraintOrigin = mLayer->isEditable() ? QgsFieldConstraints::ConstraintOriginNotSet : QgsFieldConstraints::ConstraintOriginLayer;

if ( eww->layer()->fields().fieldOrigin( QgsFields::OriginJoin ) )
if ( eww->layer()->fields().fieldOrigin( eww->fieldIdx() ) == QgsFields::OriginJoin )
{
int srcFieldIdx;
const QgsVectorLayerJoinInfo *info = eww->layer()->joinBuffer()->joinForFieldIndex( eww->fieldIdx(), eww->layer()->fields(), srcFieldIdx );

if ( info && info->joinLayer() && mJoinedFeatures.contains( info ) && info->isDynamicFormEnabled() )
if ( info && info->joinLayer() && info->isDynamicFormEnabled() )
{
eww->updateConstraint( info->joinLayer(), srcFieldIdx, mJoinedFeatures[info], constraintOrigin );
return;
if ( mJoinedFeatures.contains( info ) )
{
eww->updateConstraint( info->joinLayer(), srcFieldIdx, mJoinedFeatures[info], constraintOrigin );
return;
}
else // if we are here, it means there's not joined field for this feature
{
eww->updateConstraint( QgsFeature() );
return;
}
}
}

Expand Down Expand Up @@ -1972,8 +1980,7 @@ void QgsAttributeForm::updateJoinedFields( const QgsEditorWidgetWrapper &eww )

QgsFeature joinFeature = mLayer->joinBuffer()->joinedFeatureOf( info, formFeature );

if ( joinFeature.isValid() )
mJoinedFeatures[info] = joinFeature;
mJoinedFeatures[info] = joinFeature;

QStringList *subsetFields = info->joinFieldNamesSubset();
if ( subsetFields )
Expand Down

0 comments on commit 588fe49

Please sign in to comment.