diff --git a/python/core/auto_generated/qgsvectorlayer.sip.in b/python/core/auto_generated/qgsvectorlayer.sip.in index 8609097bdf1..ad63e7caa87 100644 --- a/python/core/auto_generated/qgsvectorlayer.sip.in +++ b/python/core/auto_generated/qgsvectorlayer.sip.in @@ -797,6 +797,10 @@ Lists all the style in db split into related to the layer and not related to :param msgError: :return: the number of styles related to current layer + +.. note:: + + Since QGIS 3.2 Styles related to the layer are ordered with the default style first then by update time for Postgres, MySQL and Spatialite. %End virtual QString getStyleFromDatabase( const QString &styleId, QString &msgError /Out/ ); diff --git a/src/core/qgsvectorlayer.h b/src/core/qgsvectorlayer.h index d4651167f86..3285a811b34 100644 --- a/src/core/qgsvectorlayer.h +++ b/src/core/qgsvectorlayer.h @@ -800,6 +800,7 @@ class CORE_EXPORT QgsVectorLayer : public QgsMapLayer, public QgsExpressionConte * \param descriptions the list in which will be stored the style descriptions * \param msgError * \returns the number of styles related to current layer + * \note Since QGIS 3.2 Styles related to the layer are ordered with the default style first then by update time for Postgres, MySQL and Spatialite. */ virtual int listStylesInDatabase( QStringList &ids SIP_OUT, QStringList &names SIP_OUT, QStringList &descriptions SIP_OUT, QString &msgError SIP_OUT ); diff --git a/src/providers/mssql/qgsmssqlprovider.cpp b/src/providers/mssql/qgsmssqlprovider.cpp index f6fbe53e1c1..19179fe729c 100644 --- a/src/providers/mssql/qgsmssqlprovider.cpp +++ b/src/providers/mssql/qgsmssqlprovider.cpp @@ -2244,7 +2244,8 @@ QGISEXTERN int listStyles( const QString &uri, QStringList &ids, QStringList &na " WHERE f_table_catalog=%1" " AND f_table_schema=%2" " AND f_table_name=%3" - " AND f_geometry_column=%4" ) + " AND f_geometry_column=%4" + " ORDER BY useasdefault DESC, update_time DESC" ) .arg( QgsMssqlProvider::quotedValue( dsUri.database() ) ) .arg( QgsMssqlProvider::quotedValue( dsUri.schema() ) ) .arg( QgsMssqlProvider::quotedValue( dsUri.table() ) ) diff --git a/src/providers/postgres/qgspostgresprovider.cpp b/src/providers/postgres/qgspostgresprovider.cpp index fb86aef223b..74dc187f6ad 100644 --- a/src/providers/postgres/qgspostgresprovider.cpp +++ b/src/providers/postgres/qgspostgresprovider.cpp @@ -4822,7 +4822,8 @@ QGISEXTERN int listStyles( const QString &uri, QStringList &ids, QStringList &na " WHERE f_table_catalog=%1" " AND f_table_schema=%2" " AND f_table_name=%3" - " AND f_geometry_column=%4" ) + " AND f_geometry_column=%4" + " ORDER BY useasdefault DESC, update_time DESC" ) .arg( QgsPostgresConn::quotedValue( dsUri.database() ) ) .arg( QgsPostgresConn::quotedValue( dsUri.schema() ) ) .arg( QgsPostgresConn::quotedValue( dsUri.table() ) ) diff --git a/src/providers/spatialite/qgsspatialiteprovider.cpp b/src/providers/spatialite/qgsspatialiteprovider.cpp index 7d47fd1be21..0a22d176d5c 100644 --- a/src/providers/spatialite/qgsspatialiteprovider.cpp +++ b/src/providers/spatialite/qgsspatialiteprovider.cpp @@ -5836,7 +5836,8 @@ QGISEXTERN int listStyles( const QString &uri, QStringList &ids, QStringList &na " FROM layer_styles" " WHERE f_table_schema=%1" " AND f_table_name=%2" - " AND f_geometry_column=%3" ) + " AND f_geometry_column=%3" + " ORDER BY useasdefault DESC, update_time DESC" ) .arg( QgsSpatiaLiteProvider::quotedValue( dsUri.schema() ) ) .arg( QgsSpatiaLiteProvider::quotedValue( dsUri.table() ) ) .arg( QgsSpatiaLiteProvider::quotedValue( dsUri.geometryColumn() ) ); diff --git a/tests/src/python/test_provider_postgres.py b/tests/src/python/test_provider_postgres.py index d0978ddda34..9cd181a12f8 100644 --- a/tests/src/python/test_provider_postgres.py +++ b/tests/src/python/test_provider_postgres.py @@ -4,6 +4,10 @@ Note: to prepare the DB, you need to run the sql files specified in tests/testdata/provider/testdata_pg.sh +Read tests/README.md about writing/launching tests with PostgreSQL. + +Run with ctest -V -R PyQgsPostgresProvider + .. note:: This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or @@ -902,6 +906,7 @@ class TestPyQgsPostgresProvider(unittest.TestCase, ProviderTestCase): status = vl.loadNamedStyle(mFilePath) self.assertTrue(status) + # The style is saved as non-default errorMsg = vl.saveStyleToDatabase("by day", "faded greens and elegant patterns", False, "") self.assertEqual(errorMsg, "") @@ -933,6 +938,27 @@ class TestPyQgsPostgresProvider(unittest.TestCase, ProviderTestCase): self.assertTrue(res) self.assertEqual(errmsg, "") + # We save now the style again twice but with one as default + errorMsg = vl.saveStyleToDatabase("related style", "faded greens and elegant patterns", False, "") + self.assertEqual(errorMsg, "") + errorMsg = vl.saveStyleToDatabase("default style", "faded greens and elegant patterns", True, "") + self.assertEqual(errorMsg, "") + + related_count, idlist, namelist, desclist, errmsg = vl.listStylesInDatabase() + self.assertEqual(related_count, 2) + self.assertEqual(errmsg, "") + self.assertEqual(idlist, ["3", "2"]) # Ids must be reversed. + self.assertEqual(namelist, ["default style", "related style"]) + self.assertEqual(desclist, ["faded greens and elegant patterns"] * 2) + + # We remove these 2 styles + res, errmsg = vl.deleteStyleFromDatabase("2") + self.assertTrue(res) + self.assertEqual(errmsg, "") + res, errmsg = vl.deleteStyleFromDatabase("3") + self.assertTrue(res) + self.assertEqual(errmsg, "") + # table layer_styles does exit, but is now empty related_count, idlist, namelist, desclist, errmsg = vl.listStylesInDatabase() self.assertEqual(related_count, 0) @@ -1066,7 +1092,16 @@ class TestPyQgsPostgresProvider(unittest.TestCase, ProviderTestCase): self.assertTrue(ok) def testStyleDatabaseWithService(self): + """Test saving style in DB using a service file. + To run this test, you first need to create a service with: + [qgis_test] + host=localhost + port=5432 + dbname=qgis_test + user=USERNAME + password=PASSWORD + """ myconn = 'service=\'qgis_test\'' if 'QGIS_PGTEST_DB' in os.environ: myconn = os.environ['QGIS_PGTEST_DB']