From a9b8c8e3ec24671a6df563820423a84c79220667 Mon Sep 17 00:00:00 2001 From: Jack Fragassi Date: Fri, 28 Jul 2023 16:08:03 -0700 Subject: [PATCH] fix: Allow chart import to update the dataset an existing chart points to (#24821) (cherry picked from commit 77889b29fb0e50473ca7656be4e5bf2f1dff5421) --- superset/charts/commands/importers/v1/utils.py | 4 +++- superset/models/helpers.py | 14 +++++++++----- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/superset/charts/commands/importers/v1/utils.py b/superset/charts/commands/importers/v1/utils.py index 589ae76a310a0..d3f90f7ff4312 100644 --- a/superset/charts/commands/importers/v1/utils.py +++ b/superset/charts/commands/importers/v1/utils.py @@ -53,7 +53,9 @@ def import_chart( # migrate old viz types to new ones config = migrate_chart(config) - chart = Slice.import_from_dict(session, config, recursive=False) + chart = Slice.import_from_dict( + session, config, recursive=False, allow_reparenting=True + ) if chart.id is None: session.flush() diff --git a/superset/models/helpers.py b/superset/models/helpers.py index 9e269652c7f22..8761e909334df 100644 --- a/superset/models/helpers.py +++ b/superset/models/helpers.py @@ -182,7 +182,7 @@ class ImportExportMixin: __mapper__: Mapper @classmethod - def _unique_constrains(cls) -> list[set[str]]: + def _unique_constraints(cls) -> list[set[str]]: """Get all (single column and multi column) unique constraints""" unique = [ {c.name for c in u.columns} @@ -244,6 +244,7 @@ def import_from_dict( parent: Optional[Any] = None, recursive: bool = True, sync: Optional[list[str]] = None, + allow_reparenting: bool = False, ) -> Any: """Import obj from a dictionary""" if sync is None: @@ -256,7 +257,7 @@ def import_from_dict( | {"uuid"} ) new_children = {c: dict_rep[c] for c in cls.export_children if c in dict_rep} - unique_constrains = cls._unique_constrains() + unique_constraints = cls._unique_constraints() filters = [] # Using these filters to check if obj already exists @@ -275,8 +276,11 @@ def import_from_dict( for k, v in parent_refs.items(): dict_rep[k] = getattr(parent, v) - # Add filter for parent obj - filters.extend([getattr(cls, k) == dict_rep.get(k) for k in parent_refs.keys()]) + if not allow_reparenting: + # Add filter for parent obj + filters.extend( + [getattr(cls, k) == dict_rep.get(k) for k in parent_refs.keys()] + ) # Add filter for unique constraints ucs = [ @@ -287,7 +291,7 @@ def import_from_dict( if dict_rep.get(k) is not None ] ) - for cs in unique_constrains + for cs in unique_constraints ] filters.append(or_(*ucs))