cognite-toolkit 0.7.30__py3-none-any.whl → 0.7.51__py3-none-any.whl

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 (281) hide show
  1. cognite_toolkit/_cdf.py +5 -6
  2. cognite_toolkit/_cdf_tk/apps/__init__.py +2 -0
  3. cognite_toolkit/_cdf_tk/apps/_core_app.py +7 -1
  4. cognite_toolkit/_cdf_tk/apps/_download_app.py +2 -2
  5. cognite_toolkit/_cdf_tk/apps/_dump_app.py +1 -1
  6. cognite_toolkit/_cdf_tk/apps/_import_app.py +41 -0
  7. cognite_toolkit/_cdf_tk/apps/_migrate_app.py +183 -8
  8. cognite_toolkit/_cdf_tk/builders/_function.py +81 -9
  9. cognite_toolkit/_cdf_tk/builders/_raw.py +1 -1
  10. cognite_toolkit/_cdf_tk/client/_resource_base.py +187 -0
  11. cognite_toolkit/_cdf_tk/client/_toolkit_client.py +44 -12
  12. cognite_toolkit/_cdf_tk/client/api/agents.py +107 -0
  13. cognite_toolkit/_cdf_tk/client/api/annotations.py +129 -0
  14. cognite_toolkit/_cdf_tk/client/api/assets.py +130 -0
  15. cognite_toolkit/_cdf_tk/client/api/containers.py +132 -0
  16. cognite_toolkit/_cdf_tk/client/api/data_models.py +137 -0
  17. cognite_toolkit/_cdf_tk/client/api/datasets.py +141 -0
  18. cognite_toolkit/_cdf_tk/client/api/events.py +129 -0
  19. cognite_toolkit/_cdf_tk/client/api/extraction_pipelines.py +148 -0
  20. cognite_toolkit/_cdf_tk/client/api/filemetadata.py +176 -0
  21. cognite_toolkit/_cdf_tk/client/api/function_schedules.py +115 -0
  22. cognite_toolkit/_cdf_tk/client/api/functions.py +113 -0
  23. cognite_toolkit/_cdf_tk/client/api/graphql_data_models.py +167 -0
  24. cognite_toolkit/_cdf_tk/client/api/groups.py +121 -0
  25. cognite_toolkit/_cdf_tk/client/api/hosted_extractor_destinations.py +131 -0
  26. cognite_toolkit/_cdf_tk/client/api/hosted_extractor_jobs.py +122 -0
  27. cognite_toolkit/_cdf_tk/client/api/hosted_extractor_mappings.py +129 -0
  28. cognite_toolkit/_cdf_tk/client/api/hosted_extractor_sources.py +136 -0
  29. cognite_toolkit/_cdf_tk/client/api/hosted_extractors.py +23 -0
  30. cognite_toolkit/_cdf_tk/client/api/infield.py +40 -35
  31. cognite_toolkit/_cdf_tk/client/api/instances.py +139 -0
  32. cognite_toolkit/_cdf_tk/client/api/labels.py +125 -0
  33. cognite_toolkit/_cdf_tk/client/api/{canvas.py → legacy/canvas.py} +16 -8
  34. cognite_toolkit/_cdf_tk/client/api/{charts.py → legacy/charts.py} +1 -1
  35. cognite_toolkit/_cdf_tk/client/api/{extended_data_modeling.py → legacy/extended_data_modeling.py} +1 -1
  36. cognite_toolkit/_cdf_tk/client/api/{extended_files.py → legacy/extended_files.py} +2 -2
  37. cognite_toolkit/_cdf_tk/client/api/{extended_functions.py → legacy/extended_functions.py} +9 -9
  38. cognite_toolkit/_cdf_tk/client/api/{extended_raw.py → legacy/extended_raw.py} +1 -1
  39. cognite_toolkit/_cdf_tk/client/api/{extended_timeseries.py → legacy/extended_timeseries.py} +5 -2
  40. cognite_toolkit/_cdf_tk/client/api/legacy/location_filters.py +112 -0
  41. cognite_toolkit/_cdf_tk/client/api/legacy/robotics/__init__.py +8 -0
  42. cognite_toolkit/_cdf_tk/client/api/{robotics → legacy/robotics}/capabilities.py +1 -1
  43. cognite_toolkit/_cdf_tk/client/api/{robotics → legacy/robotics}/data_postprocessing.py +1 -1
  44. cognite_toolkit/_cdf_tk/client/api/{robotics → legacy/robotics}/frames.py +1 -1
  45. cognite_toolkit/_cdf_tk/client/api/{robotics → legacy/robotics}/locations.py +1 -1
  46. cognite_toolkit/_cdf_tk/client/api/{robotics → legacy/robotics}/maps.py +1 -1
  47. cognite_toolkit/_cdf_tk/client/api/{robotics → legacy/robotics}/robots.py +2 -2
  48. cognite_toolkit/_cdf_tk/client/api/legacy/search_config.py +53 -0
  49. cognite_toolkit/_cdf_tk/client/api/location_filters.py +140 -75
  50. cognite_toolkit/_cdf_tk/client/api/migration.py +2 -3
  51. cognite_toolkit/_cdf_tk/client/api/project.py +9 -8
  52. cognite_toolkit/_cdf_tk/client/api/raw.py +204 -0
  53. cognite_toolkit/_cdf_tk/client/api/relationships.py +133 -0
  54. cognite_toolkit/_cdf_tk/client/api/robotics.py +19 -0
  55. cognite_toolkit/_cdf_tk/client/api/robotics_capabilities.py +127 -0
  56. cognite_toolkit/_cdf_tk/client/api/robotics_data_postprocessing.py +138 -0
  57. cognite_toolkit/_cdf_tk/client/api/robotics_frames.py +122 -0
  58. cognite_toolkit/_cdf_tk/client/api/robotics_locations.py +127 -0
  59. cognite_toolkit/_cdf_tk/client/api/robotics_maps.py +122 -0
  60. cognite_toolkit/_cdf_tk/client/api/robotics_robots.py +122 -0
  61. cognite_toolkit/_cdf_tk/client/api/search.py +2 -2
  62. cognite_toolkit/_cdf_tk/client/api/search_config.py +83 -31
  63. cognite_toolkit/_cdf_tk/client/api/security_categories.py +94 -0
  64. cognite_toolkit/_cdf_tk/client/api/sequences.py +133 -0
  65. cognite_toolkit/_cdf_tk/client/api/simulator_models.py +154 -0
  66. cognite_toolkit/_cdf_tk/client/api/simulators.py +8 -0
  67. cognite_toolkit/_cdf_tk/client/api/spaces.py +117 -0
  68. cognite_toolkit/_cdf_tk/client/api/streams.py +68 -56
  69. cognite_toolkit/_cdf_tk/client/api/three_d.py +385 -34
  70. cognite_toolkit/_cdf_tk/client/api/timeseries.py +137 -0
  71. cognite_toolkit/_cdf_tk/client/api/token.py +1 -1
  72. cognite_toolkit/_cdf_tk/client/api/transformations.py +146 -0
  73. cognite_toolkit/_cdf_tk/client/api/views.py +139 -0
  74. cognite_toolkit/_cdf_tk/client/api/workflow_triggers.py +128 -0
  75. cognite_toolkit/_cdf_tk/client/api/workflow_versions.py +138 -0
  76. cognite_toolkit/_cdf_tk/client/api/workflows.py +119 -0
  77. cognite_toolkit/_cdf_tk/client/cdf_client/__init__.py +10 -0
  78. cognite_toolkit/_cdf_tk/client/cdf_client/api.py +358 -0
  79. cognite_toolkit/_cdf_tk/client/cdf_client/responses.py +38 -0
  80. cognite_toolkit/_cdf_tk/{utils → client}/http_client/__init__.py +30 -0
  81. cognite_toolkit/_cdf_tk/{utils → client}/http_client/_client.py +26 -16
  82. cognite_toolkit/_cdf_tk/{utils → client}/http_client/_data_classes.py +18 -2
  83. cognite_toolkit/_cdf_tk/client/http_client/_data_classes2.py +151 -0
  84. cognite_toolkit/_cdf_tk/client/http_client/_exception.py +13 -0
  85. cognite_toolkit/_cdf_tk/client/http_client/_item_classes.py +118 -0
  86. cognite_toolkit/_cdf_tk/{utils → client}/http_client/_tracker.py +5 -2
  87. cognite_toolkit/_cdf_tk/client/request_classes/base.py +19 -0
  88. cognite_toolkit/_cdf_tk/client/request_classes/filters.py +113 -0
  89. cognite_toolkit/_cdf_tk/client/request_classes/graphql.py +28 -0
  90. cognite_toolkit/_cdf_tk/client/resource_classes/__init__.py +0 -0
  91. cognite_toolkit/_cdf_tk/client/resource_classes/agent.py +130 -0
  92. cognite_toolkit/_cdf_tk/client/resource_classes/annotation.py +79 -0
  93. cognite_toolkit/_cdf_tk/client/resource_classes/apm_config.py +128 -0
  94. cognite_toolkit/_cdf_tk/client/resource_classes/asset.py +47 -0
  95. cognite_toolkit/_cdf_tk/client/{data_classes → resource_classes}/charts_data.py +1 -1
  96. cognite_toolkit/_cdf_tk/client/resource_classes/cognite_file.py +53 -0
  97. cognite_toolkit/_cdf_tk/client/resource_classes/data_modeling/__init__.py +168 -0
  98. cognite_toolkit/_cdf_tk/client/resource_classes/data_modeling/_constraints.py +37 -0
  99. cognite_toolkit/_cdf_tk/client/resource_classes/data_modeling/_container.py +50 -0
  100. cognite_toolkit/_cdf_tk/client/resource_classes/data_modeling/_data_model.py +73 -0
  101. cognite_toolkit/_cdf_tk/client/resource_classes/data_modeling/_data_types.py +116 -0
  102. cognite_toolkit/_cdf_tk/client/resource_classes/data_modeling/_indexes.py +26 -0
  103. cognite_toolkit/_cdf_tk/client/resource_classes/data_modeling/_instance.py +154 -0
  104. cognite_toolkit/_cdf_tk/client/resource_classes/data_modeling/_references.py +86 -0
  105. cognite_toolkit/_cdf_tk/client/resource_classes/data_modeling/_space.py +26 -0
  106. cognite_toolkit/_cdf_tk/client/resource_classes/data_modeling/_view.py +143 -0
  107. cognite_toolkit/_cdf_tk/client/resource_classes/data_modeling/_view_property.py +152 -0
  108. cognite_toolkit/_cdf_tk/client/resource_classes/dataset.py +35 -0
  109. cognite_toolkit/_cdf_tk/client/resource_classes/event.py +40 -0
  110. cognite_toolkit/_cdf_tk/client/resource_classes/extraction_pipeline.py +59 -0
  111. cognite_toolkit/_cdf_tk/client/resource_classes/filemetadata.py +52 -0
  112. cognite_toolkit/_cdf_tk/client/resource_classes/function.py +53 -0
  113. cognite_toolkit/_cdf_tk/client/resource_classes/function_schedule.py +65 -0
  114. cognite_toolkit/_cdf_tk/client/resource_classes/graphql_data_model.py +40 -0
  115. cognite_toolkit/_cdf_tk/client/resource_classes/group/__init__.py +187 -0
  116. cognite_toolkit/_cdf_tk/client/resource_classes/group/_constants.py +2 -0
  117. cognite_toolkit/_cdf_tk/client/resource_classes/group/acls.py +653 -0
  118. cognite_toolkit/_cdf_tk/client/resource_classes/group/capability.py +56 -0
  119. cognite_toolkit/_cdf_tk/client/resource_classes/group/group.py +63 -0
  120. cognite_toolkit/_cdf_tk/client/resource_classes/group/scopes.py +166 -0
  121. cognite_toolkit/_cdf_tk/client/resource_classes/hosted_extractor_destination.py +34 -0
  122. cognite_toolkit/_cdf_tk/client/resource_classes/hosted_extractor_job.py +134 -0
  123. cognite_toolkit/_cdf_tk/client/resource_classes/hosted_extractor_mapping.py +72 -0
  124. cognite_toolkit/_cdf_tk/client/resource_classes/hosted_extractor_source/__init__.py +63 -0
  125. cognite_toolkit/_cdf_tk/client/resource_classes/hosted_extractor_source/_auth.py +63 -0
  126. cognite_toolkit/_cdf_tk/client/resource_classes/hosted_extractor_source/_base.py +26 -0
  127. cognite_toolkit/_cdf_tk/client/resource_classes/hosted_extractor_source/_certificate.py +20 -0
  128. cognite_toolkit/_cdf_tk/client/resource_classes/hosted_extractor_source/_eventhub.py +31 -0
  129. cognite_toolkit/_cdf_tk/client/resource_classes/hosted_extractor_source/_kafka.py +53 -0
  130. cognite_toolkit/_cdf_tk/client/resource_classes/hosted_extractor_source/_mqtt.py +36 -0
  131. cognite_toolkit/_cdf_tk/client/resource_classes/hosted_extractor_source/_rest.py +49 -0
  132. cognite_toolkit/_cdf_tk/client/resource_classes/identifiers.py +59 -0
  133. cognite_toolkit/_cdf_tk/client/{data_classes → resource_classes}/infield.py +1 -1
  134. cognite_toolkit/_cdf_tk/client/{data_classes → resource_classes}/instance_api.py +53 -14
  135. cognite_toolkit/_cdf_tk/client/resource_classes/label.py +27 -0
  136. cognite_toolkit/_cdf_tk/client/resource_classes/legacy/__init__.py +0 -0
  137. cognite_toolkit/_cdf_tk/client/{data_classes → resource_classes/legacy}/canvas.py +48 -15
  138. cognite_toolkit/_cdf_tk/client/{data_classes → resource_classes/legacy}/charts.py +1 -1
  139. cognite_toolkit/_cdf_tk/client/resource_classes/location_filter.py +84 -0
  140. cognite_toolkit/_cdf_tk/client/resource_classes/raw.py +44 -0
  141. cognite_toolkit/_cdf_tk/client/resource_classes/relationship.py +49 -0
  142. cognite_toolkit/_cdf_tk/client/resource_classes/resource_view_mapping.py +38 -0
  143. cognite_toolkit/_cdf_tk/client/resource_classes/robotics/__init__.py +37 -0
  144. cognite_toolkit/_cdf_tk/client/resource_classes/robotics/_capability.py +53 -0
  145. cognite_toolkit/_cdf_tk/client/resource_classes/robotics/_common.py +34 -0
  146. cognite_toolkit/_cdf_tk/client/resource_classes/robotics/_data_post_processing.py +49 -0
  147. cognite_toolkit/_cdf_tk/client/resource_classes/robotics/_frame.py +46 -0
  148. cognite_toolkit/_cdf_tk/client/resource_classes/robotics/_location.py +36 -0
  149. cognite_toolkit/_cdf_tk/client/resource_classes/robotics/_map.py +65 -0
  150. cognite_toolkit/_cdf_tk/client/resource_classes/robotics/_robot.py +58 -0
  151. cognite_toolkit/_cdf_tk/client/resource_classes/search_config.py +54 -0
  152. cognite_toolkit/_cdf_tk/client/resource_classes/securitycategory.py +24 -0
  153. cognite_toolkit/_cdf_tk/client/resource_classes/sequence.py +45 -0
  154. cognite_toolkit/_cdf_tk/client/resource_classes/sequence_rows.py +56 -0
  155. cognite_toolkit/_cdf_tk/client/resource_classes/simulator_model.py +50 -0
  156. cognite_toolkit/_cdf_tk/client/resource_classes/streamlit_.py +71 -0
  157. cognite_toolkit/_cdf_tk/client/{data_classes → resource_classes}/streams.py +9 -26
  158. cognite_toolkit/_cdf_tk/client/resource_classes/three_d.py +135 -0
  159. cognite_toolkit/_cdf_tk/client/resource_classes/timeseries.py +52 -0
  160. cognite_toolkit/_cdf_tk/client/resource_classes/transformation.py +140 -0
  161. cognite_toolkit/_cdf_tk/client/resource_classes/workflow.py +27 -0
  162. cognite_toolkit/_cdf_tk/client/resource_classes/workflow_trigger.py +63 -0
  163. cognite_toolkit/_cdf_tk/client/resource_classes/workflow_version.py +155 -0
  164. cognite_toolkit/_cdf_tk/client/testing.py +54 -17
  165. cognite_toolkit/_cdf_tk/commands/__init__.py +1 -0
  166. cognite_toolkit/_cdf_tk/commands/_migrate/command.py +103 -108
  167. cognite_toolkit/_cdf_tk/commands/_migrate/conversion.py +29 -16
  168. cognite_toolkit/_cdf_tk/commands/_migrate/creators.py +1 -1
  169. cognite_toolkit/_cdf_tk/commands/_migrate/data_classes.py +38 -6
  170. cognite_toolkit/_cdf_tk/commands/_migrate/data_mapper.py +262 -36
  171. cognite_toolkit/_cdf_tk/commands/_migrate/data_model.py +1 -0
  172. cognite_toolkit/_cdf_tk/commands/_migrate/default_mappings.py +1 -1
  173. cognite_toolkit/_cdf_tk/commands/_migrate/issues.py +39 -38
  174. cognite_toolkit/_cdf_tk/commands/_migrate/migration_io.py +227 -8
  175. cognite_toolkit/_cdf_tk/commands/_profile.py +1 -1
  176. cognite_toolkit/_cdf_tk/commands/_purge.py +14 -16
  177. cognite_toolkit/_cdf_tk/commands/_upload.py +1 -1
  178. cognite_toolkit/_cdf_tk/commands/build_cmd.py +12 -2
  179. cognite_toolkit/_cdf_tk/commands/build_v2/__init__.py +0 -0
  180. cognite_toolkit/_cdf_tk/commands/build_v2/_module_parser.py +138 -0
  181. cognite_toolkit/_cdf_tk/commands/build_v2/_modules_parser.py +163 -0
  182. cognite_toolkit/_cdf_tk/commands/build_v2/build_cmd.py +228 -0
  183. cognite_toolkit/_cdf_tk/commands/build_v2/build_parameters.py +71 -0
  184. cognite_toolkit/_cdf_tk/commands/build_v2/data_classes/_modules.py +27 -0
  185. cognite_toolkit/_cdf_tk/commands/build_v2/data_classes/_resource.py +22 -0
  186. cognite_toolkit/_cdf_tk/commands/dump_resource.py +4 -4
  187. cognite_toolkit/_cdf_tk/commands/pull.py +97 -2
  188. cognite_toolkit/_cdf_tk/commands/run.py +1 -1
  189. cognite_toolkit/_cdf_tk/cruds/__init__.py +16 -6
  190. cognite_toolkit/_cdf_tk/cruds/_data_cruds.py +9 -5
  191. cognite_toolkit/_cdf_tk/cruds/_resource_cruds/__init__.py +2 -0
  192. cognite_toolkit/_cdf_tk/cruds/_resource_cruds/auth.py +6 -2
  193. cognite_toolkit/_cdf_tk/cruds/_resource_cruds/classic.py +70 -89
  194. cognite_toolkit/_cdf_tk/cruds/_resource_cruds/configuration.py +1 -1
  195. cognite_toolkit/_cdf_tk/cruds/_resource_cruds/datamodel.py +1 -1
  196. cognite_toolkit/_cdf_tk/cruds/_resource_cruds/extraction_pipeline.py +1 -1
  197. cognite_toolkit/_cdf_tk/cruds/_resource_cruds/fieldops.py +34 -25
  198. cognite_toolkit/_cdf_tk/cruds/_resource_cruds/file.py +50 -59
  199. cognite_toolkit/_cdf_tk/cruds/_resource_cruds/function.py +14 -2
  200. cognite_toolkit/_cdf_tk/cruds/_resource_cruds/industrial_tool.py +1 -1
  201. cognite_toolkit/_cdf_tk/cruds/_resource_cruds/location.py +4 -3
  202. cognite_toolkit/_cdf_tk/cruds/_resource_cruds/migration.py +1 -1
  203. cognite_toolkit/_cdf_tk/cruds/_resource_cruds/raw.py +6 -1
  204. cognite_toolkit/_cdf_tk/cruds/_resource_cruds/relationship.py +5 -4
  205. cognite_toolkit/_cdf_tk/cruds/_resource_cruds/robotics.py +1 -1
  206. cognite_toolkit/_cdf_tk/cruds/_resource_cruds/simulators.py +122 -0
  207. cognite_toolkit/_cdf_tk/cruds/_resource_cruds/streams.py +15 -31
  208. cognite_toolkit/_cdf_tk/cruds/_resource_cruds/timeseries.py +42 -47
  209. cognite_toolkit/_cdf_tk/cruds/_resource_cruds/transformation.py +49 -14
  210. cognite_toolkit/_cdf_tk/data_classes/__init__.py +3 -0
  211. cognite_toolkit/_cdf_tk/data_classes/_issues.py +36 -0
  212. cognite_toolkit/_cdf_tk/data_classes/_module_directories.py +2 -1
  213. cognite_toolkit/_cdf_tk/data_classes/_module_toml.py +1 -0
  214. cognite_toolkit/_cdf_tk/data_classes/_tracking_info.py +4 -0
  215. cognite_toolkit/_cdf_tk/feature_flags.py +8 -0
  216. cognite_toolkit/_cdf_tk/resource_classes/__init__.py +2 -0
  217. cognite_toolkit/_cdf_tk/resource_classes/capabilities.py +6 -0
  218. cognite_toolkit/_cdf_tk/resource_classes/search_config.py +1 -1
  219. cognite_toolkit/_cdf_tk/resource_classes/simulator_model.py +17 -0
  220. cognite_toolkit/_cdf_tk/resource_classes/workflow_version.py +173 -5
  221. cognite_toolkit/_cdf_tk/storageio/_applications.py +53 -15
  222. cognite_toolkit/_cdf_tk/storageio/_asset_centric.py +117 -107
  223. cognite_toolkit/_cdf_tk/storageio/_base.py +3 -1
  224. cognite_toolkit/_cdf_tk/storageio/_datapoints.py +7 -7
  225. cognite_toolkit/_cdf_tk/storageio/_file_content.py +65 -56
  226. cognite_toolkit/_cdf_tk/storageio/_instances.py +1 -1
  227. cognite_toolkit/_cdf_tk/storageio/_raw.py +1 -1
  228. cognite_toolkit/_cdf_tk/storageio/logger.py +162 -0
  229. cognite_toolkit/_cdf_tk/storageio/selectors/__init__.py +10 -1
  230. cognite_toolkit/_cdf_tk/storageio/selectors/_three_d.py +34 -0
  231. cognite_toolkit/_cdf_tk/tk_warnings/__init__.py +2 -0
  232. cognite_toolkit/_cdf_tk/tk_warnings/fileread.py +20 -0
  233. cognite_toolkit/_cdf_tk/utils/__init__.py +11 -1
  234. cognite_toolkit/_cdf_tk/utils/cdf.py +1 -1
  235. cognite_toolkit/_cdf_tk/utils/interactive_select.py +53 -4
  236. cognite_toolkit/_cdf_tk/utils/modules.py +7 -0
  237. cognite_toolkit/_cdf_tk/utils/pip_validator.py +96 -0
  238. cognite_toolkit/_cdf_tk/utils/useful_types.py +4 -7
  239. cognite_toolkit/_cdf_tk/utils/useful_types2.py +14 -0
  240. cognite_toolkit/_cdf_tk/validation.py +4 -0
  241. cognite_toolkit/_repo_files/GitHub/.github/workflows/deploy.yaml +1 -1
  242. cognite_toolkit/_repo_files/GitHub/.github/workflows/dry-run.yaml +1 -1
  243. cognite_toolkit/_resources/cdf.toml +1 -1
  244. cognite_toolkit/_version.py +1 -1
  245. {cognite_toolkit-0.7.30.dist-info → cognite_toolkit-0.7.51.dist-info}/METADATA +13 -3
  246. cognite_toolkit-0.7.51.dist-info/RECORD +445 -0
  247. {cognite_toolkit-0.7.30.dist-info → cognite_toolkit-0.7.51.dist-info}/WHEEL +2 -2
  248. cognite_toolkit/_cdf_tk/client/api/robotics/__init__.py +0 -3
  249. cognite_toolkit/_cdf_tk/client/data_classes/api_classes.py +0 -17
  250. cognite_toolkit/_cdf_tk/client/data_classes/base.py +0 -87
  251. cognite_toolkit/_cdf_tk/client/data_classes/three_d.py +0 -47
  252. cognite_toolkit/_cdf_tk/prototypes/import_app.py +0 -41
  253. cognite_toolkit/_cdf_tk/utils/http_client/_data_classes2.py +0 -187
  254. cognite_toolkit/_cdf_tk/utils/http_client/_exception.py +0 -4
  255. cognite_toolkit-0.7.30.dist-info/RECORD +0 -316
  256. /cognite_toolkit/_cdf_tk/client/{data_classes → api/legacy}/__init__.py +0 -0
  257. /cognite_toolkit/_cdf_tk/client/api/{dml.py → legacy/dml.py} +0 -0
  258. /cognite_toolkit/_cdf_tk/client/api/{fixed_transformations.py → legacy/fixed_transformations.py} +0 -0
  259. /cognite_toolkit/_cdf_tk/client/api/{robotics → legacy/robotics}/api.py +0 -0
  260. /cognite_toolkit/_cdf_tk/client/api/{robotics → legacy/robotics}/utlis.py +0 -0
  261. /cognite_toolkit/_cdf_tk/{prototypes/commands → client/request_classes}/__init__.py +0 -0
  262. /cognite_toolkit/_cdf_tk/client/{data_classes → resource_classes}/capabilities.py +0 -0
  263. /cognite_toolkit/_cdf_tk/client/{data_classes → resource_classes/legacy}/apm_config_v1.py +0 -0
  264. /cognite_toolkit/_cdf_tk/client/{data_classes → resource_classes/legacy}/extendable_cognite_file.py +0 -0
  265. /cognite_toolkit/_cdf_tk/client/{data_classes → resource_classes/legacy}/extended_filemetadata.py +0 -0
  266. /cognite_toolkit/_cdf_tk/client/{data_classes → resource_classes/legacy}/extended_filemetdata.py +0 -0
  267. /cognite_toolkit/_cdf_tk/client/{data_classes → resource_classes/legacy}/extended_timeseries.py +0 -0
  268. /cognite_toolkit/_cdf_tk/client/{data_classes → resource_classes/legacy}/functions.py +0 -0
  269. /cognite_toolkit/_cdf_tk/client/{data_classes → resource_classes/legacy}/graphql_data_models.py +0 -0
  270. /cognite_toolkit/_cdf_tk/client/{data_classes → resource_classes/legacy}/instances.py +0 -0
  271. /cognite_toolkit/_cdf_tk/client/{data_classes → resource_classes/legacy}/location_filters.py +0 -0
  272. /cognite_toolkit/_cdf_tk/client/{data_classes → resource_classes/legacy}/migration.py +0 -0
  273. /cognite_toolkit/_cdf_tk/client/{data_classes → resource_classes/legacy}/pending_instances_ids.py +0 -0
  274. /cognite_toolkit/_cdf_tk/client/{data_classes → resource_classes/legacy}/project.py +0 -0
  275. /cognite_toolkit/_cdf_tk/client/{data_classes → resource_classes/legacy}/raw.py +0 -0
  276. /cognite_toolkit/_cdf_tk/client/{data_classes → resource_classes/legacy}/robotics.py +0 -0
  277. /cognite_toolkit/_cdf_tk/client/{data_classes → resource_classes/legacy}/search_config.py +0 -0
  278. /cognite_toolkit/_cdf_tk/client/{data_classes → resource_classes/legacy}/sequences.py +0 -0
  279. /cognite_toolkit/_cdf_tk/client/{data_classes → resource_classes/legacy}/streamlit_.py +0 -0
  280. /cognite_toolkit/_cdf_tk/{prototypes/commands/import_.py → commands/_import_cmd.py} +0 -0
  281. {cognite_toolkit-0.7.30.dist-info → cognite_toolkit-0.7.51.dist-info}/entry_points.txt +0 -0
