From e4ea247c6a73cdee2ced8759014bf1aabae80336 Mon Sep 17 00:00:00 2001 From: Alessandro Pasotti Date: Wed, 18 Sep 2019 21:12:00 +0200 Subject: [PATCH] Set GPKG-stored project dirty when removed if it's the current project Fixes #30550 --- .../ogr/qgsgeopackageprojectstorage.cpp | 8 ++++++- tests/src/python/test_qgsproject.py | 24 +++++++++++++++++++ 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/src/core/providers/ogr/qgsgeopackageprojectstorage.cpp b/src/core/providers/ogr/qgsgeopackageprojectstorage.cpp index e6b92baa73b..fcc9746f668 100644 --- a/src/core/providers/ogr/qgsgeopackageprojectstorage.cpp +++ b/src/core/providers/ogr/qgsgeopackageprojectstorage.cpp @@ -29,6 +29,7 @@ #include "qgsreadwritecontext.h" #include "qgsapplication.h" #include "qgsogrutils.h" +#include "qgsproject.h" static bool _parseMetadataDocument( const QJsonDocument &doc, QgsProjectStorage::Metadata &metadata ) @@ -354,7 +355,12 @@ bool QgsGeoPackageProjectStorage::removeProject( const QString &uri ) errCause = QObject::tr( "Could not remove project %1: %2" ).arg( uri, errCause ); QgsMessageLog::logMessage( errCause, QStringLiteral( "OGR" ), Qgis::MessageLevel::Warning ); } - return errCause.isEmpty(); + else if ( QgsProject::instance()->fileName() == uri ) + { + QgsMessageLog::logMessage( QStringLiteral( "Current project was removed from storage, marking it dirty." ), QStringLiteral( "OGR" ), Qgis::MessageLevel::Warning ); + QgsProject::instance()->setDirty( true ); + } + return errCause.isEmpty(); } bool QgsGeoPackageProjectStorage::renameProject( const QString &uri, const QString &uriNew ) diff --git a/tests/src/python/test_qgsproject.py b/tests/src/python/test_qgsproject.py index 29f4254e5c0..4a7fce1676d 100644 --- a/tests/src/python/test_qgsproject.py +++ b/tests/src/python/test_qgsproject.py @@ -1261,6 +1261,30 @@ class TestQgsProject(unittest.TestCase): p.setTransformContext(ctx) self.assertEqual(len(spy), 1) + def testGpkgDirtyingWhenRemovedFromStorage(self): + """Test that when a GPKG stored project is removed from the storage it is marked dirty""" + + with TemporaryDirectory() as d: + path = os.path.join(d, 'relative_paths_gh30387.gpkg') + copyfile(os.path.join(TEST_DATA_DIR, 'projects', 'relative_paths_gh30387.gpkg'), path) + project = QgsProject.instance() + # Project URI + uri = 'geopackage://{}?projectName=relative_project'.format(path) + project.setFileName(uri) + self.assertTrue(project.write()) + # Verify + self.assertTrue(project.read(uri)) + self.assertFalse(project.isDirty()) + # Remove from storage + storage = QgsApplication.projectStorageRegistry().projectStorageFromUri(uri) + self.assertTrue(storage.removeProject(uri)) + self.assertTrue(project.isDirty()) + # Save it back + self.assertTrue(project.write()) + self.assertFalse(project.isDirty()) + # Reload + self.assertTrue(project.read(uri)) + if __name__ == '__main__': unittest.main()