Skip to content

Commit 8905508

Browse files
authored
fix(imports): import query_context for imports with charts (#30887)
1 parent 0b647b2 commit 8905508

File tree

6 files changed

+99
-25
lines changed

6 files changed

+99
-25
lines changed

superset/commands/chart/importers/v1/__init__.py

Lines changed: 7 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
from superset.commands.database.importers.v1.utils import import_database
2727
from superset.commands.dataset.importers.v1.utils import import_dataset
2828
from superset.commands.importers.v1 import ImportModelsCommand
29+
from superset.commands.utils import update_chart_config_dataset
2930
from superset.connectors.sqla.models import SqlaTable
3031
from superset.daos.chart import ChartDAO
3132
from superset.databases.schemas import ImportV1DatabaseSchema
@@ -86,16 +87,10 @@ def _import(configs: dict[str, Any], overwrite: bool = False) -> None:
8687

8788
# update datasource id, type, and name
8889
dataset = datasets[config["dataset_uuid"]]
89-
config.update(
90-
{
91-
"datasource_id": dataset.id,
92-
"datasource_type": "table",
93-
"datasource_name": dataset.table_name,
94-
}
95-
)
96-
config["params"].update({"datasource": dataset.uid})
97-
98-
if "query_context" in config:
99-
config["query_context"] = None
100-
90+
dataset_dict = {
91+
"datasource_id": dataset.id,
92+
"datasource_type": "table",
93+
"datasource_name": dataset.table_name,
94+
}
95+
config = update_chart_config_dataset(config, dataset_dict)
10196
import_chart(config, overwrite=overwrite)

superset/commands/dashboard/importers/v1/__init__.py

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
from superset.commands.database.importers.v1.utils import import_database
3535
from superset.commands.dataset.importers.v1.utils import import_dataset
3636
from superset.commands.importers.v1 import ImportModelsCommand
37+
from superset.commands.utils import update_chart_config_dataset
3738
from superset.daos.dashboard import DashboardDAO
3839
from superset.dashboards.schemas import ImportV1DashboardSchema
3940
from superset.databases.schemas import ImportV1DatabaseSchema
@@ -113,11 +114,7 @@ def _import(configs: dict[str, Any], overwrite: bool = False) -> None:
113114
):
114115
# update datasource id, type, and name
115116
dataset_dict = dataset_info[config["dataset_uuid"]]
116-
config.update(dataset_dict)
117-
dataset_uid = f"{dataset_dict['datasource_id']}__{dataset_dict['datasource_type']}"
118-
config["params"].update({"datasource": dataset_uid})
119-
if "query_context" in config:
120-
config["query_context"] = None
117+
config = update_chart_config_dataset(config, dataset_dict)
121118

122119
chart = import_chart(config, overwrite=False)
123120
charts.append(chart)

superset/commands/importers/v1/assets.py

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
validate_metadata_type,
4040
)
4141
from superset.commands.query.importers.v1.utils import import_saved_query
42+
from superset.commands.utils import update_chart_config_dataset
4243
from superset.dashboards.schemas import ImportV1DashboardSchema
4344
from superset.databases.schemas import ImportV1DatabaseSchema
4445
from superset.datasets.schemas import ImportV1DatasetSchema
@@ -113,11 +114,7 @@ def _import(configs: dict[str, Any]) -> None:
113114
for file_name, config in configs.items():
114115
if file_name.startswith("charts/"):
115116
dataset_dict = dataset_info[config["dataset_uuid"]]
116-
config.update(dataset_dict)
117-
dataset_uid = f"{dataset_dict['datasource_id']}__{dataset_dict['datasource_type']}"
118-
config["params"].update({"datasource": dataset_uid})
119-
if "query_context" in config:
120-
config["query_context"] = None
117+
config = update_chart_config_dataset(config, dataset_dict)
121118
chart = import_chart(config, overwrite=True)
122119
charts.append(chart)
123120
chart_ids[str(chart.uuid)] = chart.id

superset/commands/utils.py

Lines changed: 42 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
from __future__ import annotations
1818

1919
from collections import Counter
20-
from typing import Optional, TYPE_CHECKING
20+
from typing import Any, Optional, TYPE_CHECKING
2121

