import_util.py 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. # pylint: disable=C,R,W
  2. import logging
  3. from sqlalchemy.orm.session import make_transient
  4. def import_datasource(
  5. session,
  6. i_datasource,
  7. lookup_database,
  8. lookup_datasource,
  9. import_time):
  10. """Imports the datasource from the object to the database.
  11. Metrics and columns and datasource will be overrided if exists.
  12. This function can be used to import/export dashboards between multiple
  13. superset instances. Audit metadata isn't copies over.
  14. """
  15. make_transient(i_datasource)
  16. logging.info('Started import of the datasource: {}'.format(
  17. i_datasource.to_json()))
  18. i_datasource.id = None
  19. i_datasource.database_id = lookup_database(i_datasource).id
  20. i_datasource.alter_params(import_time=import_time)
  21. # override the datasource
  22. datasource = lookup_datasource(i_datasource)
  23. if datasource:
  24. datasource.override(i_datasource)
  25. session.flush()
  26. else:
  27. datasource = i_datasource.copy()
  28. session.add(datasource)
  29. session.flush()
  30. for m in i_datasource.metrics:
  31. new_m = m.copy()
  32. new_m.table_id = datasource.id
  33. logging.info('Importing metric {} from the datasource: {}'.format(
  34. new_m.to_json(), i_datasource.full_name))
  35. imported_m = i_datasource.metric_class.import_obj(new_m)
  36. if (imported_m.metric_name not in
  37. [m.metric_name for m in datasource.metrics]):
  38. datasource.metrics.append(imported_m)
  39. for c in i_datasource.columns:
  40. new_c = c.copy()
  41. new_c.table_id = datasource.id
  42. logging.info('Importing column {} from the datasource: {}'.format(
  43. new_c.to_json(), i_datasource.full_name))
  44. imported_c = i_datasource.column_class.import_obj(new_c)
  45. if (imported_c.column_name not in
  46. [c.column_name for c in datasource.columns]):
  47. datasource.columns.append(imported_c)
  48. session.flush()
  49. return datasource.id
  50. def import_simple_obj(session, i_obj, lookup_obj):
  51. make_transient(i_obj)
  52. i_obj.id = None
  53. i_obj.table = None
  54. # find if the column was already imported
  55. existing_column = lookup_obj(i_obj)
  56. i_obj.table = None
  57. if existing_column:
  58. existing_column.override(i_obj)
  59. session.flush()
  60. return existing_column
  61. session.add(i_obj)
  62. session.flush()
  63. return i_obj