Skip to content

Commit

Permalink
always return correct field-alias mapping from attributeAliases() call (
Browse files Browse the repository at this point in the history
fix #31870)

populate attribute aliases map when constructing vector layer to provide
consistent results from attributeAliases() call even if no aliases set
(fix #31870)
  • Loading branch information
alexbruy committed Apr 24, 2020
1 parent ff7b2e8 commit 715f4c7
Show file tree
Hide file tree
Showing 3 changed files with 17 additions and 8 deletions.
5 changes: 4 additions & 1 deletion src/core/qgsfieldmodel.cpp
Expand Up @@ -33,7 +33,10 @@ QModelIndex QgsFieldModel::indexFromName( const QString &fieldName )
{
QString fldName( fieldName ); // we may need a copy

if ( mLayer )
// only non-empty names should be used here, as by default all fields
// have no aliases set and calling key() fill return just first value
// from the aliases map
if ( mLayer && !fldName.isEmpty() )
{
// the name could be an alias
// it would be better to have "display name" directly in QgsFields
Expand Down
18 changes: 11 additions & 7 deletions src/core/qgsvectorlayer.cpp
Expand Up @@ -178,6 +178,11 @@ QgsVectorLayer::QgsVectorLayer( const QString &vectorLayerPath,
setDataSource( vectorLayerPath, baseName, providerKey, providerOptions, options.loadDefaultStyle );
}

for ( const QgsField &field : qgis::as_const( mFields ) )
{
mAttributeAliasMap.insert( field.name(), QString() );
}

connect( this, &QgsVectorLayer::selectionChanged, this, [ = ] { triggerRepaint(); } );
connect( QgsProject::instance()->relationManager(), &QgsRelationManager::relationsLoaded, this, &QgsVectorLayer::onRelationsLoaded );

Expand All @@ -190,7 +195,6 @@ QgsVectorLayer::QgsVectorLayer( const QString &vectorLayerPath,
mSimplifyMethod.setThreshold( settings.value( QStringLiteral( "qgis/simplifyDrawingTol" ), mSimplifyMethod.threshold() ).toFloat() );
mSimplifyMethod.setForceLocalOptimization( settings.value( QStringLiteral( "qgis/simplifyLocal" ), mSimplifyMethod.forceLocalOptimization() ).toBool() );
mSimplifyMethod.setMaximumScale( settings.value( QStringLiteral( "qgis/simplifyMaxScale" ), mSimplifyMethod.maximumScale() ).toFloat() );

} // QgsVectorLayer ctor


Expand Down Expand Up @@ -2623,7 +2627,7 @@ bool QgsVectorLayer::writeSymbology( QDomNode &node, QDomDocument &doc, QString
node.appendChild( fieldConfigurationElement );

int index = 0;
for ( const QgsField &field : mFields )
for ( const QgsField &field : qgis::as_const( mFields ) )
{
QDomElement fieldElement = doc.createElement( QStringLiteral( "field" ) );
fieldElement.setAttribute( QStringLiteral( "name" ), field.name() );
Expand All @@ -2647,7 +2651,7 @@ bool QgsVectorLayer::writeSymbology( QDomNode &node, QDomDocument &doc, QString

//attribute aliases
QDomElement aliasElem = doc.createElement( QStringLiteral( "aliases" ) );
for ( const QgsField &field : mFields )
for ( const QgsField &field : qgis::as_const( mFields ) )
{
QDomElement aliasEntryElem = doc.createElement( QStringLiteral( "alias" ) );
aliasEntryElem.setAttribute( QStringLiteral( "field" ), field.name() );
Expand Down Expand Up @@ -2683,7 +2687,7 @@ bool QgsVectorLayer::writeSymbology( QDomNode &node, QDomDocument &doc, QString

//default expressions
QDomElement defaultsElem = doc.createElement( QStringLiteral( "defaults" ) );
for ( const QgsField &field : mFields )
for ( const QgsField &field : qgis::as_const( mFields ) )
{
QDomElement defaultElem = doc.createElement( QStringLiteral( "default" ) );
defaultElem.setAttribute( QStringLiteral( "field" ), field.name() );
Expand All @@ -2695,7 +2699,7 @@ bool QgsVectorLayer::writeSymbology( QDomNode &node, QDomDocument &doc, QString

// constraints
QDomElement constraintsElem = doc.createElement( QStringLiteral( "constraints" ) );
for ( const QgsField &field : mFields )
for ( const QgsField &field : qgis::as_const( mFields ) )
{
QDomElement constraintElem = doc.createElement( QStringLiteral( "constraint" ) );
constraintElem.setAttribute( QStringLiteral( "field" ), field.name() );
Expand All @@ -2709,7 +2713,7 @@ bool QgsVectorLayer::writeSymbology( QDomNode &node, QDomDocument &doc, QString

// constraint expressions
QDomElement constraintExpressionsElem = doc.createElement( QStringLiteral( "constraintExpressions" ) );
for ( const QgsField &field : mFields )
for ( const QgsField &field : qgis::as_const( mFields ) )
{
QDomElement constraintExpressionElem = doc.createElement( QStringLiteral( "constraint" ) );
constraintExpressionElem.setAttribute( QStringLiteral( "field" ), field.name() );
Expand Down Expand Up @@ -3481,7 +3485,7 @@ QString QgsVectorLayer::displayExpression() const
QStringLiteral( "id" )};
for ( const QString &candidate : sCandidates )
{
for ( const QgsField &field : mFields )
for ( const QgsField &field : qgis::as_const( mFields ) )
{
QString fldName = field.name();
if ( fldName.indexOf( candidate, 0, Qt::CaseInsensitive ) > -1 )
Expand Down
2 changes: 2 additions & 0 deletions tests/src/python/test_qgsvectorlayer.py
Expand Up @@ -2302,6 +2302,8 @@ def testGetSetAliases(self):
""" test getting and setting aliases """
layer = createLayerWithOnePoint()

self.assertEqual(len(layer.attributeAliases()), 2)

self.assertFalse(layer.attributeAlias(0))
self.assertFalse(layer.attributeAlias(1))
self.assertFalse(layer.attributeAlias(2))
Expand Down

0 comments on commit 715f4c7

Please sign in to comment.