gooddata-legacy2cloud 0.1.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (215) hide show
  1. gooddata_legacy2cloud-0.1.0/PKG-INFO +836 -0
  2. gooddata_legacy2cloud-0.1.0/README.md +816 -0
  3. gooddata_legacy2cloud-0.1.0/pyproject.toml +55 -0
  4. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/__init__.py +86 -0
  5. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/arg_parsing/__init__.py +4 -0
  6. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/arg_parsing/arg_parser.py +737 -0
  7. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/arg_parsing/cli_commands.py +60 -0
  8. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/backends/__init__.py +4 -0
  9. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/backends/cloud/__init__.py +1 -0
  10. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/backends/cloud/client.py +823 -0
  11. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/backends/cloud/object_creator.py +439 -0
  12. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/backends/cloud/object_creator_strategy.py +514 -0
  13. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/backends/legacy/__init__.py +1 -0
  14. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/backends/legacy/client.py +618 -0
  15. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/backends/legacy/dependencies.py +143 -0
  16. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/backends/legacy/filters.py +284 -0
  17. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/backends/legacy/objects.py +472 -0
  18. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/backends/legacy/utils.py +49 -0
  19. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/backends/legacy/validate_attribute_elements.py +112 -0
  20. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/config/__init__.py +1 -0
  21. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/config/configuration_objects.py +672 -0
  22. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/config/env_vars.py +99 -0
  23. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/config/shared_configs.py +163 -0
  24. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/constants.py +20 -0
  25. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/dashboard_permissions/__init__.py +2 -0
  26. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/dashboard_permissions/change_formatter.py +43 -0
  27. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/dashboard_permissions/data_classes.py +69 -0
  28. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/dashboard_permissions/permissions_logger.py +74 -0
  29. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/dashboard_permissions/permissions_updater.py +511 -0
  30. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/dashboards/__init__.py +1 -0
  31. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/dashboards/cloud_dashboard.py +519 -0
  32. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/dashboards/cloud_dashboards_builder.py +131 -0
  33. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/dashboards/data_classes.py +26 -0
  34. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/dashboards/drill_converter.py +459 -0
  35. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/dashboards/filter_context.py +202 -0
  36. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/helpers.py +208 -0
  37. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/id_mappings.py +136 -0
  38. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/insights/__init__.py +1 -0
  39. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/insights/cloud_insight.py +539 -0
  40. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/insights/cloud_insights_builder.py +95 -0
  41. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/insights/color_palette.py +99 -0
  42. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/insights/data_classes.py +21 -0
  43. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/insights/period_comparison_insight.py +362 -0
  44. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/layout/__init__.py +2 -0
  45. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/layout/layout_manager.py +372 -0
  46. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/ldm/__init__.py +1 -0
  47. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/ldm/ads_mapping.py +246 -0
  48. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/ldm/attribute_builder.py +165 -0
  49. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/ldm/cloud_model_builder.py +466 -0
  50. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/ldm/data_classes.py +40 -0
  51. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/ldm/fact_builder.py +72 -0
  52. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/ldm/model_builder_config.py +22 -0
  53. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/ldm/model_helpers.py +121 -0
  54. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/ldm/reference_builder.py +209 -0
  55. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/ldm/tag_provider.py +46 -0
  56. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/ldm/utils.py +124 -0
  57. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/logging/__init__.py +1 -0
  58. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/logging/config.py +49 -0
  59. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/logging/context.py +40 -0
  60. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/mapping/__init__.py +4 -0
  61. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/mapping/mapping_utils.py +210 -0
  62. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/metrics/__init__.py +1 -0
  63. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/metrics/attribute_element.py +322 -0
  64. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/metrics/cloud_maql.py +51 -0
  65. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/metrics/cloud_metric.py +115 -0
  66. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/metrics/cloud_metrics_builder.py +96 -0
  67. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/metrics/contants.py +85 -0
  68. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/metrics/cyclical_date_conversion.py +238 -0
  69. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/metrics/data_classes.py +22 -0
  70. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/metrics/display_form_utils.py +70 -0
  71. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/metrics/element_prefetcher.py +466 -0
  72. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/metrics/maql/constants.py +60 -0
  73. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/metrics/maql/content_tree_modifier.py +367 -0
  74. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/metrics/maql/helpers.py +96 -0
  75. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/metrics/maql/maql_builder.py +286 -0
  76. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/metrics/metrics_sorter.py +147 -0
  77. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/metrics/utils.py +107 -0
  78. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/models/__init__.py +1 -0
  79. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/models/aliases.py +29 -0
  80. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/models/base.py +11 -0
  81. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/models/cloud/__init__.py +1 -0
  82. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/models/cloud/attribute.py +38 -0
  83. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/models/cloud/automations.py +388 -0
  84. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/models/cloud/dashboard.py +116 -0
  85. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/models/cloud/filter_context.py +65 -0
  86. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/models/cloud/identifier.py +13 -0
  87. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/models/cloud/insight_filters/__init__.py +48 -0
  88. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/models/cloud/insight_filters/attribute_filters.py +41 -0
  89. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/models/cloud/insight_filters/date_filters.py +42 -0
  90. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/models/cloud/insight_filters/measure_value_filter.py +34 -0
  91. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/models/cloud/insight_filters/values.py +38 -0
  92. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/models/cloud/meta.py +15 -0
  93. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/models/enums.py +52 -0
  94. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/models/exceptions.py +3 -0
  95. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/models/legacy/__init__.py +2 -0
  96. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/models/legacy/accounts_settings.py +15 -0
  97. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/models/legacy/analytical_dashboards.py +27 -0
  98. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/models/legacy/meta.py +22 -0
  99. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/models/legacy/metadata.py +19 -0
  100. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/models/legacy/metrics.py +41 -0
  101. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/models/legacy/scheduled_exports.py +54 -0
  102. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/models/legacy/used_by.py +33 -0
  103. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/models/legacy/visualization_class.py +14 -0
  104. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/models/legacy/visualization_objects.py +111 -0
  105. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/models/legacy/visualization_widget.py +18 -0
  106. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/models/validators.py +8 -0
  107. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/output_writer.py +188 -0
  108. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/pp_dashboards/cloud_objects/dashboard_objects.py +192 -0
  109. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/pp_dashboards/cloud_objects/filter_objects.py +87 -0
  110. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/pp_dashboards/cloud_objects/visualisation_objects.py +119 -0
  111. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/pp_dashboards/cloud_pp_dashboards_builder.py +812 -0
  112. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/pp_dashboards/context_holder.py +48 -0
  113. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/pp_dashboards/data_classes.py +27 -0
  114. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/pp_dashboards/grid_maker.py +202 -0
  115. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/pp_dashboards/grid_maker_ii.py +504 -0
  116. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/pp_dashboards/helpers.py +79 -0
  117. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/pp_dashboards/legacy_objects/filter_objects.py +245 -0
  118. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/pp_dashboards/legacy_objects/pixel_perfect_dashboard.py +276 -0
  119. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/pp_dashboards/utils.py +76 -0
  120. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/py.typed +1 -0
  121. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/reports/README.md +43 -0
  122. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/reports/charts/__init__.py +40 -0
  123. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/reports/charts/axes.py +174 -0
  124. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/reports/charts/bullet.py +223 -0
  125. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/reports/charts/chart_processor.py +206 -0
  126. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/reports/charts/color_mapping.py +167 -0
  127. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/reports/charts/sorting.py +105 -0
  128. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/reports/charts/styles.py +70 -0
  129. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/reports/charts/types.py +169 -0
  130. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/reports/charts/waterfall.py +123 -0
  131. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/reports/cloud_report.py +111 -0
  132. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/reports/cloud_reports_builder.py +123 -0
  133. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/reports/common.py +95 -0
  134. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/reports/data_classes.py +86 -0
  135. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/reports/filters/__init__.py +39 -0
  136. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/reports/filters/attribute_filter.py +414 -0
  137. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/reports/filters/base_filter.py +55 -0
  138. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/reports/filters/date_classification.py +141 -0
  139. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/reports/filters/date_cyclical_processor.py +162 -0
  140. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/reports/filters/date_filter.py +742 -0
  141. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/reports/filters/date_filter_post_processor.py +651 -0
  142. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/reports/filters/date_helpers.py +121 -0
  143. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/reports/filters/date_ordinal_processor.py +341 -0
  144. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/reports/filters/filter_mapper.py +178 -0
  145. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/reports/filters/helpers.py +412 -0
  146. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/reports/filters/measure_filter.py +476 -0
  147. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/reports/filters/ranking_filter.py +414 -0
  148. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/reports/grid_processing.py +577 -0
  149. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/reports/mappings.py +235 -0
  150. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/reports/payload_validator.py +145 -0
  151. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/reports/transformation.py +148 -0
  152. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/reports/visualization_adjustments.py +675 -0
  153. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/reports/warning_collector.py +94 -0
  154. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/scheduled_exports/__init__.py +1 -0
  155. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/scheduled_exports/attachment_processor.py +381 -0
  156. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/scheduled_exports/helpers/__init__.py +1 -0
  157. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/scheduled_exports/helpers/constants.py +8 -0
  158. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/scheduled_exports/helpers/mappers.py +226 -0
  159. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/scheduled_exports/recur_to_cron/__init__.py +1 -0
  160. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/scheduled_exports/recur_to_cron/translator.py +275 -0
  161. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/scheduled_exports/scheduled_export_context.py +55 -0
  162. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/scheduled_exports/scheduled_exports.py +799 -0
  163. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/user_management/__init__.py +1 -0
  164. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/user_management/cloud_users.py +45 -0
  165. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/user_management/data_classes.py +77 -0
  166. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/user_management/legacy_users.py +80 -0
  167. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/user_management/user_mapper.py +79 -0
  168. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/web_compare_processing/README.md +78 -0
  169. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/web_compare_processing/__init__.py +63 -0
  170. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/web_compare_processing/cli_processor.py +201 -0
  171. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/web_compare_processing/comparison_result.py +191 -0
  172. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/web_compare_processing/detector.py +92 -0
  173. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/web_compare_processing/discovery.py +117 -0
  174. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/web_compare_processing/file_utils.py +156 -0
  175. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/web_compare_processing/generator.py +452 -0
  176. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/web_compare_processing/inheritance.py +117 -0
  177. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/web_compare_processing/metadata_extractor.py +117 -0
  178. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/web_compare_processing/parsing/__init__.py +34 -0
  179. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/web_compare_processing/parsing/comparison_factory.py +437 -0
  180. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/web_compare_processing/parsing/definition_parser.py +108 -0
  181. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/web_compare_processing/parsing/id_extractor.py +232 -0
  182. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/web_compare_processing/parsing/log_parser.py +321 -0
  183. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/web_compare_processing/parsing/metadata.py +243 -0
  184. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/web_compare_processing/parsing/status_analyzer.py +233 -0
  185. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/web_compare_processing/path_management.py +151 -0
  186. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/web_compare_processing/processor.py +243 -0
  187. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/web_compare_processing/templates/comparison.html +276 -0
  188. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/web_compare_processing/templates/resources/css/styles.css +1699 -0
  189. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/web_compare_processing/templates/resources/img/api-error.png +0 -0
  190. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/web_compare_processing/templates/resources/img/error.png +0 -0
  191. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/web_compare_processing/templates/resources/img/inherited.png +0 -0
  192. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/web_compare_processing/templates/resources/img/ok.png +0 -0
  193. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/web_compare_processing/templates/resources/img/skip.png +0 -0
  194. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/web_compare_processing/templates/resources/img/warn.png +0 -0
  195. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/web_compare_processing/templates/resources/js/comparison.js +272 -0
  196. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/web_compare_processing/templates/resources/js/filtering.js +213 -0
  197. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/web_compare_processing/templates/resources/js/global.js +58 -0
  198. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/web_compare_processing/templates/resources/js/index.js +24 -0
  199. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/web_compare_processing/templates/resources/js/modal.js +83 -0
  200. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/web_compare_processing/templates/resources/js/navigation.js +340 -0
  201. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/web_compare_processing/templates/resources/js/resize.js +256 -0
  202. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/web_compare_processing/templates/resources/js/sidebar.js +105 -0
  203. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/web_compare_processing/url_utils.py +206 -0
  204. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/workflows/__init__.py +1 -0
  205. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/workflows/create_ddl_from_panther_ldm.py +142 -0
  206. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/workflows/generate_web_compare.py +43 -0
  207. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/workflows/migrate_color_palette.py +67 -0
  208. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/workflows/migrate_dashboard_permissions.py +360 -0
  209. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/workflows/migrate_dashboards.py +309 -0
  210. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/workflows/migrate_insights.py +218 -0
  211. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/workflows/migrate_ldm.py +127 -0
  212. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/workflows/migrate_metrics.py +186 -0
  213. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/workflows/migrate_pixel_perfect_dashboards.py +411 -0
  214. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/workflows/migrate_reports.py +201 -0
  215. gooddata_legacy2cloud-0.1.0/src/gooddata_legacy2cloud/workflows/migrate_scheduled_exports.py +185 -0
