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 4aa3f2b4e48fd..2e48fc3c66c99 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))