From 06e4f4ff4c93e7ce552c43343d4cc10d611b459c Mon Sep 17 00:00:00 2001 From: Gabriel Torres Ruiz Date: Wed, 28 Jan 2026 20:54:56 -0300 Subject: [PATCH] fix(dashboard): catch DatasourceNotFound in get_datasets to prevent 404 (#37503) --- superset/connectors/sqla/models.py | 9 ++++- .../unit_tests/connectors/sqla/models_test.py | 40 +++++++++++++++++++ 2 files changed, 48 insertions(+), 1 deletion(-) diff --git a/superset/connectors/sqla/models.py b/superset/connectors/sqla/models.py index 0e3777ba4bf..be74a199672 100644 --- a/superset/connectors/sqla/models.py +++ b/superset/connectors/sqla/models.py @@ -76,6 +76,7 @@ from superset.connectors.sqla.utils import ( get_physical_table_metadata, get_virtual_table_metadata, ) +from superset.daos.exceptions import DatasourceNotFound from superset.db_engine_specs.base import BaseEngineSpec, TimestampExpression from superset.exceptions import ( ColumnNotFoundException, @@ -513,7 +514,13 @@ class BaseDatasource( # for legacy dashboard imports which have the wrong query_context in them try: query_context = slc.get_query_context() - except DatasetNotFoundError: + except (DatasetNotFoundError, DatasourceNotFound): + logger.warning( + "Failed to load query_context for chart '%s' (id=%s): " + "referenced datasource not found", + slc.slice_name, + slc.id, + ) query_context = None # legacy charts don't have query_context charts diff --git a/tests/unit_tests/connectors/sqla/models_test.py b/tests/unit_tests/connectors/sqla/models_test.py index f3079ca356c..9c4dd73997e 100644 --- a/tests/unit_tests/connectors/sqla/models_test.py +++ b/tests/unit_tests/connectors/sqla/models_test.py @@ -24,6 +24,7 @@ from sqlalchemy.orm.session import Session from superset.connectors.sqla.models import SqlaTable, TableColumn from superset.daos.dataset import DatasetDAO +from superset.daos.exceptions import DatasourceNotFound from superset.exceptions import OAuth2RedirectError from superset.models.core import Database from superset.sql.parse import Table @@ -906,3 +907,42 @@ def test_sqla_table_link_escapes_url(mocker: MockerFixture) -> None: # Verify that special characters are escaped in both name and URL assert "<script>" in str(link) assert "