@@ -0,0 +1,836 @@
1
+ Metadata-Version: 2.4
2
+ Name: gooddata-legacy2cloud
3
+ Version: 0.1.0
4
+ Summary: Transfer workspace metadata from GD Legacy to GD Cloud.
5
+ Keywords: gooddata,analytics,business,intelligence,cloud,legacy,native,semantic,layer,sql,metrics
6
+ Author: GoodData
7
+ Author-email: GoodData <support@gooddata.com>
8
+ License-Expression: MIT
9
+ Requires-Dist: requests==2.32.5
10
+ Requires-Dist: python-dotenv==1.1.1
11
+ Requires-Dist: tenacity==9.0.0
12
+ Requires-Dist: jinja2==3.1.2
13
+ Requires-Dist: markupsafe==2.1.3
14
+ Requires-Dist: pydantic==2.12.5
15
+ Requires-Dist: types-requests==2.32.4.20250809
16
+ Requires-Dist: gooddata-sdk>=1.61.0
17
+ Requires-Dist: attrs>=24.2.0
18
+ Requires-Python: >=3.14
19
+ Description-Content-Type: text/markdown
20
+
21
+ # gooddata-legacy2cloud-tools
22
+
23
+ Repository for GoodData Legacy to Cloud migration tools
24
+
25
+ Recommended Python version: **>3.14.2**
26
+
27
+ ## Introduction
28
+
29
+ This migration toolkit facilitates the transition of analytics content from GoodData Legacy to GoodData Cloud.
30
+
31
+ Throughout the readme and the codebase, the products are referred to as such:
32
+
33
+ - **Legacy** refers to GoodData Legacy, the legacy private cloud-based analytics solution
34
+ - **Cloud** refers to GoodData Cloud, the modern cloud-based analytics legacy
35
+
36
+ **What problem does this toolkit solve?**
37
+ This toolkit automates the migration of your analytical content, preserving the relationships between different objects while handling the architectural differences between the two legacys. It can migrate:
38
+
39
+ - Logical Data Models (LDM) with data source mappings
40
+ - Metrics (calculations/measures)
41
+ - Insights (visualizations)
42
+ - KPI Dashboards
43
+ - Pixel Perfect Reports
44
+
45
+ The migration can be performed as a complete workspace transfer or selectively for specific objects. The toolkit supports various migration patterns including parent/child workspace migrations and incremental updates.
46
+
47
+ ## Table of Contents
48
+
49
+ - [Introduction](#introduction)
50
+ - [Quick Start Guide](#quick-start-guide)
51
+ - [Prerequisites](#prerequisites)
52
+ - [Installation](#installation)
53
+ - [Environment Setup](#environment-setup)
54
+ - [Basic Migration Workflow](#basic-migration-workflow)
55
+ - [Common Use Cases](#common-use-cases)
56
+ - [Single Workspace Migration](#single-workspace-migration)
57
+ - [Parent/Child Workspace Migration](#parentchild-workspace-migration)
58
+ - [Incremental Migration](#incremental-migration)
59
+ - [Migration Scripts Reference](#migration-scripts-reference)
60
+ - [Common Parameters](#common-parameters)
61
+ - [LDM Migration](#ldm-migration)
62
+ - [Color Palette Migration](#color-palette-migration)
63
+ - [Metrics Migration](#metrics-migration)
64
+ - [Insights Migration](#insights-migration)
65
+ - [Dashboards Migration](#dashboards-migration)
66
+ - [Reports Migration](#reports-migration)
67
+ - [Scheduled Exports Migration](#scheduled-exports-migration)
68
+ - [Dashboard Permissions Migration](#dashboard-permissions-migration)
69
+
70
+ - [Advanced Topics](#advanced-topics)
71
+ - [Filtering Objects for Migration](#filtering-objects-for-migration)
72
+ - [Understanding Mapping Files](#understanding-mapping-files)
73
+ - [Custom Client Object Migration](#custom-client-object-migration)
74
+ - [Advanced Mapping File Parameters](#advanced-mapping-file-parameters)
75
+ - [Web Comparison Tool](#web-comparison-tool)
76
+ - [Standalone Tools](#standalone-tools)
77
+
78
+ ## Quick Start Guide
79
+
80
+ ### Prerequisites
81
+
82
+ - Python 3.14.2 or newer
83
+ - Access to both GoodData Legacy and GoodData Cloud environments
84
+ - Admin permissions for both environments
85
+
86
+ ### Installation
87
+
88
+ #### Install from Source
89
+
90
+ 1. **Clone this repository**
91
+
92
+ ```bash
93
+ git clone git@github.com:gooddata/gooddata-legacy2cloud.git
94
+ ```
95
+
96
+ 1. **Install the package**
97
+
98
+ Navigate to the cloned repository in your system and install the package in your environment.
99
+
100
+ ```bash
101
+ cd gooddata-legacy2cloud
102
+ pip install .
103
+ ```
104
+
105
+ ### Environment Setup
106
+
107
+ Create a `.env` file with your access credentials:
108
+
109
+ ```
110
+ LEGACY_DOMAIN = "https://your-legacy-domain.com/"
111
+ LEGACY_LOGIN = "your_username"
112
+ LEGACY_PASSWORD = "your_password"
113
+ LEGACY_WS = "your_legacy_workspace_id"
114
+
115
+ CLOUD_DOMAIN = "https://your-cloud-domain.gooddata.com/"
116
+ CLOUD_TOKEN = "your_bearer_token"
117
+ CLOUD_WS = "your_cloud_workspace_id"
118
+
119
+ DATA_SOURCE_ID = "your_data_source_id"
120
+ SCHEMA = "your_schema"
121
+ TABLE_PREFIX = "your_table_prefix"
122
+
123
+ # Optional parameters
124
+ WS_DATA_FILTER_ID = "filter_id"
125
+ WS_DATA_FILTER_COLUMN = "filter_column"
126
+ WS_DATA_FILTER_DESCRIPTION = "filter_description"
127
+
128
+ # Notification channel ID is required for scheduled exports migration
129
+ CLOUD_NOTIFICATION_CHANNEL_ID=notification_channel_to_use_with_migrated_exports
130
+ ```
131
+
132
+ **Where to find these values:**
133
+ - **LEGACY_WS**: Navigate to your GoodData Legacy workspace and copy the project ID (PID) from the URL
134
+ - **CLOUD_TOKEN**: Generate a token in GoodData Cloud under User Settings > API Tokens
135
+ - **DATA_SOURCE_ID**: Get this from your Cloud workspace data source settings (create the data source before the migration)
136
+
137
+ ### Basic Migration Workflow
138
+
139
+ Run these scripts in sequence, verifying results after each step:
140
+
141
+ 1. **Migrate the Logical Data Model**
142
+
143
+ ```
144
+ gooddata-legacy2cloud ldm
145
+ ```
146
+
147
+ - Check in Cloud that your data model has been migrated correctly, check the data mapping if it was migrated
148
+ - Review any warnings or errors in the modeller
149
+
150
+ 1. **Migrate the color palette**
151
+
152
+ ```bash
153
+ gooddata-legacy2cloud color-palette
154
+ ```
155
+
156
+ 1. **Migrate Metrics**
157
+
158
+ ```
159
+ gooddata-legacy2cloud metrics
160
+ ```
161
+
162
+ Verify the metrics in Cloud, especially any with [ERROR] or [WARN] in the title
163
+
164
+ 1. **Migrate Insights (Visualizations)**
165
+
166
+ ```
167
+ gooddata-legacy2cloud insights
168
+ ```
169
+
170
+ Verify the insights in Cloud, especially any with [ERROR] or [WARN] in the title
171
+
172
+ 1. **Migrate Dashboards**
173
+
174
+ ```
175
+ gooddata-legacy2cloud dashboards
176
+ ```
177
+
178
+ Verify the dashboards in Cloud
179
+
180
+ 1. **Migrate Pixel Perfect Reports**
181
+
182
+ ```
183
+ gooddata-legacy2cloud reports
184
+ ```
185
+
186
+ Verify the Visualziations migrated from report in Cloud (by default they will have "[PP]" prefix)
187
+
188
+ 1. **Migrate Pixel Perfect Dashboards**
189
+
190
+ ```bash
191
+ gooddata-legacy2cloud pp-dashboards
192
+ ```
193
+
194
+ Verify the migrated Dashboards in Cloud
195
+
196
+ ## Common Use Cases
197
+
198
+ ### Single Workspace Migration
199
+
200
+ Migrating all content from one GoodData Legacy workspace to one GoodData Cloud workspace:
201
+
202
+ 1. **Set up your environment file** with source and target workspace IDs
203
+ 2. **Run the migration scripts in sequence**:
204
+ ```
205
+ gooddata-legacy2cloud ldm
206
+ gooddata-legacy2cloud metrics
207
+ gooddata-legacy2cloud insights
208
+ gooddata-legacy2cloud dashboards
209
+ ```
210
+ 3. **Verify the migrated content** in your Cloud workspace
211
+
212
+ ### Parent/Child Workspace Migration
213
+
214
+ For organizations with multiple workspaces that share content and want to also migrate the custom objects from client workspaces:
215
+
216
+ 1. **Prepare your Cloud environment**:
217
+ - Create an empty parent workspace in Cloud
218
+ - Create a child workspace for each client workspace in Cloud
219
+
220
+ 2. **Migrate the parent workspace** first:
221
+
222
+ ```
223
+ gooddata-legacy2cloud ldm
224
+ gooddata-legacy2cloud metrics
225
+ gooddata-legacy2cloud insights
226
+ gooddata-legacy2cloud dashboards
227
+ gooddata-legacy2cloud reports
228
+ ```
229
+
230
+ - **Note:** This migration toolkit does **not** create workspaces or provision users, user groups, or user permissions (except dashboard permissions). You must create all client workspaces to the Cloud organization separately before running the migration. If you want to migrate also dashboard permissions or scheduled emails, you also need to provision the users/user groups before that.
231
+
232
+ **Important:** : If you plan to use Workspace Data Filters to restrict which data each client workspace in Cloud can access, verify that you have the Workspace Data Filters defined and properly mapped for all datasets in LDM of your parent workspace. [Documentation](https://www.gooddata.com/docs/cloud/workspaces/workspace-data-filters/)
233
+
234
+ 3. **Migrate each client workspace** with client-specific prefix:
235
+
236
+ Note: The `--client-prefix` parameter automatically:
237
+ - Reads mappings from default mapping file (belonging to the parent) as well as client-specific mapping file (with defined client-specific prefix)
238
+ - Only migrates objects not present in the parent (=not present in the default mapping files)
239
+ - Prefixes any mapping or log it creates with the defined client-specific prefix (to prevent overwriting and easy identification)
240
+ - Validates that the target workspace is a child workspace (=has parent defined)
241
+ - Requires use of --legacy-ws and --parent-ws to prevent accidentally migrating into parent workspace in client mode
242
+
243
+ ```
244
+ # For client 1
245
+ gooddata-legacy2cloud metrics --legacy-ws client1_legacy_id --cloud-ws client1_cloud_id --client-prefix client1_
246
+ gooddata-legacy2cloud insights --legacy-ws client1_legacy_id --cloud-ws client1_cloud_id --client-prefix client1_
247
+ gooddata-legacy2cloud dashboards --legacy-ws client1_legacy_id --cloud-ws client1_cloud_id --client-prefix client1_
248
+ gooddata-legacy2cloud reports --legacy-ws client1_legacy_id --cloud-ws client1_cloud_id --client-prefix client1_
249
+ # For client 2
250
+ gooddata-legacy2cloud metrics --legacy-ws client2_legacy_id --cloud-ws client2_cloud_id --client-prefix client2_
251
+ gooddata-legacy2cloud insights --legacy-ws client2_legacy_id --cloud-ws client2_cloud_id --client-prefix client2_
252
+ gooddata-legacy2cloud dashboards --legacy-ws client2_legacy_id --cloud-ws client2_cloud_id --client-prefix client2_
253
+ gooddata-legacy2cloud reports --legacy-ws client2_legacy_id --cloud-ws client2_cloud_id --client-prefix client2_
254
+
255
+ # Repeat for each client
256
+ ```
257
+
258
+ Which would first completely migrate each client workspace (metrics, insights and dashboards) and then continue to the next one.
259
+ Alternatively You can also first migrate all metrics in all workspaces, then all insights in all workspaces and then all dashboards in all workspaces:
260
+
261
+ ```bash
262
+ # Migrate all clients metrics
263
+ gooddata-legacy2cloud metrics --legacy-ws client1_legacy_id --cloud-ws client1_cloud_id --client-prefix client1_
264
+ gooddata-legacy2cloud metrics --legacy-ws client2_legacy_id --cloud-ws client2_cloud_id --client-prefix client2_
265
+ # Repeat for each client
266
+
267
+ # Migrate all clients insights
268
+ gooddata-legacy2cloud insights --legacy-ws client2_legacy_id --cloud-ws client2_cloud_id --client-prefix client2_
269
+ gooddata-legacy2cloud insights --legacy-ws client1_legacy_id --cloud-ws client1_cloud_id --client-prefix client1_
270
+ # Repeat for each client
271
+
272
+ # Migrate all clients dashboards
273
+ gooddata-legacy2cloud dashboards --legacy-ws client1_legacy_id --cloud-ws client1_cloud_id --client-prefix client1_
274
+ gooddata-legacy2cloud dashboards --legacy-ws client2_legacy_id --cloud-ws client2_cloud_id --client-prefix client2_
275
+ # Repeat for each client
276
+
277
+ # Migrate all clients reports
278
+ gooddata-legacy2cloud reports --legacy-ws client1_legacy_id --cloud-ws client1_cloud_id --client-prefix client1_
279
+ gooddata-legacy2cloud reports --legacy-ws client2_legacy_id --cloud-ws client2_cloud_id --client-prefix client2_
280
+ # Repeat for each client
281
+ ```
282
+
283
+ ### Incremental Migration
284
+
285
+ Migrating only new objects added since your last migration:
286
+
287
+ ```
288
+ gooddata-legacy2cloud metrics --without-mapped-objects
289
+ gooddata-legacy2cloud insights --without-mapped-objects
290
+ gooddata-legacy2cloud dashboards --without-mapped-objects
291
+ gooddata-legacy2cloud reports --without-mapped-objects
292
+ ```
293
+
294
+ Note that the migration scripts currently do not support overwriting already existing objects in Cloud. Instead of overwriting, any object with ID already existing in the Cloud workspace is skipped.
295
+
296
+ ## Migration Scripts Reference
297
+
298
+ ### Common Parameters
299
+
300
+ These parameters are available in all migration scripts:
301
+
302
+ **--help** - Display help information about the script
303
+
304
+ **--env [path_to_env_file]** - Specify a custom .env file (default: .env)
305
+
306
+ **--legacy-ws** - Source Legacy workspace ID. Overrides LEGACY_WS from the .env file (required for --client-prefix)
307
+
308
+ **--cloud-ws** - Target Cloud workspace ID. Overrides CLOUD_WS from the .env file (required for --client-prefix)
309
+
310
+ **--skip-deploy** - Skip deployment to Cloud (useful for testing)
311
+
312
+ **--dump-legacy** - Dump Legacy objects to a JSON file
313
+
314
+ **--dump-cloud** - Dump Cloud objects to a JSON file
315
+
316
+ **--cleanup-target-env** - Remove ALL existing objects of that type (i.e. metrics for `metrics`) in the target environment before migration
317
+
318
+ **--overwrite-existing** - Updates existing objects instead of skipping them. Affects also dashboard components like filter contexts and comparison widgets that are created during migration of the dashboard.
319
+
320
+ **--output-files-prefix [prefix]** - Add a specified prefix to all output filenames the script generates (mapping files, logs, ...)
321
+
322
+ **--check-parent-workspace** - Before starting migration check that the target Cloud workspace has a parent workspace
323
+
324
+ **--client-prefix [prefix]** - Special parameter for easy migration of objects in client workspaces - see [Custom Client Object Migration](#custom-client-object-migration)
325
+
326
+ **--suppress-migration-warnings** - Suppress migration warnings from being added to object titles and descriptions. Warnings will still be printed to console for visibility. This parameter only affects warnings; errors are still added to objects.
327
+
328
+ #### Element Lookup Parameters
329
+
330
+ These parameters optimize the lookup of attribute element values (filter values) from Legacy during migration. In Legacy normally if an attribute value is used in an object definition (i.e. a filter) it has to be present in the workspce to be able to read and migrate it. Otherwise a manual fix is needed to the migrated object. These parameters allow to overcome this limation by looking up the value in the Legacy workspace Validation that checks reports and metrics for missing values.
331
+ These are meant to fill-in a few missing values, do not run the migration tool with these on an empty workspace.
332
+
333
+ **--element-values-prefetch** - Scans objects for migration for attribute element URIs and batch-fetches their values before processing. This optimization reduces Legacy API calls during migration. Works independently of validation. Does not fix any missing values by itself.
334
+
335
+ **--validation-element-lookup** - Uses Legacy's workspace validation endpoint to fetch missing attribute element values. The validation process returns missing element values for used in metrics and reports and they are later used for the migration of missing values.
336
+
337
+ **--validation-element-lookup-with-metrics** - Advanced strategy combining values prefetch prefetch with temporary Legacy metric creation for comprehensive element lookup. it creates temporary metrics in the Legacy workspace for any unmapped elements, runs validation to populate cache from these metrics, and finally deletes the temporary metrics. This requires permission to create and delete metrics in the Legacy workspace. Includes prefetch and validation, no need to use the other `*-element-*` parameters with it.
338
+ This parameter is only available for `insights` and `dashboards`
339
+
340
+ ### LDM Migration
341
+
342
+ ```
343
+ gooddata-legacy2cloud ldm
344
+ ```
345
+
346
+ Script generates:
347
+
348
+ - LDM object mappings to `ldm_mappings.csv`
349
+
350
+ **LDM-specific options:**
351
+
352
+ **--ignore-folders** - Legacy folders for LDM objects are not migrated to Cloud tags. Use if you used only tags for organizing the catalog in Legacy.
353
+
354
+ **--ignore-explicit-mapping** - Explicit LDM mapping (Legacy Mapping from Modeler used for ADDv2) is not used even if it exists. Instead the ADS naming convention is used for LDM mapping.
355
+
356
+ ### Metrics Migration
357
+
358
+ ```
359
+ gooddata-legacy2cloud metrics
360
+ ```
361
+
362
+ Script generates:
363
+
364
+ - Metric mappings to `metric_mappings.csv`
365
+ - MAQL transformation log to `metrics_maql.log`
366
+ - Failed Cloud metrics to `cloud_failed_metrics.json`
367
+ - Skipped objects IDs to `cloud_skipped_metrics.json`
368
+
369
+ Script reads:
370
+
371
+ - LDM mappings from `ldm_mappings.csv`
372
+
373
+ Notes:
374
+
375
+ - If any element values are missing within the Legacy metric, they are replaced with `--MISSING VALUE--`. Such metrics can be found in `metrics_maql.log` file and these metrics are also marked with [WARN] in their title (unless `--suppress-migration-warnings` is used). Warnings are always printed to console.
376
+ - If converted MAQL fails to be saved to Cloud, such metrics are converted to "ERROR metrics". These have [ERROR] in their title, their definition is changed to `SELECT SQRT(-1)` (=returns NULL) and their original converted MAQL is left in the comment. These metrics should be manually inspected.
377
+ - Objects that already exist in Cloud (based on their ID) are skipped and their IDs are recorded in the skipped objects file (unless `--overwrite-existing` is used).
378
+ - To prevent missing element values, use `--validation-element-lookup` (see [Element Lookup Parameters](#element-lookup-parameters))
379
+
380
+ **Metrics-specific options:**
381
+
382
+ **--keep-original-ids** - Keep original metric identifiers from Legacy. Otherwise the Cloud ID is derived from metric title and Legacy identifier.
383
+
384
+ **--ignore-folders** - Legacy folders of Metrics are not migrated to Cloud tags. Use if you used only tags for organizing the catalog in Legacy.
385
+
386
+ ### Color Palette Migration
387
+
388
+ ```bash
389
+ gooddata-legacy2cloud color-palette
390
+ ```
391
+
392
+ Migrate color palette from Legacy workspace and set it as the default palette at Organization level. This will also remove all other existing color palettes from the organization. Migrating color palettes per workspace is currently not supported.
393
+
394
+ To see the supported CLI arguments, run
395
+
396
+ ```bash
397
+ gooddata-legacy2cloud color-palette --help
398
+ ```
399
+
400
+ ### Insights Migration
401
+
402
+ ```bash
403
+ gooddata-legacy2cloud insights
404
+ ```
405
+
406
+ Script generates:
407
+
408
+ - Insights mappings to `insight_mappings.csv`
409
+ - Insights transformation log to `insight_logs.log`
410
+ - Failed Cloud insights to `cloud_failed_insights.json`
411
+ - Skipped objects IDs to `cloud_skipped_insights.json`
412
+
413
+ Script reads:
414
+
415
+ - LDM mappings from `ldm_mappings.csv`
416
+ - Metric mappings from `metric_mappings.csv`
417
+
418
+ Notes:
419
+
420
+ - If any element values used in Legacy insight filter definition are missing, they are removed and such insight is marked as [WARN] (unless `--suppress-migration-warnings` is used). It should be manually inspected. Information about what is missing is added to the insight description. Warnings are always printed to console.
421
+ - If there are any errors in Cloud insight creation, such insights can be found in `insights_logs.log` file.
422
+ - The script cannot migrate Geo charts at this time.
423
+ - Objects that already exist in Cloud (based on their ID) are skipped and their IDs are recorded in the skipped objects file (unless `--overwrite-existing` is used).
424
+ - For best results with element lookup, use `--validation-element-lookup-with-metrics` (see [Element Lookup Parameters](#element-lookup-parameters))
425
+
426
+ **Insights-specific options:**
427
+
428
+ **--keep-original-ids** - Keep original Legacy identifiers as Cloud IDs instead of generating new ones. Otherwise the Cloud ID is derived from the insight title and Legacy identifier.
429
+
430
+ ### Dashboards Migration
431
+
432
+ ```bash
433
+ gooddata-legacy2cloud dashboards
434
+ ```
435
+
436
+ Script generates:
437
+
438
+ - Dashboards mappings to `dashboard_mappings.csv`
439
+ - Dashboards transformation log to `dashboards_logs.log`
440
+ - Failed Cloud dashboards to `cloud_failed_dashboards.json`
441
+ - Skipped objects IDs to `cloud_skipped_dashboards.json`
442
+
443
+ Script reads:
444
+
445
+ - LDM mappings from `ldm_mappings.csv`
446
+ - Metric mappings from `metric_mappings.csv`
447
+ - Insights mappings from `insight_mappings.csv`
448
+
449
+ Notes:
450
+ This script only migrates the Responsive Dashboards (a.k.a. KPI Dashboards). The tooling currently does not migrate Pixel Perfect Dashboards.
451
+
452
+ - If any element values used in the Legacy definition of a Dashboards is missing within the Legacy dashboards, they are removed and such dashboard is marked as [WARN] (unless `--suppress-migration-warnings` is used) with details in the description for manual inspection. Warnings are always printed to console.
453
+ - If there are any errors in Cloud dashboard creation, such dashboards can be found in `dashboards_logs.log` file.
454
+ - All migrated dashboards are first created as empty ones and in the next phase updated to the final structure to make sure all drillToDashboards have existing target. If some target is missing (i.e. because that dashboard is not migrated) such drill is removed and the dashboard is marked as [WARN] (unless `--suppress-migration-warnings` is used) and details about removed drills are put into its description. Warnings are always printed to console.
455
+ - Objects that already exist in Cloud (based on their ID) are skipped and their IDs are recorded in the skipped objects file (unless `--overwrite-existing` is used).
456
+ - For best results with element lookup, use `--validation-element-lookup-with-metrics` (see [Element Lookup Parameters](#element-lookup-parameters))
457
+
458
+ **Dashboards-specific options:**
459
+
460
+ **--keep-original-ids** - Keep original Legacy identifiers as Cloud IDs instead of generating new ones. Otherwise the Cloud ID is derived from the dashboard title and Legacy identifier.
461
+
462
+ ### Pixel Perfect Dashboards Migration
463
+
464
+ ```bash
465
+ gooddata-legacy2cloud pp-dashboards
466
+ ```
467
+
468
+ Notes:
469
+
470
+ - By default, each Legacy Pixel Perfect dashboard is migrated **one-to-one** into a single Cloud KPI dashboard that uses **native tabs** (one Legacy tab -> one Cloud tab).
471
+ - Use `--pp-legacy-split-tabs` to enable the legacy behavior where each Legacy tab is migrated as a separate Cloud dashboard (intended for transition only).
472
+ - Use `--keep-original-ids` to keep the Legacy PP dashboard identifier as the Cloud dashboard ID. Cannot be combined with `--pp-legacy-split-tabs`. Note that dashboards created with this flag will not be removed when `--cleanup-target-env` is used AND will get removed if you migrate regular dashboards with `--cleanup-target-env` after this.
473
+
474
+ ### Reports Migration
475
+
476
+ ```bash
477
+ gooddata-legacy2cloud reports
478
+ ```
479
+
480
+ Script generates:
481
+
482
+ - Report mappings to `report_mappings.csv`
483
+ - Reports transformation log to `report_logs.log`
484
+ - Failed Cloud reports to `cloud_failed_reports.json`
485
+ - Skipped objects IDs to `cloud_skipped_reports.json`
486
+
487
+ Script reads:
488
+
489
+ - LDM mappings from `ldm_mappings.csv`
490
+ - Metric mappings from `metric_mappings.csv`
491
+
492
+ Notes:
493
+
494
+ - This script performs a best-effort migration of Pixel Perfect Reports from Legacy to Cloud.
495
+ - Pixel Perfect reports do not exist in Cloud, the script converts them to Cloud visualizations as closely as possible. The visual appearance may differ.
496
+ - Some features specific to Pixel Perfect reports (i.e. types of filters) might not be available in Cloud.
497
+ - Reports containing features not available in Cloud are marked by adding [WARN] to the migrated visualization name (unless `--suppress-migration-warnings` is used). Details are added to the description. Warnings are always printed to console.
498
+ - To prevent missing element values, use `--validation-element-lookup` (see [Element Lookup Parameters](#element-lookup-parameters))
499
+
500
+ **Reports-specific options:**
501
+
502
+ **--report-prefix** - Prefix added to the visualziations migrated from PixelPerfect reports to distinguish them from those migrated from Insights. Default is '[PP] '. Use empty string to disable the prefix.
503
+
504
+ **--keep-original-ids** - Keep original metric identifiers from Legacy. Otherwise, the Cloud ID is derived from metric title and Legacy identifier. Note that insights created with this flag will not be removed when `--cleanup-target-env` is used AND will get removed if you migrate regular insights with `--cleanup-target-env` after this.
505
+
506
+ ### Scheduled Exports Migration
507
+
508
+ ```bash
509
+ gooddata-legacy2cloud scheduled-exports
510
+ ```
511
+
512
+ Script generates:
513
+
514
+ - Export mappings to `scheduled_export_mappings.csv`
515
+ - Metadata transformations log to `scheduled_exports_logs.log`
516
+
517
+ Script reads:
518
+
519
+ - Insight mappings from `insight_mappings.csv`
520
+ - Dashboard mappings from `dashboard_mappings.csv`
521
+
522
+ Prerequisities:
523
+
524
+ - The LDM, insights and dashboards need to be migrated prior to sheduled exports.
525
+ - Legacy users need to be provisioned in Cloud. The script will match `to` recipients based on email. Existence of `bcc` recipients is not checked.
526
+
527
+ - `CLOUD_NOTIFICATION_CHANNEL_ID` environment variable needs to be set.
528
+
529
+ Notes:
530
+
531
+ - By default, the script does not migrate such scheduled emails which do not have a recipient or any attachment.
532
+ - If Legacy recipient from `to` field does not exist in Cloud, they are skipped. The script will still attempt to create the export.
533
+ - Legacy recipients from `to` field are mapped to Cloud `recipients`, Legacy `bcc` email addresses will be set as `external_recipients` in Cloud.
534
+ - Only scheduled emails from Legacy KPI dashboards are migrated. The script does not migrate automations generated on Pixel Perfect reports.
535
+ - If a migrated Legacy export uses only dashboard filters, but those filters have values selected, these filter values will be baked into the Cloud automation. This could be adjusted for visual exports (PDF), but Cloud tabular exports (CSV, XLSX) can only be created with persistent filter selections.
536
+
537
+ **Reports-specific options:**
538
+
539
+ **--exports-to-migrate** - List of specific scheduled exports to migrate. The value should be a path to a csv containing a single column (without header) with Legacy IDs of scheduled exports which should be migrated.
540
+
541
+ ### Dashboard Permissions Migration
542
+
543
+ After migrating dashboards from Legacy to Cloud, and provisioning users and user groups to your Cloud Organization (which is not done by this migration toolkit), you can migrate dashboard ownership and permissions to properly attribute ownership and access rights to non-public dashboards to the original users and user groups.
544
+
545
+ ```bash
546
+ gooddata-legacy2cloud dashboard-permissions
547
+ ```
548
+
549
+ **What this script does:**
550
+
551
+ 1. Fetches selected Legacy dashboards based on filter parameters
552
+ 2. Identifies the creator (account that created the dashboard) from Legacy
553
+ 3. Collects sharing information (grantees) from Legacy dashboard permissions
554
+ 4. Maps Legacy users to Cloud users based on either Legacy `email` field or Legacy `login` field
555
+ 5. Maps Legacy user groups to Cloud user groups based on group names
556
+ 6. Updates the Cloud workspace layout to reflect the correct creator and dashboard permissions for matched users and user groups
557
+
558
+ **Script generates:**
559
+
560
+ - Consolidated permissions changes log to `cloud_dashboard_permissions_changes.log` (includes creator updates and permission changes)
561
+ - Optional layout dumps: `cloud_layout_before.json` and `cloud_layout_after.json` (with `--dump-layout`)
562
+
563
+ **Script reads:**
564
+
565
+ - Dashboard mappings from `dashboard_mappings.csv`
566
+
567
+ **Prerequisites:**
568
+
569
+ - Dashboards need to be migrated to Cloud before running this script
570
+ - Legacy users should be provisioned in Cloud with matching identifiers:
571
+ - By default: Legacy `login` field should match Cloud user `email` field
572
+ - With `--use-email`: Legacy `email` field (not `login`) should match Cloud user `email` field
573
+ - Legacy user groups should exist in Cloud with matching names
574
+ - Note that while in Legacy the user groups are workspace-specific, in Cloud they are organization-wide
575
+ - User account executing the migration needs `org.MANAGE` permissions to update workspace layout via API
576
+
577
+ **Dashboard Permissions-specific options:**
578
+
579
+ **--dump-layout** - Store the layout JSON locally before and after modifications for debugging purposes
580
+
581
+ **--use-email** - Use Legacy email field instead of login field when matching Legacy users to Cloud users. By default, the script uses the login field from Legacy users to match against Cloud user emails. With this parameter it uses email field from Legacy users to match against Cloud user emails.
582
+
583
+ **--skip-creators** - Skip migrating creator permissions (only migrate grantees)
584
+
585
+ **--skip-individual-grantees** - Skip migrating individual user grantee permissions (only migrate creators and group grantees)
586
+
587
+ **--skip-group-grantees** - Skip migrating user group grantee permissions (only migrate creators and individual grantees)
588
+
589
+ **--permission [VIEW|SHARE|EDIT]** - Dashboard permission level to assign to grantee users and user groups (default: EDIT). The dashboard creator always receives EDIT permission regardless of this setting. Note that in Legacy there was only a single dashboard permission and ability to edit was determined by user role in the workspace.
590
+
591
+ **--print-user-mappings** - Print detailed user mapping information for each Legacy user during the migration process
592
+
593
+ **--keep-existing-permissions** - Keep existing Cloud permissions that are not present in the Legacy source. Without this flag the script removes unmanaged permissions during the synchronization step.
594
+
595
+ **--skip-kpi-dashboards** - Skip adjusting permissions of KPI dashboards.
596
+
597
+ **--skip-pp-dashboards** - Skip adjusting permissions of Pixel Perfect dashboards.
598
+
599
+ **--pp-dashboard-mapping-file** - Path to the Pixel Perfect dashboards mapping file.
600
+
601
+ **Example usage:**
602
+
603
+ ```bash
604
+
605
+ # Migrate all permissions (creators, users, and groups)
606
+ gooddata-legacy2cloud dashboard-permissions
607
+
608
+ # Only migrate creators, skip all grantees
609
+ gooddata-legacy2cloud dashboard-permissions --skip-individual-grantees --skip-group-grantees
610
+
611
+ # Migrate with VIEW permission for grantees instead of EDIT
612
+ gooddata-legacy2cloud dashboard-permissions --permission VIEW
613
+
614
+ # Update with client prefix
615
+ gooddata-legacy2cloud dashboard-permissions --client-prefix client1_ --legacy-ws client1_legacy_ws --cloud-ws client1_cloud_ws
616
+ ```
617
+
618
+ **Important notes:**
619
+ **Warning:** By default this script synchronizes permissions, meaning it removes any Cloud permissions that do not exist in Legacy (unless they belong to sections skipped with `--skip-*`). This includes the permission of the account used for the migraiton! Workspace admins can still see all the dashboards. Use `--keep-existing-permissions` to keep extra Cloud permissions untouched.
620
+
621
+ - This script modifies the workspace layout directly via the Layout API
622
+ - Always test with `--skip-deploy` first to preview changes
623
+ - The script only logs actual changes made, not items that were already correct
624
+ - User mapping is case-sensitive:
625
+ - By default: Legacy `login` field is matched against Cloud user `email`
626
+ - With `--use-email`: Legacy `email` field is matched against Cloud user `email`
627
+ - User group mapping is based on exact name matching between Legacy and Cloud
628
+ - The script does not provision users or user groups to the Cloud organization
629
+ - The script does not grant users workspace permissions (only dashboard-specific permissions)
630
+ - The log file groups changes by dashboard title with one JSON line per change for easy parsing
631
+
632
+ ## Advanced Topics
633
+
634
+ ### Filtering Objects for Migration
635
+
636
+ The migration scripts provide flexible filtering options to control which objects get migrated. All these parameters only apply to `metrics`, `insights` and `dashboards`. (Logical Data Model is always migrated as a complete).
637
+ The filtering works as a two-step process. First set of parameters (--only-\* parameters) defines which objects are being read from Legacy. Then these can be further filtered down by various properties defined by a second set of parameters (--with\_/--without\*).
638
+
639
+ #### Initial Object Selection (--only-\* parameters)
640
+
641
+ Controls which objects are gathered from Legacy for the migration:
642
+
643
+ - **--only-object-ids** - Only migrate specific objects by their numeric IDs (comma-separated)
644
+ - **--only-identifiers** - Only migrate specific objects by their alphanumeric identifiers (comma-separated)
645
+ - **--only-object-ids-with-dependencies** - Same as --only-object-ids, but also includes all their dependent objects
646
+ - **--only-identifiers-with-dependencies** - Same as --only-identifiers, but also includes all their dependent objects
647
+
648
+ Note that each script will still only migrate one type of objects (e.g. `metrics` migrates metrics) but you can pass objects of any types to the --only-identifiers-with-dependencies and --only-object-ids-with-dependencies parameters. It will find dependent objects of the proper type to migrate. This is useful if you want to migrate a few dashboards and do not want to explicitly list all their dependent metrics and insights.
649
+
650
+ Only one of these parameters can be used at a time.
651
+
652
+ #### Post-Download Filtering (--with*/--without* parameters)
653
+
654
+ Further filter the downloaded objects based on specific features before migrating them:
655
+
656
+ - **--with-tags** - Only migrate downloaded objects with at least one of the specified tags (comma-separated)
657
+ - **--without-tags** - Only migrate downloaded objects that don't have any of the specified tags (comma-separated)
658
+ - **--with-locked-flag** - Only migrate downloaded objects that have locked=1 flag in their metadata
659
+ - **--without-locked-flag** - Only migrate downloaded objects that have locked=0 or no locked flag in their metadata
660
+ - **--with-creator-profiles** - Only migrate downloaded objects created by one of the specified Legacy user profile IDs (comma-separated, without /gdc/account/profile/ prefix)
661
+ - **--without-creator-profiles** - Only migrate downloaded objects NOT created by any of the specified Legacy user profile IDs (comma-separated, without /gdc/account/profile/ prefix)
662
+ - **--without-mapped-objects** - Filter out downloaded objects with Legacy identifiers already present in the corresponding mapping file(s). By default, checks all (default and additional) mapping files. Use --without-mapped-objects default_only to only check the default mapping file.
663
+
664
+ Multiple --with*/--without* parameters can be used together and are treated with AND operator
665
+
666
+ **Note on Creator Profiles:** The Legacy user profile ID can be found in the object's metadata under the `author` field. It's formatted as `/gdc/account/profile/{profile_id}`. When using the `--with-creator-profiles` or `--without-creator-profiles` parameters, provide only the `{profile_id}` part (e.g., `0102b54c3859150e0d75e52f1a3d034f`).
667
+
668
+ ### Understanding Mapping Files
669
+
670
+ Mapping files are critical for the migration process:
671
+
672
+ - Each migration script generates a mapping file of the objects it migrated (e.g., ldm_mappings.csv, metric_mappings.csv)
673
+ - These files contain "Legacy ID (identifier)" to "Cloud ID" mappings
674
+ - Later scripts use these mappings to establish relationships between migrated objects
675
+ - Presence of an identifier in the mapping file (from previous migration runs) can also be used to filter which objects to migrate
676
+ - There can be more than one mapping file on the script input - in that case all are used combined
677
+ - In case of --client-prefix the default mapping file is meant to have objects from the parent workspace and client-prefixed mapping file is meant to contain client-specific objects.
678
+
679
+ ### Custom Client Object Migration
680
+
681
+ Cloud supports true inheritance of objects between workspaces, while in Legacy all the objects are local copies. To properly migrate between these two paradigms, you need to decide what is common and should go to the parent and what are client-specific objects and will go to individual client workspaces.
682
+
683
+ The migration tooling does support this use case directly with a parameter --client-prefix:
684
+
685
+ **--client-prefix [prefix]** - This parameter does several things at once:
686
+
687
+ - Sets the prefix for all output files (same as --output-files-prefix)
688
+ - Enables checking the parent workspace (same as --check-parent-workspace)
689
+ - **Must** be used together with --legacy-ws and --cloud-ws parameters
690
+ - Looks for both standard and prefixed mapping files (i.e. metric_mappings.csv and client1_metric_mappings.csv) if found, will use both
691
+ - Automatically enables filtering by default mapping files (same as --without-mapped-objects default_only)
692
+
693
+ This combined behavior is ideal for migration of individual client workspaces after the parent/master workspace was migrated.
694
+ All the objects migrated to the parent workspace are in the default mapping files, while for each client workspace a new prefixed mapping file with objects specific to that workspace is created.
695
+
696
+ The target Cloud workspace already must be in a workspace hierarchy and have a parent defined.
697
+
698
+ **Note:** When using `--client-prefix`, you **must** also specify `--legacy-ws` and `--cloud-ws` parameters. This is a safety measure to ensure you're migrating between the correct client workspaces, not accidentally using the master workspaces from your .env file.
699
+
700
+ ```bash
701
+ gooddata-legacy2cloud insights --client-prefix client1_ --legacy-ws client1_ws --cloud-ws client1_cloud_ws
702
+ ```
703
+
704
+ ### Advanced Mapping File Parameters
705
+
706
+ These parameters control which mapping files are used as input for each script and where the output mappings are written.
707
+
708
+ #### Main Mapping File Parameters
709
+
710
+ These parameters override the default mapping files used by the scripts:
711
+
712
+ | Parameter | Default Value | Read by Scripts | Generated by Script | Description |
713
+ | ---------------------------- | ---------------------- | ----------------------------- | ------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------- |
714
+ | **--ldm-mapping-file** | ldm_mappings.csv | metrics, insights, dashboards | ldm | Specifies the LDM mapping file(s) to read from. First file is used for output, all for input. Comma-separated list. |
715
+ | **--metric-mapping-file** | metric_mappings.csv | insights, dashboards | metrics | Specifies the metric mapping file(s) to read from and for metrics to write to. First file is used for output, all for input. Comma-separated list. |
716
+ | **--insight-mapping-file** | insight_mappings.csv | dashboards | insights | Specifies the insight mapping file(s) to read from and for insights to write to. First file is used for output, all for input. Comma-separated list. |
717
+ | **--dashboard-mapping-file** | dashboard_mappings.csv | None | dashboards | Specifies the dashboard mapping file(s) for dashboards to write to. First file is used for output, all for input. Comma-separated list. |
718
+
719
+ When specifying multiple files with comma separation, only the first file is used for writing new mappings, while all files are used for reading existing mappings.
720
+
721
+ #### Using Multiple Mapping Files
722
+
723
+ You can specify multiple mapping files in two ways:
724
+
725
+ 1. **Using comma-separated lists:**
726
+
727
+ ```bash
728
+ gooddata-legacy2cloud insights --metric-mapping-file main_metrics.csv,project1_metrics.csv,project2_metrics.csv
729
+ ```
730
+
731
+ This loads all three mapping files for lookups
732
+
733
+ 2. **Using --client-prefix:**
734
+
735
+ ```bash
736
+ gooddata-legacy2cloud insights --client-prefix client1_
737
+ ```
738
+
739
+ This loads both the default file (e.g., metric_mappings.csv) and the prefixed version (e.g., client1_metric_mappings.csv) if it exists.
740
+
741
+ The --client-prefix parameter is a handy shortcut that automatically sets --output-files-prefix to the same value and loads both default and prefixed mapping files.
742
+
743
+ ## Web Comparison Tool
744
+
745
+ The toolkit includes a web-based comparison tool that visualizes migration results in user-friendly HTML pages, making it easy to review and validate migrated content.
746
+
747
+ ```bash
748
+ gooddata-legacy2cloud web-compare
749
+ ```
750
+
751
+ ### Key Features
752
+
753
+ - Automatically processes all migration log files in a directory
754
+ - Detects object types (metrics, insights, dashboards) and client prefixes from log filenames
755
+ - Generates a separate HTML page for each log file with detailed migration results
756
+ - Provides side-by-side comparison view of objects in Legacy and Cloud
757
+ - Organizes prefixed client outputs in separate directories. Shows also objects inherited from the hierarchy
758
+ - Includes filtering, sorting, and search capabilities in the web interface
759
+ - Works completely offline without requiring a web server
760
+
761
+ ### Basic Usage
762
+
763
+ ```bash
764
+ # Process logs in current directory, output to `compare_web` folder
765
+ gooddata-legacy2cloud web-compare --env .env
766
+
767
+ # Specify custom directories
768
+ gooddata-legacy2cloud web-compare --log-dir=logs/project1 --output-dir=reviews/project1
769
+
770
+ # Do not show inherited objects for client workspaces
771
+ gooddata-legacy2cloud web-compare --skip-inherited
772
+ ```
773
+
774
+ ### Workspace Structure
775
+
776
+ The tool creates a structured output directory:
777
+
778
+ - Main HTML files for unprefixed (parent) workspace in the root output directory
779
+ - Subdirectories for each client prefix containing their specific HTML files
780
+ - A shared `resources` directory with CSS, JavaScript, and images (shared between parent and all clients)
781
+
782
+ This structure allows you to easily share the results with clients by copying their specific folder along with the resources directory. In such case the links to parent workspace will be automatically deactivated.
783
+
784
+ ### Using the Web Interface
785
+
786
+ The web interface provides several powerful features:
787
+
788
+ 1. **Navigation**
789
+ - Use the left sidebar to switch between object types and client workspaces
790
+ - Click on "BACK TO PARENT" to return from client workspace to parent workspace view
791
+
792
+ 2. **Filtering and Searching**
793
+ - Click the summary cards at the top to filter by migration status
794
+ - Use the search box to find specific objects by title or ID
795
+ - Sort the table by clicking on any column header
796
+
797
+ 3. **Object Comparison**
798
+ - Click the "Compare" button to open a live side-by-side view of the object in Legacy and Cloud
799
+ - Use the divider controls to adjust the split view ratio (the arrow icons maximize one of the views, the = sign splits the view equally).
800
+ - Navigate between individual objects with Previous/Next buttons
801
+ - Open either object in its full native UI with the "Open in Legacy/Cloud" buttons
802
+ - Compare and Legacy and Cloud workspace links require valid GoodData sessions in your browser to work
803
+ - Note: For Pixel Perfect Reports, the comparison is currently not avialable for inherited objects
804
+
805
+ 4. **Status Indicators**
806
+ - Color-coded status icons show the migration outcome for each object
807
+ - Hover over status icons for detailed information
808
+ - Click the info (ℹ️) icon to view detailed error messages, warnings or object descriptions.
809
+
810
+ ### Command Line Options
811
+
812
+ Usage: gooddata-legacy2cloud web-compare [options]
813
+
814
+ Options:
815
+ | Option | Description |
816
+ |-|-|
817
+ | --env ENV_FILE | Environment file to use for fallback workspace IDs |
818
+ | --log-dir LOG_DIR | Path to directory with migration log files (default: current directory) |
819
+ | --output-dir DIR | Directory to write HTML output to (default: compare_web) |
820
+ | --skip-inherited | Do not include objects inherited from parent workspace into client pages |
821
+
822
+ ### Notes
823
+
824
+ - The output HTML pages work completely offline and can be viewed locally in a modern browser
825
+ - In case of browser with restrictions on local file access (like Safari), you can overcome it by running a simple local web server i.e. in Python:
826
+
827
+ ```
828
+ python3 -m http.server 8000
829
+ ```
830
+
831
+ Then open: http://localhost:8000/dashboards_web_compare.html
832
+
833
+ ## Standalone Tools
834
+
835
+ There are standalone tools that can support the migration process, even though they do not migrate any objects directly.
836
+ Have a look at the [tools/README](tools/README.md) to find out more