Ignore blocklisted uris when querying all providers for sublayers

This commit is contained in:
Nyall Dawson 2021-07-23 10:51:19 +10:00
parent ae980c51bc
commit e57193d6ef
2 changed files with 13 additions and 1 deletions

View File

@ -899,6 +899,10 @@ bool QgsProviderRegistry::uriIsBlocklisted( const QString &uri ) const
QList<QgsProviderSublayerDetails> QgsProviderRegistry::querySublayers( const QString &uri, Qgis::SublayerQueryFlags flags, QgsFeedback *feedback ) const
{
// never query sublayers for blocklisted uris
if ( uriIsBlocklisted( uri ) )
return {};
QList<QgsProviderSublayerDetails> res;
for ( auto it = mProviders.begin(); it != mProviders.end(); ++it )
{

View File

@ -17,9 +17,11 @@ from qgis.core import (
QgsMapLayerType,
QgsProviderMetadata,
QgsProviderSublayerDetails,
Qgis
Qgis,
QgsProviderUtils
)
from qgis.testing import start_app, unittest
from utilities import unitTestDataPath
# Convenience instances in case you may need them
# to find the srs.db
@ -37,6 +39,8 @@ class TestProviderMetadata(QgsProviderMetadata):
def querySublayers(self, uri: str, flags=Qgis.SublayerQueryFlags(), feedback=None):
res = QgsProviderSublayerDetails()
res.setProviderKey(self.key())
res.setUri(uri)
res.setName(QgsProviderUtils.suggestLayerNameFromFilePath(uri))
return [res]
@ -138,6 +142,10 @@ class TestQgsProviderRegistry(unittest.TestCase):
self.assertCountEqual([p.providerKey() for p in QgsProviderRegistry.instance().querySublayers('test_uri')],
['p1', 'p2'])
if QgsProviderRegistry.instance().providerMetadata('ept'):
# test querying a uri which should be blocklisted
self.assertFalse(QgsProviderRegistry.instance().querySublayers(unitTestDataPath() + '/point_clouds/ept/sunshine-coast/ept-build.json'))
if __name__ == '__main__':
unittest.main()