diff --git a/superset/models/core.py b/superset/models/core.py index 2996625e2cbf..68c305f227bc 100644 --- a/superset/models/core.py +++ b/superset/models/core.py @@ -248,12 +248,17 @@ def get_viz(self): ) @classmethod - def import_obj(cls, slc_to_import, import_time=None): + def import_obj(cls, slc_to_import, slc_to_override, import_time=None): """Inserts or overrides slc in the database. remote_id and import_time fields in params_dict are set to track the slice origin and ensure correct overrides for multiple imports. Slice.perm is used to find the datasources and connect them. + + :param Slice slc_to_import: Slice object to import + :param Slice slc_to_override: Slice to replace, id matches remote_id + :returns: The resulting id for the imported slice + :rtype: int """ session = db.session make_transient(slc_to_import) @@ -261,13 +266,6 @@ def import_obj(cls, slc_to_import, import_time=None): slc_to_import.alter_params( remote_id=slc_to_import.id, import_time=import_time) - # find if the slice was already imported - slc_to_override = None - for slc in session.query(Slice).all(): - if ('remote_id' in slc.params_dict and - slc.params_dict['remote_id'] == slc_to_import.id): - slc_to_override = slc - slc_to_import = slc_to_import.copy() params = slc_to_import.params_dict slc_to_import.datasource_id = ConnectorRegistry.get_datasource_by_name( @@ -432,10 +430,16 @@ def alter_positions(dashboard, old_to_new_slc_id_dict): new_timed_refresh_immune_slices = [] new_expanded_slices = {} i_params_dict = dashboard_to_import.params_dict + remote_id_slice_map = { + slc.params_dict['remote_id']: slc + for slc in session.query(Slice).all() + if 'remote_id' in slc.params_dict + } for slc in slices: logging.info('Importing slice {} from the dashboard: {}'.format( slc.to_json(), dashboard_to_import.dashboard_title)) - new_slc_id = Slice.import_obj(slc, import_time=import_time) + remote_slc = remote_id_slice_map.get(slc.id) + new_slc_id = Slice.import_obj(slc, remote_slc, import_time=import_time) old_to_new_slc_id_dict[slc.id] = new_slc_id # update json metadata that deals with slice ids new_slc_id_str = '{}'.format(new_slc_id)