diff --git a/superset/charts/commands/importers/v1/utils.py b/superset/charts/commands/importers/v1/utils.py index d4aeb17a1e7a8..bbbe67db9238a 100644 --- a/superset/charts/commands/importers/v1/utils.py +++ b/superset/charts/commands/importers/v1/utils.py @@ -46,7 +46,10 @@ def import_chart( # TODO (betodealmeida): move this logic to import_from_dict config["params"] = json.dumps(config["params"]) - 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 bce997088495b..4c68e807d4867 100644 --- a/superset/models/helpers.py +++ b/superset/models/helpers.py @@ -184,7 +184,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} @@ -245,7 +245,8 @@ def import_from_dict( dict_rep: Dict[Any, Any], parent: Optional[Any] = None, recursive: bool = True, - sync: Optional[List[str]] = None, + sync: Optional[list[str]] = None, + allow_reparenting: bool = False, ) -> Any: """Import obj from a dictionary""" if sync is None: @@ -258,7 +259,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 @@ -279,8 +280,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 = [ @@ -291,7 +295,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))