Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Fixes #45198 : Don't return default value when null
  • Loading branch information
troopa81 committed Sep 22, 2021
1 parent c2243a7 commit 26ae6d7
Show file tree
Hide file tree
Showing 2 changed files with 42 additions and 3 deletions.
10 changes: 7 additions & 3 deletions src/core/qgsfieldformatter.cpp
Expand Up @@ -19,7 +19,7 @@
#include "qgsfields.h"
#include "qgsvectorlayer.h"
#include "qgsvectordataprovider.h"

#include "qgsapplication.h"

QString QgsFieldFormatter::representValue( QgsVectorLayer *layer, int fieldIndex, const QVariantMap &config, const QVariant &cache, const QVariant &value ) const
{
Expand All @@ -30,13 +30,17 @@ QString QgsFieldFormatter::representValue( QgsVectorLayer *layer, int fieldIndex
if ( layer->fields().fieldOrigin( fieldIndex ) == QgsFields::OriginProvider && layer->dataProvider() )
defVal = layer->dataProvider()->defaultValueClause( layer->fields().fieldOriginIndex( fieldIndex ) );

if ( ! layer->fields().exists( fieldIndex ) )
if ( !defVal.isNull() && defVal == value )
{
return defVal;
}
else if ( value.isNull() )
{
return QgsApplication::nullRepresentation();
}
else
{
return layer->fields().at( fieldIndex ).displayString( value.isNull() ? defVal : value );
return layer->fields().at( fieldIndex ).displayString( value );
}
}

Expand Down
35 changes: 35 additions & 0 deletions tests/src/python/test_qgsfieldformatters.py
Expand Up @@ -11,6 +11,7 @@
__copyright__ = 'Copyright 2016, The QGIS Project'

import tempfile
import os

import qgis # NOQA
from qgis.PyQt.QtCore import (
Expand Down Expand Up @@ -40,6 +41,7 @@
QgsVectorFileWriter
)
from qgis.testing import start_app, unittest
from qgis.utils import spatialite_connect

from utilities import writeShape

Expand Down Expand Up @@ -626,6 +628,39 @@ def _test(layer, is_gpkg=False):
# No precision here
_test(gpkg_layer, True)

def test_representValueWithDefault(self):
"""
Check representValue behaves correctly when used on a layer which define default values
"""

dbname = os.path.join(tempfile.mkdtemp(), 'test.sqlite')
con = spatialite_connect(dbname, isolation_level=None)
cur = con.cursor()
cur.execute("BEGIN")
sql = """
CREATE TABLE test_table_default_values (
id integer primary key autoincrement,
anumber INTEGER DEFAULT 123
)
"""
cur.execute(sql)
cur.execute("COMMIT")
con.close()

vl = QgsVectorLayer(dbname + '|layername=test_table_default_values', 'test_table_default_values', 'ogr')
self.assertTrue(vl.isValid())

fieldFormatter = QgsFallbackFieldFormatter()

QLocale.setDefault(QLocale('en'))

self.assertEqual(fieldFormatter.representValue(vl, 1, {}, None, QVariant(QVariant.Int)),
'NULL')
self.assertEqual(fieldFormatter.representValue(vl, 1, {}, None, 4),
'4')
self.assertEqual(fieldFormatter.representValue(vl, 1, {}, None, "123"),
'123')


class TestQgsDateTimeFieldFormatter(unittest.TestCase):

Expand Down

0 comments on commit 26ae6d7

Please sign in to comment.