2222
from flask import g
2323
from flask_appbuilder.security.sqla.models import Role, User
@@ -34,6 +34,7 @@
3434
from superset.daos.exceptions import DatasourceNotFound
3535
from superset.daos.tag import TagDAO
3636
from superset.tags.models import ObjectType, Tag, TagType
37+
from superset.utils import json
3738
from superset.utils.core import DatasourceType, get_user_id
3839

3940
if TYPE_CHECKING:
@@ -185,3 +186,43 @@ def update_tags(
185186
TagDAO.create_custom_tagged_objects(
186187
object_type, object_id, [tag.name for tag in tags_to_add]
187188
)
189+
190+
191+
def update_chart_config_dataset(
192+
config: dict[str, Any], dataset_info: dict[str, Any]
193+
) -> dict[str, Any]:
194+
"""
195+
Update the chart configuration and query_context with new dataset information
196+
197+
:param config: The original chart configuration
198+
:param dataset_info: Dict with datasource_id, datasource_type, and datasource_name
199+
:return: The updated chart configuration
200+
"""
201+
# Update datasource id, type, and name
202+
config.update(dataset_info)
203+
204+
dataset_uid = f"{dataset_info['datasource_id']}__{dataset_info['datasource_type']}"
205+
config["params"].update({"datasource": dataset_uid})
206+
207+
if "query_context" in config and config["query_context"] is not None:
208+
try:
209+
query_context = json.loads(config["query_context"])
210+
211+
query_context["datasource"] = {
212+
"id": dataset_info["datasource_id"],
213+
"type": dataset_info["datasource_type"],
214+
}
215+
216+
if "form_data" in query_context:
217+
query_context["form_data"]["datasource"] = dataset_uid
218+
219+
if "queries" in query_context:
220+
for query in query_context["queries"]:
221+
if "datasource" in query:
222+
query["datasource"] = query_context["datasource"]
223+
224+
config["query_context"] = json.dumps(query_context)
225+
except json.JSONDecodeError:
226+
config["query_context"] = None
227+
228+
return config

tests/integration_tests/commands_test.py

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,29 @@ def test_import_assets(self, mock_add_permissions):
139139
dataset = chart.table
140140
assert str(dataset.uuid) == dataset_config["uuid"]
141141

142-
assert chart.query_context is None
142+
assert json.loads(chart.query_context) == {
143+
"datasource": {"id": dataset.id, "type": "table"},
144+
"force": False,
145+
"queries": [
146+
{
147+
"annotation_layers": [],
148+
"applied_time_extras": {},
149+
"columns": [],
150+
"custom_form_data": {},
151+
"custom_params": {},
152+
"extras": {"having": "", "time_grain_sqla": None, "where": ""},
153+
"filters": [],
154+
"metrics": [],
155+
"order_desc": True,
156+
"row_limit": 5000,
157+
"time_range": " : ",
158+
"timeseries_limit": 0,
159+
"url_params": {},
160+
}
161+
],
162+
"result_format": "json",
163+
"result_type": "full",
164+
}
143165
assert json.loads(chart.params)["datasource"] == dataset.uid
144166

145167
database = dataset.database

tests/integration_tests/dashboards/commands_tests.py

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -620,7 +620,29 @@ def test_import_v1_dashboard(self, mock_add_permissions, sm_g, utils_g):
620620
dataset = chart.table
621621
assert str(dataset.uuid) == dataset_config["uuid"]
622622

623-
assert chart.query_context is None
623+
assert json.loads(chart.query_context) == {
624+
"datasource": {"id": dataset.id, "type": "table"},
625+
"force": False,
626+
"queries": [
627+
{
628+
"annotation_layers": [],
629+
"applied_time_extras": {},
630+
"columns": [],
631+
"custom_form_data": {},
632+
"custom_params": {},
633+
"extras": {"having": "", "time_grain_sqla": None, "where": ""},
634+
"filters": [],
635+
"metrics": [],
636+
"order_desc": True,
637+
"row_limit": 5000,
638+
"time_range": " : ",
639+
"timeseries_limit": 0,
640+
"url_params": {},
641+
}
642+
],
643+
"result_format": "json",
644+
"result_type": "full",
645+
}
624646
assert json.loads(chart.params)["datasource"] == dataset.uid
625647

626648
database = dataset.database

0 commit comments

Comments
 (0)