From 72febb35e9be54ce66670c1370b7e14fc705b2df Mon Sep 17 00:00:00 2001 From: Nyall Dawson Date: Tue, 30 Apr 2019 15:10:04 +1000 Subject: [PATCH] Allow loading QLR files with invalid sources E.g. if the layer path has moved, we still should allow these files to be read, so that the layer path can be fixed by the user manually. --- src/core/qgslayerdefinition.cpp | 8 +- tests/src/python/test_qgslayerdefinition.py | 15 ++ tests/testdata/invalid_source.qlr | 268 ++++++++++++++++++++ 3 files changed, 287 insertions(+), 4 deletions(-) create mode 100644 tests/testdata/invalid_source.qlr diff --git a/src/core/qgslayerdefinition.cpp b/src/core/qgslayerdefinition.cpp index 5cd193777e7..9cc3d667ba1 100644 --- a/src/core/qgslayerdefinition.cpp +++ b/src/core/qgslayerdefinition.cpp @@ -280,10 +280,10 @@ QList QgsLayerDefinition::loadLayerDefinitionLayers( QDomDocument if ( !layer ) continue; - if ( layer->readLayerXml( layerElem, context ) ) - { - layers << layer; - } + // always add the layer, even if the source is invalid -- this allows users to fix the source + // at a later stage and still retain all the layer properties intact + layer->readLayerXml( layerElem, context ); + layers << layer; } return layers; } diff --git a/tests/src/python/test_qgslayerdefinition.py b/tests/src/python/test_qgslayerdefinition.py index 27426c609e8..04823551c72 100644 --- a/tests/src/python/test_qgslayerdefinition.py +++ b/tests/src/python/test_qgslayerdefinition.py @@ -110,6 +110,21 @@ class TestQgsLayerDefinition(unittest.TestCase): self.assertEqual(len(layers), 2) QgsProject.instance().removeAllMapLayers() + def testInvalidSource(self): + # Load a QLR containing a vector layer with a broken path + QgsProject.instance().removeAllMapLayers() + layers = QgsProject.instance().mapLayers() + self.assertEqual(len(layers), 0) + + (result, errMsg) = QgsLayerDefinition.loadLayerDefinition(TEST_DATA_DIR + '/invalid_source.qlr', QgsProject.instance(), QgsProject.instance().layerTreeRoot()) + self.assertTrue(result) + self.assertFalse(errMsg) + + layers = QgsProject.instance().mapLayers() + self.assertEqual(len(layers), 1) + self.assertFalse(list(layers.values())[0].isValid()) + QgsProject.instance().removeAllMapLayers() + if __name__ == '__main__': unittest.main() diff --git a/tests/testdata/invalid_source.qlr b/tests/testdata/invalid_source.qlr new file mode 100644 index 00000000000..1795353143a --- /dev/null +++ b/tests/testdata/invalid_source.qlr @@ -0,0 +1,268 @@ + + + + + + + + + + + points_1cff66ba_ca06_4c6d_8542_610e215f65ca + C:\temp/points.shp + + + + points + + + +proj=longlat +datum=WGS84 +no_defs + 3452 + 4326 + EPSG:4326 + WGS 84 + longlat + WGS84 + true + + + + + + + + + + + + + + + + 0 + 0 + + + + + false + + + + + ogr + + + + + + + + + + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + 0 + 1 + + + + + + + + + + + + + + + + + + + + + + + + 0 + + + 0 + generatedlayout + + + + + + + +