Fix broken layer dependencies for old projects

Fixes #39025 by skipping the broken relations detection
for widget configuations that were created before weak
relations were introduced and add an extra check for
projects that were created before recent fixes in 3.15
with commit 7e8c7b3d0e09
This commit is contained in:
Alessandro Pasotti 2020-10-02 17:52:02 +02:00
parent 7a38388a87
commit 377e5e23ec
2 changed files with 13 additions and 1 deletions

View File

@ -2249,7 +2249,7 @@ const QList<QgsVectorLayerRef> QgisApp::findBrokenLayerDependencies( QgsVectorLa
if ( found ) if ( found )
{ {
// Make sure we don't add it twice // Make sure we don't add it twice if it was already added by the form widgets check
bool refFound = false; bool refFound = false;
for ( const QgsVectorLayerRef &otherRef : qgis::as_const( brokenDependencies ) ) for ( const QgsVectorLayerRef &otherRef : qgis::as_const( brokenDependencies ) )
{ {
@ -2277,6 +2277,11 @@ void QgisApp::resolveVectorLayerDependencies( QgsVectorLayer *vl, QgsMapLayer::S
const auto constDependencies { findBrokenLayerDependencies( vl, categories ) }; const auto constDependencies { findBrokenLayerDependencies( vl, categories ) };
for ( const QgsVectorLayerRef &dependency : constDependencies ) for ( const QgsVectorLayerRef &dependency : constDependencies )
{ {
// Temporary check for projects that were created before commit 7e8c7b3d0e094737336ff4834ea2af625d2921bf
if ( QgsProject::instance()->mapLayer( dependency.layerId ) )
{
continue;
}
// try to aggressively resolve the broken dependencies // try to aggressively resolve the broken dependencies
bool loaded = false; bool loaded = false;
const QString providerName { vl->dataProvider()->name() }; const QString providerName { vl->dataProvider()->name() };

View File

@ -176,6 +176,13 @@ QVariant QgsRelationReferenceFieldFormatter::createCache( QgsVectorLayer *layer,
QList<QgsVectorLayerRef> QgsRelationReferenceFieldFormatter::layerDependencies( const QVariantMap &config ) const QList<QgsVectorLayerRef> QgsRelationReferenceFieldFormatter::layerDependencies( const QVariantMap &config ) const
{ {
// Old projects, create before the weak relations were introduced and stored with the
// widget configuration do not have the referenced layer details but only the "Relation" id,
// for these projects automatic loading of broken references is not supported.
if ( config.value( QStringLiteral( "ReferencedLayerId" ) ).toString().isEmpty() )
{
return {};
}
const QList<QgsVectorLayerRef> result {{ const QList<QgsVectorLayerRef> result {{
QgsVectorLayerRef( QgsVectorLayerRef(