@@ -1,7 +1,7 @@
1
1
  from collections.abc import Iterable, Mapping, Set
2
2
  from typing import Any, ClassVar, cast
3
3
 
4
- from cognite.client.data_classes import Annotation, Asset, Event, FileMetadata, TimeSeries
4
+ from cognite.client.data_classes import Annotation
5
5
  from cognite.client.data_classes.data_modeling import (
6
6
  DirectRelation,
7
7
  DirectRelationReference,
@@ -9,27 +9,31 @@ from cognite.client.data_classes.data_modeling import (
9
9
  MappedProperty,
10
10
  NodeApply,
11
11
  NodeId,
12
+ ViewId,
12
13
  )
13
14
  from cognite.client.data_classes.data_modeling.instances import EdgeApply, NodeOrEdgeData, PropertyValueWrite
14
15
  from cognite.client.data_classes.data_modeling.views import ViewProperty
15
16
  from cognite.client.utils._identifier import InstanceId
16
17
 
17
18
  from cognite_toolkit._cdf_tk.client import ToolkitClient
18
- from cognite_toolkit._cdf_tk.client.data_classes.migration import (
19
+ from cognite_toolkit._cdf_tk.client.resource_classes.asset import AssetResponse
20
+ from cognite_toolkit._cdf_tk.client.resource_classes.data_modeling import NodeReference
21
+ from cognite_toolkit._cdf_tk.client.resource_classes.event import EventResponse
22
+ from cognite_toolkit._cdf_tk.client.resource_classes.filemetadata import FileMetadataResponse
23
+ from cognite_toolkit._cdf_tk.client.resource_classes.legacy.migration import (
19
24
  AssetCentricId,
20
25
  ResourceViewMappingApply,
21
26
  )
27
+ from cognite_toolkit._cdf_tk.client.resource_classes.timeseries import TimeSeriesResponse
22
28
  from cognite_toolkit._cdf_tk.utils.collection import flatten_dict_json_path
23
29
  from cognite_toolkit._cdf_tk.utils.dtype_conversion import (
24
30
  asset_centric_convert_to_primary_property,
25
31
  convert_to_primary_property,
26
32
  )
27
- from cognite_toolkit._cdf_tk.utils.useful_types import (
28
- AssetCentricResourceExtended,
29
- AssetCentricTypeExtended,
30
- )
33
+ from cognite_toolkit._cdf_tk.utils.useful_types import AssetCentricTypeExtended
34
+ from cognite_toolkit._cdf_tk.utils.useful_types2 import AssetCentricResourceExtended
31
35
 
32
- from .data_model import INSTANCE_SOURCE_VIEW_ID
36
+ from .data_model import COGNITE_MIGRATION_SPACE_ID, INSTANCE_SOURCE_VIEW_ID
33
37
  from .issues import ConversionIssue, FailedConversion, InvalidPropertyDataType
34
38
 
35
39
 
@@ -110,22 +114,22 @@ class DirectRelationCache:
110
114
  file_ids.add(file_id)
111
115
  if isinstance(file_external_id := file_ref.get("externalId"), str):
112
116
  file_external_ids.add(file_external_id)
113
- elif isinstance(resource, Asset):
117
+ elif isinstance(resource, AssetResponse):
114
118
  if resource.source:
115
119
  source_ids.add(resource.source)
116
120
  if resource.parent_id is not None:
117
121
  asset_ids.add(resource.parent_id)
118
- elif isinstance(resource, FileMetadata):
122
+ elif isinstance(resource, FileMetadataResponse):
119
123
  if resource.source:
120
124
  source_ids.add(resource.source)
121
125
  if resource.asset_ids:
122
126
  asset_ids.update(resource.asset_ids)
123
- elif isinstance(resource, Event):
127
+ elif isinstance(resource, EventResponse):
124
128
  if resource.source:
125
129
  source_ids.add(resource.source)
126
130
  if resource.asset_ids:
127
131
  asset_ids.update(resource.asset_ids)
128
- elif isinstance(resource, TimeSeries):
132
+ elif isinstance(resource, TimeSeriesResponse):
129
133
  if resource.asset_id is not None:
130
134
  asset_ids.add(resource.asset_id)
131
135
  if asset_ids:
@@ -169,6 +173,7 @@ def asset_centric_to_dm(
169
173
  view_source: ResourceViewMappingApply,
170
174
  view_properties: dict[str, ViewProperty],
171
175
  direct_relation_cache: DirectRelationCache,
176
+ preferred_consumer_view: ViewId | None = None,
172
177
  ) -> tuple[NodeApply | EdgeApply | None, ConversionIssue]:
173
178
  """Convert an asset-centric resource to a data model instance.
174
179
 
@@ -178,6 +183,7 @@ def asset_centric_to_dm(
178
183
  view_source (ResourceViewMappingApply): The view source defining how to map the resource to the data model.
179
184
  view_properties (dict[str, ViewProperty]): The defined properties referenced in the view source mapping.
180
185
  direct_relation_cache (DirectRelationCache): Cache for direct relation references.
186
+ preferred_consumer_view (ViewId | None): The preferred consumer view for the instance.
181
187
 
182
188
  Returns:
183
189
  tuple[NodeApply | EdgeApply, ConversionIssue]: A tuple containing the converted NodeApply and any ConversionIssue encountered.
@@ -193,7 +199,11 @@ def asset_centric_to_dm(
193
199
  data_set_id = dumped.pop("dataSetId", None)
194
200
  external_id = dumped.pop("externalId", None)
195
201
 
196
- issue = ConversionIssue(asset_centric_id=AssetCentricId(resource_type, id_=id_), instance_id=instance_id)
202
+ issue = ConversionIssue(
203
+ id=str(AssetCentricId(resource_type, id_=id_)),
204
+ asset_centric_id=AssetCentricId(resource_type, id_=id_),
205
+ instance_id=NodeReference(space=instance_id.space, external_id=instance_id.external_id),
206
+ )
197
207
 
198
208
  properties = create_properties(
199
209
  dumped,
@@ -213,7 +223,10 @@ def asset_centric_to_dm(
213
223
  "id": id_,
214
224
  "dataSetId": data_set_id,
215
225
  "classicExternalId": external_id,
226
+ "resourceViewMapping": {"space": COGNITE_MIGRATION_SPACE_ID, "externalId": view_source.external_id},
216
227
  }
228
+ if preferred_consumer_view:
229
+ instance_source_properties["preferredConsumerViewId"] = preferred_consumer_view.dump()
217
230
  sources.append(NodeOrEdgeData(source=INSTANCE_SOURCE_VIEW_ID, properties=instance_source_properties))
218
231
 
219
232
  instance: NodeApply | EdgeApply
@@ -239,13 +252,13 @@ def asset_centric_to_dm(
239
252
 
240
253
 
241
254
  def _lookup_resource_type(resource_type: AssetCentricResourceExtended) -> AssetCentricTypeExtended:
242
- if isinstance(resource_type, Asset):
255
+ if isinstance(resource_type, AssetResponse):
243
256
  return "asset"
244
- elif isinstance(resource_type, FileMetadata):
257
+ elif isinstance(resource_type, FileMetadataResponse):
245
258
  return "file"
246
- elif isinstance(resource_type, Event):
259
+ elif isinstance(resource_type, EventResponse):
247
260
  return "event"
248
- elif isinstance(resource_type, TimeSeries):
261
+ elif isinstance(resource_type, TimeSeriesResponse):
249
262
  return "timeseries"
250
263
  elif isinstance(resource_type, Annotation):
251
264
  if resource_type.annotated_resource_type == "file" and resource_type.annotation_type in (
@@ -20,7 +20,7 @@ from cognite.client.data_classes.documents import SourceFileProperty
20
20
  from cognite.client.data_classes.events import EventProperty
21
21
 
22
22
  from cognite_toolkit._cdf_tk.client import ToolkitClient
23
- from cognite_toolkit._cdf_tk.client.data_classes.apm_config_v1 import APMConfig, APMConfigList
23
+ from cognite_toolkit._cdf_tk.client.resource_classes.legacy.apm_config_v1 import APMConfig, APMConfigList
24
24
  from cognite_toolkit._cdf_tk.cruds import NodeCRUD, ResourceCRUD, SpaceCRUD
25
25
  from cognite_toolkit._cdf_tk.exceptions import ToolkitMissingResourceError, ToolkitRequiredValueError
26
26
  from cognite_toolkit._cdf_tk.utils import humanize_collection
@@ -9,11 +9,14 @@ from cognite.client.data_classes._base import (
9
9
  from cognite.client.data_classes.data_modeling import EdgeId, InstanceApply, NodeId, ViewId
10
10
  from cognite.client.utils._identifier import InstanceId
11
11
  from cognite.client.utils._text import to_camel_case
12
- from pydantic import BaseModel, BeforeValidator, field_validator, model_validator
13
-
14
- from cognite_toolkit._cdf_tk.client.data_classes.instances import InstanceApplyList
15
- from cognite_toolkit._cdf_tk.client.data_classes.migration import AssetCentricId
16
- from cognite_toolkit._cdf_tk.client.data_classes.pending_instances_ids import PendingInstanceId
12
+ from pydantic import BaseModel, BeforeValidator, Field, field_validator, model_validator
13
+
14
+ from cognite_toolkit._cdf_tk.client._resource_base import BaseModelObject, RequestResource
15
+ from cognite_toolkit._cdf_tk.client.resource_classes.identifiers import InternalId
16
+ from cognite_toolkit._cdf_tk.client.resource_classes.instance_api import InstanceIdentifier
17
+ from cognite_toolkit._cdf_tk.client.resource_classes.legacy.instances import InstanceApplyList
18
+ from cognite_toolkit._cdf_tk.client.resource_classes.legacy.migration import AssetCentricId
19
+ from cognite_toolkit._cdf_tk.client.resource_classes.legacy.pending_instances_ids import PendingInstanceId
17
20
  from cognite_toolkit._cdf_tk.commands._migrate.default_mappings import (
18
21
  ASSET_ANNOTATIONS_ID,
19
22
  FILE_ANNOTATIONS_ID,
@@ -24,8 +27,8 @@ from cognite_toolkit._cdf_tk.storageio._data_classes import ModelList
24
27
  from cognite_toolkit._cdf_tk.utils.useful_types import (
25
28
  AssetCentricKindExtended,
26
29
  JsonVal,
27
- T_AssetCentricResourceExtended,
28
30
  )
31
+ from cognite_toolkit._cdf_tk.utils.useful_types2 import T_AssetCentricResourceExtended
29
32
 
30
33
 
31
34
  class MigrationMapping(BaseModel, alias_generator=to_camel_case, extra="ignore", populate_by_name=True):
@@ -261,3 +264,32 @@ class AssetCentricMappingList(
261
264
 
262
265
  def as_write(self) -> InstanceApplyList:
263
266
  return InstanceApplyList([item.as_write() for item in self])
267
+
268
+
269
+ class Model(BaseModelObject):
270
+ instance_id: InstanceIdentifier
271
+
272
+
273
+ class Thumbnail(BaseModelObject):
274
+ instance_id: InstanceIdentifier
275
+
276
+
277
+ class ThreeDRevisionMigrationRequest(RequestResource):
278
+ space: str
279
+ type: Literal["CAD", "PointCloud", "Image360"]
280
+ revision_id: int
281
+ model: Model
282
+
283
+ def as_id(self) -> InternalId:
284
+ return InternalId(id=self.revision_id)
285
+
286
+
287
+ class ThreeDMigrationRequest(RequestResource):
288
+ model_id: int
289
+ type: Literal["CAD", "PointCloud", "Image360"]
290
+ space: str
291
+ thumbnail: Thumbnail | None = None
292
+ revision: ThreeDRevisionMigrationRequest = Field(exclude=True)
293
+
294
+ def as_id(self) -> InternalId:
295
+ return InternalId(id=self.model_id)
@@ -1,7 +1,7 @@
1
1
  from abc import ABC, abstractmethod
2
2
  from collections import defaultdict
3
3
  from collections.abc import Callable, Sequence
4
- from typing import Generic, cast
4
+ from typing import Generic, Literal, cast
5
5
  from uuid import uuid4
6
6
 
7
7
  from cognite.client.data_classes.data_modeling import (
@@ -15,41 +15,57 @@ from cognite.client.data_classes.data_modeling import (
15
15
  from cognite.client.exceptions import CogniteException
16
16
 
17
17
  from cognite_toolkit._cdf_tk.client import ToolkitClient
18
- from cognite_toolkit._cdf_tk.client.data_classes.canvas import (
18
+ from cognite_toolkit._cdf_tk.client.resource_classes.charts_data import (
19
+ ChartCoreTimeseries,
20
+ ChartSource,
21
+ ChartTimeseries,
22
+ )
23
+ from cognite_toolkit._cdf_tk.client.resource_classes.instance_api import InstanceIdentifier, NodeReference
24
+ from cognite_toolkit._cdf_tk.client.resource_classes.legacy.canvas import (
19
25
  ContainerReferenceApply,
20
26
  FdmInstanceContainerReferenceApply,
21
27
  IndustrialCanvas,
22
28
  IndustrialCanvasApply,
23
29
  )
24
- from cognite_toolkit._cdf_tk.client.data_classes.charts import Chart, ChartWrite
25
- from cognite_toolkit._cdf_tk.client.data_classes.charts_data import (
26
- ChartCoreTimeseries,
27
- ChartSource,
28
- ChartTimeseries,
30
+ from cognite_toolkit._cdf_tk.client.resource_classes.legacy.charts import Chart, ChartWrite
31
+ from cognite_toolkit._cdf_tk.client.resource_classes.legacy.migration import ResourceViewMappingApply
32
+ from cognite_toolkit._cdf_tk.client.resource_classes.three_d import (
33
+ AssetMappingClassicResponse,
34
+ AssetMappingDMRequest,
35
+ RevisionStatus,
36
+ ThreeDModelResponse,
29
37
  )
30
- from cognite_toolkit._cdf_tk.client.data_classes.migration import ResourceViewMappingApply
31
38
  from cognite_toolkit._cdf_tk.commands._migrate.conversion import DirectRelationCache, asset_centric_to_dm
32
- from cognite_toolkit._cdf_tk.commands._migrate.data_classes import AssetCentricMapping
39
+ from cognite_toolkit._cdf_tk.commands._migrate.data_classes import (
40
+ Model,
41
+ ThreeDMigrationRequest,
42
+ ThreeDRevisionMigrationRequest,
43
+ )
33
44
  from cognite_toolkit._cdf_tk.commands._migrate.default_mappings import create_default_mappings
34
45
  from cognite_toolkit._cdf_tk.commands._migrate.issues import (
35
46
  CanvasMigrationIssue,
36
47
  ChartMigrationIssue,
37
48
  ConversionIssue,
38
- MigrationIssue,
49
+ ThreeDModelMigrationIssue,
39
50
  )
40
- from cognite_toolkit._cdf_tk.commands._migrate.selectors import AssetCentricMigrationSelector
41
51
  from cognite_toolkit._cdf_tk.constants import MISSING_INSTANCE_SPACE
42
52
  from cognite_toolkit._cdf_tk.exceptions import ToolkitMigrationError, ToolkitValueError
43
53
  from cognite_toolkit._cdf_tk.protocols import T_ResourceRequest, T_ResourceResponse
44
54
  from cognite_toolkit._cdf_tk.storageio._base import T_Selector
45
- from cognite_toolkit._cdf_tk.storageio.selectors import CanvasSelector, ChartSelector
55
+ from cognite_toolkit._cdf_tk.storageio.logger import DataLogger, NoOpLogger
56
+ from cognite_toolkit._cdf_tk.storageio.selectors import CanvasSelector, ChartSelector, ThreeDSelector
46
57
  from cognite_toolkit._cdf_tk.utils import humanize_collection
47
- from cognite_toolkit._cdf_tk.utils.useful_types import (
48
- T_AssetCentricResourceExtended,
49
- )
58
+ from cognite_toolkit._cdf_tk.utils.useful_types2 import T_AssetCentricResourceExtended
59
+
60
+ from .data_classes import AssetCentricMapping
61
+ from .selectors import AssetCentricMigrationSelector
50
62
 
51
63
 
52
64
  class DataMapper(Generic[T_Selector, T_ResourceResponse, T_ResourceRequest], ABC):
65
+ def __init__(self, client: ToolkitClient) -> None:
66
+ self.client = client
67
+ self.logger: DataLogger = NoOpLogger()
68
+
53
69
  def prepare(self, source_selector: T_Selector) -> None:
54
70
  """Prepare the data mapper with the given source selector.
55
71
 
@@ -61,14 +77,14 @@ class DataMapper(Generic[T_Selector, T_ResourceResponse, T_ResourceRequest], ABC
61
77
  pass
62
78
 
63
79
  @abstractmethod
64
- def map(self, source: Sequence[T_ResourceResponse]) -> Sequence[tuple[T_ResourceRequest | None, MigrationIssue]]:
80
+ def map(self, source: Sequence[T_ResourceResponse]) -> Sequence[T_ResourceRequest | None]:
65
81
  """Map a chunk of source data to the target format.
66
82
 
67
83
  Args:
68
84
  source: The source data chunk to be mapped.
69
85
 
70
86
  Returns:
71
- A tuple containing the mapped data and a list of any issues encountered during mapping.
87
+ A sequence of mapped target data.
72
88
 
73
89
  """
74
90
  raise NotImplementedError("Subclasses must implement this method.")
@@ -78,7 +94,7 @@ class AssetCentricMapper(
78
94
  DataMapper[AssetCentricMigrationSelector, AssetCentricMapping[T_AssetCentricResourceExtended], InstanceApply]
79
95
  ):
80
96
  def __init__(self, client: ToolkitClient) -> None:
81
- self.client = client
97
+ super().__init__(client)
82
98
  self._ingestion_view_by_id: dict[ViewId, View] = {}
83
99
  self._view_mapping_by_id: dict[str, ResourceViewMappingApply] = {}
84
100
  self._direct_relation_cache = DirectRelationCache(client)
@@ -106,14 +122,37 @@ class AssetCentricMapper(
106
122
 
107
123
  def map(
108
124
  self, source: Sequence[AssetCentricMapping[T_AssetCentricResourceExtended]]
109
- ) -> Sequence[tuple[InstanceApply | None, ConversionIssue]]:
125
+ ) -> Sequence[InstanceApply | None]:
110
126
  """Map a chunk of asset-centric data to InstanceApplyList format."""
111
127
  # We update the direct relation cache in bulk for all resources in the chunk.
112
128
  self._direct_relation_cache.update(item.resource for item in source)
113
- output: list[tuple[InstanceApply | None, ConversionIssue]] = []
129
+ output: list[InstanceApply | None] = []
130
+ issues: list[ConversionIssue] = []
114
131
  for item in source:
115
132
  instance, conversion_issue = self._map_single_item(item)
116
- output.append((instance, conversion_issue))
133
+ identifier = str(item.mapping.as_asset_centric_id())
134
+
135
+ if conversion_issue.missing_instance_space:
136
+ self.logger.tracker.add_issue(identifier, "Missing instance space")
137
+ if conversion_issue.failed_conversions:
138
+ self.logger.tracker.add_issue(identifier, "Failed conversions")
139
+ if conversion_issue.invalid_instance_property_types:
140
+ self.logger.tracker.add_issue(identifier, "Invalid instance property types")
141
+ if conversion_issue.missing_asset_centric_properties:
142
+ self.logger.tracker.add_issue(identifier, "Missing asset-centric properties")
143
+ if conversion_issue.missing_instance_properties:
144
+ self.logger.tracker.add_issue(identifier, "Missing instance properties")
145
+ if conversion_issue.ignored_asset_centric_properties:
146
+ self.logger.tracker.add_issue(identifier, "Ignored asset-centric properties")
147
+
148
+ if conversion_issue.has_issues:
149
+ issues.append(conversion_issue)
150
+
151
+ if instance is None:
152
+ self.logger.tracker.finalize_item(identifier, "failure")
153
+ output.append(instance)
154
+ if issues:
155
+ self.logger.log(issues)
117
156
  return output
118
157
 
119
158
  def _map_single_item(
@@ -134,6 +173,7 @@ class AssetCentricMapper(
134
173
  view_source=view_source,
135
174
  view_properties=view_properties,
136
175
  direct_relation_cache=self._direct_relation_cache,
176
+ preferred_consumer_view=mapping.preferred_consumer_view,
137
177
  )
138
178
  if mapping.instance_id.space == MISSING_INSTANCE_SPACE:
139
179
  conversion_issue.missing_instance_space = f"Missing instance space for dataset ID {mapping.data_set_id!r}"
@@ -141,15 +181,29 @@ class AssetCentricMapper(
141
181
 
142
182
 
143
183
  class ChartMapper(DataMapper[ChartSelector, Chart, ChartWrite]):
144
- def __init__(self, client: ToolkitClient) -> None:
145
- self.client = client
146
-
147
- def map(self, source: Sequence[Chart]) -> Sequence[tuple[ChartWrite | None, MigrationIssue]]:
184
+ def map(self, source: Sequence[Chart]) -> Sequence[ChartWrite | None]:
148
185
  self._populate_cache(source)
149
- output: list[tuple[ChartWrite | None, MigrationIssue]] = []
186
+ output: list[ChartWrite | None] = []
187
+ issues: list[ChartMigrationIssue] = []
150
188
  for item in source:
151
189
  mapped_item, issue = self._map_single_item(item)
152
- output.append((mapped_item, issue))
190
+ identifier = item.external_id
191
+
192
+ if issue.missing_timeseries_ids:
193
+ self.logger.tracker.add_issue(identifier, "Missing timeseries IDs")
194
+ if issue.missing_timeseries_external_ids:
195
+ self.logger.tracker.add_issue(identifier, "Missing timeseries external IDs")
196
+ if issue.missing_timeseries_identifier:
197
+ self.logger.tracker.add_issue(identifier, "Missing timeseries identifier")
198
+
199
+ if issue.has_issues:
200
+ issues.append(issue)
201
+
202
+ if mapped_item is None:
203
+ self.logger.tracker.finalize_item(identifier, "failure")
204
+ output.append(mapped_item)
205
+ if issues:
206
+ self.logger.log(issues)
153
207
  return output
154
208
 
155
209
  def _populate_cache(self, source: Sequence[Chart]) -> None:
@@ -171,7 +225,7 @@ class ChartMapper(DataMapper[ChartSelector, Chart, ChartWrite]):
171
225
  self.client.migration.lookup.time_series(external_id=list(timeseries_external_ids))
172
226
 
173
227
  def _map_single_item(self, item: Chart) -> tuple[ChartWrite | None, ChartMigrationIssue]:
174
- issue = ChartMigrationIssue(chart_external_id=item.external_id)
228
+ issue = ChartMigrationIssue(chart_external_id=item.external_id, id=item.external_id)
175
229
  time_series_collection = item.data.time_series_collection or []
176
230
  timeseries_core_collection = self._create_timeseries_core_collection(time_series_collection, issue)
177
231
  if issue.has_issues:
@@ -267,16 +321,30 @@ class CanvasMapper(DataMapper[CanvasSelector, IndustrialCanvas, IndustrialCanvas
267
321
  DEFAULT_TIMESERIES_VIEW = ViewId("cdf_cdm", "CogniteTimeSeries", "v1")
268
322
 
269
323
  def __init__(self, client: ToolkitClient, dry_run: bool, skip_on_missing_ref: bool = False) -> None:
270
- self.client = client
324
+ super().__init__(client)
271
325
  self.dry_run = dry_run
272
326
  self.skip_on_missing_ref = skip_on_missing_ref
273
327
 
274
- def map(self, source: Sequence[IndustrialCanvas]) -> Sequence[tuple[IndustrialCanvasApply | None, MigrationIssue]]:
328
+ def map(self, source: Sequence[IndustrialCanvas]) -> Sequence[IndustrialCanvasApply | None]:
275
329
  self._populate_cache(source)
276
- output: list[tuple[IndustrialCanvasApply | None, MigrationIssue]] = []
330
+ output: list[IndustrialCanvasApply | None] = []
331
+ issues: list[CanvasMigrationIssue] = []
277
332
  for item in source:
278
333
  mapped_item, issue = self._map_single_item(item)
279
- output.append((mapped_item, issue))
334
+ identifier = item.as_id()
335
+
336
+ if issue.missing_reference_ids:
337
+ self.logger.tracker.add_issue(identifier, "Missing reference IDs")
338
+
339
+ if issue.has_issues:
340
+ issues.append(issue)
341
+
342
+ if mapped_item is None:
343
+ self.logger.tracker.finalize_item(identifier, "failure")
344
+
345
+ output.append(mapped_item)
346
+ if issues:
347
+ self.logger.log(issues)
280
348
  return output
281
349
 
282
350
  @property
@@ -327,10 +395,13 @@ class CanvasMapper(DataMapper[CanvasSelector, IndustrialCanvas, IndustrialCanvas
327
395
 
328
396
  def _map_single_item(self, canvas: IndustrialCanvas) -> tuple[IndustrialCanvasApply | None, CanvasMigrationIssue]:
329
397
  update = canvas.as_write()
330
- issue = CanvasMigrationIssue(canvas_external_id=canvas.canvas.external_id, canvas_name=canvas.canvas.name)
398
+ issue = CanvasMigrationIssue(
399
+ canvas_external_id=canvas.canvas.external_id, canvas_name=canvas.canvas.name, id=canvas.canvas.name
400
+ )
331
401
 
332
402
  remaining_container_references: list[ContainerReferenceApply] = []
333
403
  new_fdm_references: list[FdmInstanceContainerReferenceApply] = []
404
+ uuid_generator: dict[str, str] = defaultdict(lambda: str(uuid4()))
334
405
  for ref in update.container_references or []:
335
406
  if ref.container_reference_type not in self.asset_centric_resource_types:
336
407
  remaining_container_references.append(ref)
@@ -340,7 +411,9 @@ class CanvasMapper(DataMapper[CanvasSelector, IndustrialCanvas, IndustrialCanvas
340
411
  issue.missing_reference_ids.append(ref.as_asset_centric_id())
341
412
  else:
342
413
  consumer_view = self._get_consumer_view_id(ref.resource_id, ref.container_reference_type)
343
- fdm_ref = self.migrate_container_reference(ref, canvas.canvas.external_id, node_id, consumer_view)
414
+ fdm_ref = self.migrate_container_reference(
415
+ ref, canvas.canvas.external_id, node_id, consumer_view, uuid_generator
416
+ )
344
417
  new_fdm_references.append(fdm_ref)
345
418
  if issue.missing_reference_ids and self.skip_on_missing_ref:
346
419
  return None, issue
@@ -356,14 +429,22 @@ class CanvasMapper(DataMapper[CanvasSelector, IndustrialCanvas, IndustrialCanvas
356
429
  f"Failed to create backup for canvas '{canvas.canvas.name}': {e!s}. "
357
430
  ) from e
358
431
 
432
+ # There might annotations or other components that reference the old IDs, so we need to update those as well.
433
+ update = update.replace_ids(uuid_generator)
434
+
359
435
  return update, issue
360
436
 
361
437
  @classmethod
362
438
  def migrate_container_reference(
363
- cls, reference: ContainerReferenceApply, canvas_external_id: str, instance_id: NodeId, consumer_view: ViewId
439
+ cls,
440
+ reference: ContainerReferenceApply,
441
+ canvas_external_id: str,
442
+ instance_id: NodeId,
443
+ consumer_view: ViewId,
444
+ uuid_generator: dict[str, str],
364
445
  ) -> FdmInstanceContainerReferenceApply:
365
446
  """Migrate a single container reference by replacing the asset-centric ID with the data model instance ID."""
366
- new_id = str(uuid4())
447
+ new_id = uuid_generator[reference.id_]
367
448
  new_external_id = f"{canvas_external_id}_{new_id}"
368
449
  return FdmInstanceContainerReferenceApply(
369
450
  external_id=new_external_id,
@@ -383,3 +464,148 @@ class CanvasMapper(DataMapper[CanvasSelector, IndustrialCanvas, IndustrialCanvas
383
464
  max_width=reference.max_width,
384
465
  max_height=reference.max_height,
385
466
  )
467
+
468
+
469
+ class ThreeDMapper(DataMapper[ThreeDSelector, ThreeDModelResponse, ThreeDMigrationRequest]):
470
+ def map(self, source: Sequence[ThreeDModelResponse]) -> Sequence[ThreeDMigrationRequest | None]:
471
+ self._populate_cache(source)
472
+ output: list[ThreeDMigrationRequest | None] = []
473
+ issues: list[ThreeDModelMigrationIssue] = []
474
+ for item in source:
475
+ mapped_item, issue = self._map_single_item(item)
476
+ identifier = item.name
477
+
478
+ if issue.error_message:
479
+ for error in issue.error_message:
480
+ self.logger.tracker.add_issue(identifier, error)
481
+
482
+ if issue.has_issues:
483
+ issues.append(issue)
484
+
485
+ if mapped_item is None:
486
+ self.logger.tracker.finalize_item(identifier, "failure")
487
+ output.append(mapped_item)
488
+ if issues:
489
+ self.logger.log(issues)
490
+ return output
491
+
492
+ def _populate_cache(self, source: Sequence[ThreeDModelResponse]) -> None:
493
+ dataset_ids: set[int] = set()
494
+ for model in source:
495
+ if model.data_set_id is not None:
496
+ dataset_ids.add(model.data_set_id)
497
+ self.client.migration.space_source.retrieve(list(dataset_ids))
498
+
499
+ def _map_single_item(
500
+ self, item: ThreeDModelResponse
501
+ ) -> tuple[ThreeDMigrationRequest | None, ThreeDModelMigrationIssue]:
502
+ issue = ThreeDModelMigrationIssue(model_name=item.name, model_id=item.id, id=item.name)
503
+ instance_space: str | None = None
504
+ last_revision_id: int | None = None
505
+ model_type: Literal["CAD", "PointCloud", "Image360"] | None = None
506
+ if item.data_set_id is None:
507
+ issue.error_message.append("3D model is not associated with any dataset.")
508
+ else:
509
+ space_source = self.client.migration.space_source.retrieve(item.data_set_id)
510
+ if space_source is not None:
511
+ instance_space = space_source.instance_space
512
+ if instance_space is None and item.data_set_id is not None:
513
+ issue.error_message.append(f"Missing instance space for dataset ID {item.data_set_id!r}")
514
+ if item.last_revision_info is None:
515
+ issue.error_message.append("3D model has no revisions.")
516
+ else:
517
+ model_type = self._get_type(item.last_revision_info)
518
+ last_revision_id = item.last_revision_info.revision_id
519
+ if last_revision_id is None:
520
+ issue.error_message.append("3D model's last revision has no revision ID.")
521
+
522
+ if model_type is None:
523
+ issue.error_message.append("3D model's last revision has no recognized type.")
524
+
525
+ if instance_space is None or last_revision_id is None or model_type is None or issue.has_issues:
526
+ return None, issue
527
+
528
+ mapped_request = ThreeDMigrationRequest(
529
+ model_id=item.id,
530
+ type=model_type,
531
+ space=instance_space,
532
+ revision=ThreeDRevisionMigrationRequest(
533
+ space=instance_space,
534
+ type=model_type,
535
+ revision_id=last_revision_id,
536
+ model=Model(
537
+ instance_id=InstanceIdentifier(
538
+ space=instance_space,
539
+ external_id=f"cog_3d_model_{item.id!s}",
540
+ )
541
+ ),
542
+ ),
543
+ )
544
+ return mapped_request, issue
545
+
546
+ @staticmethod
547
+ def _get_type(revision: RevisionStatus) -> Literal["CAD", "PointCloud", "Image360"] | None:
548
+ types = revision.types or []
549
+ if any("gltf-directory" in t for t in types):
550
+ return "CAD"
551
+ elif any("ept-pointcloud" in t for t in types):
552
+ return "PointCloud"
553
+ else:
554
+ return None
555
+
556
+
557
+ class ThreeDAssetMapper(DataMapper[ThreeDSelector, AssetMappingClassicResponse, AssetMappingDMRequest]):
558
+ def map(self, source: Sequence[AssetMappingClassicResponse]) -> Sequence[AssetMappingDMRequest | None]:
559
+ output: list[AssetMappingDMRequest | None] = []
560
+ issues: list[ThreeDModelMigrationIssue] = []
561
+ self._populate_cache(source)
562
+ for item in source:
563
+ mapped_item, issue = self._map_single_item(item)
564
+ identifier = f"AssetMapping_{item.model_id!s}_{item.revision_id!s}_{item.asset_id!s}"
565
+
566
+ if issue.error_message:
567
+ for error in issue.error_message:
568
+ self.logger.tracker.add_issue(identifier, error)
569
+
570
+ if issue.has_issues:
571
+ issues.append(issue)
572
+
573
+ if mapped_item is None:
574
+ self.logger.tracker.finalize_item(identifier, "failure")
575
+
576
+ output.append(mapped_item)
577
+ if issues:
578
+ self.logger.log(issues)
579
+ return output
580
+
581
+ def _populate_cache(self, source: Sequence[AssetMappingClassicResponse]) -> None:
582
+ asset_ids: set[int] = set()
583
+ for mapping in source:
584
+ if mapping.asset_id is not None:
585
+ asset_ids.add(mapping.asset_id)
586
+ self.client.migration.lookup.assets(list(asset_ids))
587
+
588
+ def _map_single_item(
589
+ self, item: AssetMappingClassicResponse
590
+ ) -> tuple[AssetMappingDMRequest | None, ThreeDModelMigrationIssue]:
591
+ issue = ThreeDModelMigrationIssue(
592
+ model_name=f"AssetMapping_{item.model_id}", model_id=item.model_id, id=f"AssetMapping_{item.model_id}"
593
+ )
594
+ asset_instance_id = item.asset_instance_id
595
+ if item.asset_id and asset_instance_id is None:
596
+ asset_node_id = self.client.migration.lookup.assets(item.asset_id)
597
+ if asset_node_id is None:
598
+ issue.error_message.append(f"Missing asset instance for asset ID {item.asset_id!r}")
599
+ return None, issue
600
+ asset_instance_id = NodeReference(space=asset_node_id.space, external_id=asset_node_id.external_id)
601
+
602
+ if asset_instance_id is None:
603
+ issue.error_message.append("Neither assetInstanceId nor assetId provided for mapping.")
604
+ return None, issue
605
+ mapped_request = AssetMappingDMRequest(
606
+ model_id=item.model_id,
607
+ revision_id=item.revision_id,
608
+ node_id=item.node_id,
609
+ asset_instance_id=asset_instance_id,
610
+ )
611
+ return mapped_request, issue
@@ -4,6 +4,7 @@ from cognite.client.data_classes.data_modeling.containers import BTreeIndex
4
4
  SPACE = dm.SpaceApply(
5
5
  "cognite_migration", description="Space for the asset-centric to data modeling migration", name="cdf_migration"
6
6
  )
7
+ COGNITE_MIGRATION_SPACE_ID = SPACE.space
7
8
 
8
9
  RESOURCE_VIEW_MAPPING = dm.ContainerApply(
9
10
  space=SPACE.space,
@@ -2,7 +2,7 @@ from functools import lru_cache
2
2
 
3
3
  from cognite.client.data_classes.data_modeling import ViewId
4
4
 
5
- from cognite_toolkit._cdf_tk.client.data_classes.migration import ResourceViewMappingApply
5
+ from cognite_toolkit._cdf_tk.client.resource_classes.legacy.migration import ResourceViewMappingApply
6
6
 
7
7
  ASSET_ID = "cdf_asset_mapping"
8
8
  EVENT_ID = "cdf_event_mapping"