cognite-toolkit 0.7.46__py3-none-any.whl → 0.7.48__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 (77) hide show
  1. cognite_toolkit/_cdf_tk/apps/_migrate_app.py +6 -6
  2. cognite_toolkit/_cdf_tk/client/_toolkit_client.py +6 -4
  3. cognite_toolkit/_cdf_tk/client/api/agents.py +107 -0
  4. cognite_toolkit/_cdf_tk/client/api/annotations.py +129 -0
  5. cognite_toolkit/_cdf_tk/client/api/containers.py +132 -0
  6. cognite_toolkit/_cdf_tk/client/api/data_models.py +137 -0
  7. cognite_toolkit/_cdf_tk/client/api/function_schedules.py +115 -0
  8. cognite_toolkit/_cdf_tk/client/api/functions.py +113 -0
  9. cognite_toolkit/_cdf_tk/client/api/graphql_data_models.py +167 -0
  10. cognite_toolkit/_cdf_tk/client/api/groups.py +121 -0
  11. cognite_toolkit/_cdf_tk/client/api/instances.py +139 -0
  12. cognite_toolkit/_cdf_tk/client/api/location_filters.py +177 -0
  13. cognite_toolkit/_cdf_tk/client/api/raw.py +2 -2
  14. cognite_toolkit/_cdf_tk/client/api/relationships.py +133 -0
  15. cognite_toolkit/_cdf_tk/client/api/robotics.py +19 -0
  16. cognite_toolkit/_cdf_tk/client/api/robotics_capabilities.py +127 -0
  17. cognite_toolkit/_cdf_tk/client/api/robotics_data_postprocessing.py +138 -0
  18. cognite_toolkit/_cdf_tk/client/api/robotics_frames.py +122 -0
  19. cognite_toolkit/_cdf_tk/client/api/robotics_locations.py +127 -0
  20. cognite_toolkit/_cdf_tk/client/api/robotics_maps.py +122 -0
  21. cognite_toolkit/_cdf_tk/client/api/robotics_robots.py +122 -0
  22. cognite_toolkit/_cdf_tk/client/api/search_config.py +101 -0
  23. cognite_toolkit/_cdf_tk/client/api/spaces.py +117 -0
  24. cognite_toolkit/_cdf_tk/client/api/streams.py +63 -55
  25. cognite_toolkit/_cdf_tk/client/api/three_d.py +293 -277
  26. cognite_toolkit/_cdf_tk/client/api/views.py +139 -0
  27. cognite_toolkit/_cdf_tk/client/cdf_client/api.py +42 -7
  28. cognite_toolkit/_cdf_tk/client/cdf_client/responses.py +11 -0
  29. cognite_toolkit/_cdf_tk/client/http_client/_client.py +5 -2
  30. cognite_toolkit/_cdf_tk/client/http_client/_data_classes.py +10 -0
  31. cognite_toolkit/_cdf_tk/client/http_client/_data_classes2.py +4 -3
  32. cognite_toolkit/_cdf_tk/client/request_classes/filters.py +75 -0
  33. cognite_toolkit/_cdf_tk/client/request_classes/graphql.py +28 -0
  34. cognite_toolkit/_cdf_tk/client/resource_classes/agent.py +8 -2
  35. cognite_toolkit/_cdf_tk/client/resource_classes/apm_config.py +128 -0
  36. cognite_toolkit/_cdf_tk/client/resource_classes/cognite_file.py +53 -0
  37. cognite_toolkit/_cdf_tk/client/resource_classes/data_modeling/__init__.py +4 -0
  38. cognite_toolkit/_cdf_tk/client/resource_classes/data_modeling/_instance.py +22 -11
  39. cognite_toolkit/_cdf_tk/client/resource_classes/function_schedule.py +8 -4
  40. cognite_toolkit/_cdf_tk/client/resource_classes/group/group.py +9 -5
  41. cognite_toolkit/_cdf_tk/client/resource_classes/identifiers.py +7 -0
  42. cognite_toolkit/_cdf_tk/client/resource_classes/location_filter.py +9 -2
  43. cognite_toolkit/_cdf_tk/client/resource_classes/relationship.py +9 -3
  44. cognite_toolkit/_cdf_tk/client/resource_classes/resource_view_mapping.py +38 -0
  45. cognite_toolkit/_cdf_tk/client/resource_classes/robotics/_map.py +6 -1
  46. cognite_toolkit/_cdf_tk/client/resource_classes/robotics/_robot.py +10 -5
  47. cognite_toolkit/_cdf_tk/client/resource_classes/streams.py +1 -20
  48. cognite_toolkit/_cdf_tk/client/resource_classes/three_d.py +30 -9
  49. cognite_toolkit/_cdf_tk/client/testing.py +2 -2
  50. cognite_toolkit/_cdf_tk/commands/_migrate/data_mapper.py +5 -5
  51. cognite_toolkit/_cdf_tk/commands/_migrate/migration_io.py +11 -7
  52. cognite_toolkit/_cdf_tk/commands/build_v2/_module_parser.py +138 -0
  53. cognite_toolkit/_cdf_tk/commands/build_v2/_modules_parser.py +163 -0
  54. cognite_toolkit/_cdf_tk/commands/build_v2/build_cmd.py +83 -96
  55. cognite_toolkit/_cdf_tk/commands/build_v2/{build_input.py → build_parameters.py} +8 -22
  56. cognite_toolkit/_cdf_tk/commands/build_v2/data_classes/_modules.py +27 -0
  57. cognite_toolkit/_cdf_tk/commands/build_v2/data_classes/_resource.py +22 -0
  58. cognite_toolkit/_cdf_tk/cruds/__init__.py +11 -5
  59. cognite_toolkit/_cdf_tk/cruds/_resource_cruds/streams.py +14 -30
  60. cognite_toolkit/_cdf_tk/data_classes/__init__.py +3 -0
  61. cognite_toolkit/_cdf_tk/data_classes/_issues.py +36 -0
  62. cognite_toolkit/_cdf_tk/data_classes/_module_directories.py +2 -1
  63. cognite_toolkit/_cdf_tk/storageio/_base.py +2 -0
  64. cognite_toolkit/_cdf_tk/storageio/logger.py +163 -0
  65. cognite_toolkit/_cdf_tk/utils/__init__.py +8 -1
  66. cognite_toolkit/_cdf_tk/utils/interactive_select.py +3 -1
  67. cognite_toolkit/_cdf_tk/utils/modules.py +7 -0
  68. cognite_toolkit/_repo_files/GitHub/.github/workflows/deploy.yaml +1 -1
  69. cognite_toolkit/_repo_files/GitHub/.github/workflows/dry-run.yaml +1 -1
  70. cognite_toolkit/_resources/cdf.toml +1 -1
  71. cognite_toolkit/_version.py +1 -1
  72. {cognite_toolkit-0.7.46.dist-info → cognite_toolkit-0.7.48.dist-info}/METADATA +1 -1
  73. {cognite_toolkit-0.7.46.dist-info → cognite_toolkit-0.7.48.dist-info}/RECORD +76 -46
  74. cognite_toolkit/_cdf_tk/commands/build_v2/build_issues.py +0 -27
  75. /cognite_toolkit/_cdf_tk/client/resource_classes/{search_config_resource.py → search_config.py} +0 -0
  76. {cognite_toolkit-0.7.46.dist-info → cognite_toolkit-0.7.48.dist-info}/WHEEL +0 -0
  77. {cognite_toolkit-0.7.46.dist-info → cognite_toolkit-0.7.48.dist-info}/entry_points.txt +0 -0
@@ -46,6 +46,8 @@ from ._instance import (
46
46
  EdgeRequest,
47
47
  EdgeResponse,
48
48
  InstanceDefinition,
49
+ InstanceRequest,
50
+ InstanceResponse,
49
51
  InstanceResponseDefinition,
50
52
  InstanceSource,
51
53
  NodeRequest,
@@ -120,6 +122,8 @@ __all__ = [
120
122
  "IndexAdapter",
121
123
  "IndexDefinition",
122
124
  "InstanceDefinition",
125
+ "InstanceRequest",
126
+ "InstanceResponse",
123
127
  "InstanceResponseDefinition",
124
128
  "InstanceSource",
125
129
  "Int32Property",
@@ -1,7 +1,7 @@
1
1
  from abc import ABC
2
- from typing import Any, Generic, Literal
2
+ from typing import Annotated, Any, Generic, Literal, TypeAlias
3
3
 
4
- from pydantic import JsonValue, field_serializer, field_validator
4
+ from pydantic import Field, JsonValue, field_serializer, field_validator
5
5
 
6
6
  from cognite_toolkit._cdf_tk.client.resource_classes.base import (
7
7
  BaseModelObject,
@@ -9,8 +9,9 @@ from cognite_toolkit._cdf_tk.client.resource_classes.base import (
9
9
  ResponseResource,
10
10
  T_RequestResource,
11
11
  )
12
+ from cognite_toolkit._cdf_tk.client.resource_classes.instance_api import TypedEdgeIdentifier, TypedNodeIdentifier
12
13
 
13
- from ._references import ContainerReference, EdgeReference, NodeReference, ViewReference
14
+ from ._references import ContainerReference, NodeReference, ViewReference
14
15
 
15
16
 
16
17
  class InstanceDefinition(BaseModelObject, ABC):
@@ -87,8 +88,8 @@ class NodeRequest(InstanceRequestDefinition):
87
88
  instance_type: Literal["node"] = "node"
88
89
  type: NodeReference | None = None
89
90
 
90
- def as_id(self) -> NodeReference:
91
- return NodeReference(space=self.space, external_id=self.external_id)
91
+ def as_id(self) -> TypedNodeIdentifier:
92
+ return TypedNodeIdentifier(space=self.space, external_id=self.external_id)
92
93
 
93
94
 
94
95
  class EdgeRequest(InstanceRequestDefinition):
@@ -99,8 +100,8 @@ class EdgeRequest(InstanceRequestDefinition):
99
100
  start_node: NodeReference
100
101
  end_node: NodeReference
101
102
 
102
- def as_id(self) -> EdgeReference:
103
- return EdgeReference(space=self.space, external_id=self.external_id)
103
+ def as_id(self) -> TypedEdgeIdentifier:
104
+ return TypedEdgeIdentifier(space=self.space, external_id=self.external_id)
104
105
 
105
106
 
106
107
  class NodeResponse(InstanceResponseDefinition[NodeRequest]):
@@ -109,8 +110,8 @@ class NodeResponse(InstanceResponseDefinition[NodeRequest]):
109
110
  instance_type: Literal["node"] = "node"
110
111
  type: NodeReference | None = None
111
112
 
112
- def as_id(self) -> NodeReference:
113
- return NodeReference(space=self.space, external_id=self.external_id)
113
+ def as_id(self) -> TypedNodeIdentifier:
114
+ return TypedNodeIdentifier(space=self.space, external_id=self.external_id)
114
115
 
115
116
  def as_request_resource(self) -> NodeRequest:
116
117
  dumped = self.dump()
@@ -130,8 +131,8 @@ class EdgeResponse(InstanceResponseDefinition[EdgeRequest]):
130
131
  start_node: NodeReference
131
132
  end_node: NodeReference
132
133
 
133
- def as_id(self) -> EdgeReference:
134
- return EdgeReference(space=self.space, external_id=self.external_id)
134
+ def as_id(self) -> TypedEdgeIdentifier:
135
+ return TypedEdgeIdentifier(space=self.space, external_id=self.external_id)
135
136
 
136
137
  def as_request_resource(self) -> EdgeRequest:
137
138
  dumped = self.dump()
@@ -141,3 +142,13 @@ class EdgeResponse(InstanceResponseDefinition[EdgeRequest]):
141
142
  ]
142
143
  dumped["existingVersion"] = dumped.pop("version", None)
143
144
  return EdgeRequest.model_validate(dumped, extra="ignore")
145
+
146
+
147
+ InstanceRequest: TypeAlias = Annotated[
148
+ NodeRequest | EdgeRequest,
149
+ Field(discriminator="instance_type"),
150
+ ]
151
+ InstanceResponse: TypeAlias = Annotated[
152
+ NodeResponse | EdgeResponse,
153
+ Field(discriminator="instance_type"),
154
+ ]
@@ -6,6 +6,7 @@ from cognite_toolkit._cdf_tk.client.resource_classes.base import (
6
6
  RequestResource,
7
7
  ResponseResource,
8
8
  )
9
+ from cognite_toolkit._cdf_tk.client.resource_classes.identifiers import InternalId
9
10
 
10
11
 
11
12
  class FunctionScheduleId(Identifier):
@@ -37,14 +38,17 @@ class FunctionSchedule(BaseModelObject):
37
38
  class FunctionScheduleRequest(FunctionSchedule, RequestResource):
38
39
  """Request resource for creating/updating function schedules."""
39
40
 
41
+ # The 'id' field is not part of the request when creating a new resource,
42
+ # but is needed when deleting an existing resource.
43
+ id: int | None = Field(default=None, exclude=True)
40
44
  function_id: int
41
45
  function_external_id: str | None = Field(None, exclude=True)
42
46
  nonce: str
43
47
 
44
- def as_id(self) -> FunctionScheduleId:
45
- if self.function_external_id is None:
46
- raise ValueError("function_external_id must be set to create FunctionScheduleId")
47
- return FunctionScheduleId(function_external_id=self.function_external_id, name=self.name)
48
+ def as_id(self) -> InternalId:
49
+ if self.id is None:
50
+ raise ValueError("Cannot convert FunctionScheduleRequest to InternalId when id is None")
51
+ return InternalId(id=self.id)
48
52
 
49
53
 
50
54
  class FunctionScheduleResponse(FunctionSchedule, ResponseResource[FunctionScheduleRequest]):
@@ -6,12 +6,14 @@ https://api-docs.cognite.com/20230101/tag/Groups/operation/createGroups
6
6
 
7
7
  from typing import Literal
8
8
 
9
+ from pydantic import Field
10
+
9
11
  from cognite_toolkit._cdf_tk.client.resource_classes.base import (
10
12
  BaseModelObject,
11
13
  RequestResource,
12
14
  ResponseResource,
13
15
  )
14
- from cognite_toolkit._cdf_tk.client.resource_classes.identifiers import NameId
16
+ from cognite_toolkit._cdf_tk.client.resource_classes.identifiers import InternalId
15
17
 
16
18
  from .capability import GroupCapability
17
19
 
@@ -38,14 +40,16 @@ class Group(BaseModelObject):
38
40
  source_id: str | None = None
39
41
  members: list[str] | Literal["allUserAccounts"] | None = None
40
42
 
41
- def as_id(self) -> NameId:
42
- return NameId(name=self.name)
43
-
44
43
 
45
44
  class GroupRequest(Group, RequestResource):
46
45
  """Group request resource for creating/updating groups."""
47
46
 
48
- ...
47
+ id: int | None = Field(default=None, exclude=True)
48
+
49
+ def as_id(self) -> InternalId:
50
+ if self.id is None:
51
+ raise ValueError("Cannot convert GroupRequest to InternalId when id is None")
52
+ return InternalId(id=self.id)
49
53
 
50
54
 
51
55
  class GroupResponse(Group, ResponseResource[GroupRequest]):
@@ -50,3 +50,10 @@ class WorkflowVersionId(Identifier):
50
50
 
51
51
  def __str__(self) -> str:
52
52
  return f"workflowExternalId='{self.workflow_external_id}', version='{self.version}'"
53
+
54
+
55
+ class DataSetId(Identifier):
56
+ data_set_id: int
57
+
58
+ def __str__(self) -> str:
59
+ return f"dataSetId={self.data_set_id}"
@@ -1,5 +1,7 @@
1
1
  from typing import Literal
2
2
 
3
+ from pydantic import Field
4
+
3
5
  from cognite_toolkit._cdf_tk.client.resource_classes.base import BaseModelObject, RequestResource, ResponseResource
4
6
 
5
7
  from .data_modeling import DataModelReference
@@ -61,8 +63,13 @@ class LocationFilter(BaseModelObject):
61
63
  class LocationFilterRequest(LocationFilter, RequestResource):
62
64
  """Request resource for creating/updating location filters."""
63
65
 
64
- def as_id(self) -> ExternalId:
65
- return ExternalId(external_id=self.external_id)
66
+ # This is not part of the request payload, but we need it to identify existing resources for updates.
67
+ id: int | None = Field(default=None, exclude=True)
68
+
69
+ def as_id(self) -> InternalId:
70
+ if self.id is None:
71
+ raise ValueError("Cannot get ID for LocationFilterRequest without 'id' set.")
72
+ return InternalId(id=self.id)
66
73
 
67
74
 
68
75
  class LocationFilterResponse(LocationFilter, ResponseResource[LocationFilterRequest]):
@@ -1,6 +1,10 @@
1
- from typing import Literal
1
+ from typing import ClassVar, Literal
2
2
 
3
- from cognite_toolkit._cdf_tk.client.resource_classes.base import BaseModelObject, RequestResource, ResponseResource
3
+ from cognite_toolkit._cdf_tk.client.resource_classes.base import (
4
+ BaseModelObject,
5
+ RequestUpdateable,
6
+ ResponseResource,
7
+ )
4
8
 
5
9
  from .identifiers import ExternalId
6
10
 
@@ -26,9 +30,11 @@ class Relationship(BaseModelObject):
26
30
  labels: list[LabelRef] | None = None
27
31
 
28
32
 
29
- class RelationshipRequest(Relationship, RequestResource):
33
+ class RelationshipRequest(Relationship, RequestUpdateable):
30
34
  """Request resource for creating/updating relationships."""
31
35
 
36
+ container_fields: ClassVar[frozenset[str]] = frozenset({"labels"})
37
+
32
38
  def as_id(self) -> ExternalId:
33
39
  return ExternalId(external_id=self.external_id)
34
40
 
@@ -0,0 +1,38 @@
1
+ from typing import ClassVar, Literal
2
+
3
+ from cognite_toolkit._cdf_tk.client.resource_classes.base import (
4
+ BaseModelObject,
5
+ RequestResource,
6
+ ResponseResource,
7
+ )
8
+
9
+ from .data_modeling import ViewReference
10
+ from .identifiers import ExternalId
11
+
12
+
13
+ class ResourceViewMapping(BaseModelObject):
14
+ space: ClassVar[str] = "cognite_migration"
15
+ view_ref: ClassVar[ViewReference] = ViewReference(
16
+ space="cognite_migration", external_id="ResourceViewMapping", version="v1"
17
+ )
18
+ instance_type: Literal["node"] = "node"
19
+ external_id: str
20
+ resource_type: str
21
+ view_id: ViewReference
22
+ property_mapping: dict[str, str]
23
+
24
+ def as_id(self) -> ExternalId:
25
+ return ExternalId(external_id=self.external_id)
26
+
27
+
28
+ class ResourceViewMappingRequest(ResourceViewMapping, RequestResource):
29
+ existing_version: int | None = None
30
+
31
+
32
+ class ResourceViewMappingResponse(ResourceViewMapping, ResponseResource[ResourceViewMappingRequest]):
33
+ version: int
34
+ created_time: int
35
+ last_updated_time: int
36
+
37
+ def as_request_resource(self) -> ResourceViewMappingRequest:
38
+ return ResourceViewMappingRequest.model_validate(self.dump(), extra="ignore")
@@ -1,4 +1,4 @@
1
- from typing import ClassVar
1
+ from typing import ClassVar, Literal
2
2
 
3
3
  from pydantic import JsonValue
4
4
 
@@ -49,6 +49,11 @@ class RobotMapRequest(RobotMap, RequestUpdateable):
49
49
  {"description", "data", "frame_external_id", "location_external_id", "scale"}
50
50
  )
51
51
 
52
+ def as_update(self, mode: Literal["patch", "replace"]) -> dict[str, JsonValue]:
53
+ update = super().as_update(mode)
54
+ update["update"].pop("mapType", None)
55
+ return update
56
+
52
57
 
53
58
  class RobotMapResponse(RobotMap, ResponseResource[RobotMapRequest]):
54
59
  """Response resource for a RobotMap."""
@@ -1,11 +1,11 @@
1
- from typing import ClassVar
1
+ from typing import Any, ClassVar, Literal
2
2
 
3
3
  from cognite_toolkit._cdf_tk.client.resource_classes.base import (
4
4
  BaseModelObject,
5
5
  RequestUpdateable,
6
6
  ResponseResource,
7
7
  )
8
- from cognite_toolkit._cdf_tk.client.resource_classes.identifiers import NameId
8
+ from cognite_toolkit._cdf_tk.client.resource_classes.identifiers import DataSetId
9
9
 
10
10
  from ._common import RobotType
11
11
 
@@ -32,15 +32,20 @@ class Robot(BaseModelObject):
32
32
  metadata: dict[str, str] | None = None
33
33
  location_external_id: str | None = None
34
34
 
35
- def as_id(self) -> NameId:
36
- return NameId(name=self.name)
35
+ def as_id(self) -> DataSetId:
36
+ return DataSetId(data_set_id=self.data_set_id)
37
37
 
38
38
 
39
39
  class RobotRequest(Robot, RequestUpdateable):
40
40
  """Request resource for creating or updating a Robot."""
41
41
 
42
42
  container_fields: ClassVar[frozenset[str]] = frozenset({"metadata"})
43
- non_nullable_fields: ClassVar[frozenset[str]] = frozenset({"location_external_id"})
43
+ non_nullable_fields: ClassVar[frozenset[str]] = frozenset({"location_external_id", "description"})
44
+
45
+ def as_update(self, mode: Literal["patch", "replace"]) -> dict[str, Any]:
46
+ update = super().as_update(mode)
47
+ update["update"].pop("capabilities", None)
48
+ return update
44
49
 
45
50
 
46
51
  class RobotResponse(Robot, ResponseResource[RobotRequest]):
@@ -1,12 +1,8 @@
1
1
  from typing import Literal
2
2
 
3
3
  from cognite_toolkit._cdf_tk.constants import StreamTemplateName
4
- from cognite_toolkit._cdf_tk.protocols import (
5
- ResourceRequestListProtocol,
6
- ResourceResponseListProtocol,
7
- )
8
4
 
9
- from .base import BaseModelObject, BaseResourceList, RequestResource, ResponseResource
5
+ from .base import BaseModelObject, RequestResource, ResponseResource
10
6
  from .identifiers import ExternalId
11
7
 
12
8
 
@@ -23,12 +19,6 @@ class StreamRequest(Stream, RequestResource):
23
19
  return ExternalId(external_id=self.external_id)
24
20
 
25
21
 
26
- class StreamRequestList(BaseResourceList[StreamRequest], ResourceRequestListProtocol):
27
- """List of Stream request resources."""
28
-
29
- _RESOURCE = StreamRequest
30
-
31
-
32
22
  class LifecycleObject(BaseModelObject):
33
23
  """Lifecycle object."""
34
24
 
@@ -81,12 +71,3 @@ class StreamResponse(Stream, ResponseResource[StreamRequest]):
81
71
  "settings": {"template": {"name": self.created_from_template}},
82
72
  }
83
73
  )
84
-
85
-
86
- class StreamResponseList(BaseResourceList[StreamResponse], ResourceResponseListProtocol):
87
- """List of Stream response resources."""
88
-
89
- _RESOURCE = StreamResponse
90
-
91
- def as_write(self) -> StreamRequestList:
92
- return StreamRequestList([item.as_write() for item in self.data])
@@ -1,10 +1,10 @@
1
1
  import sys
2
- from typing import Literal
2
+ from typing import ClassVar, Literal
3
3
 
4
4
  from pydantic import Field
5
5
 
6
- from .base import BaseModelObject, Identifier, RequestResource, ResponseResource
7
- from .identifiers import NameId
6
+ from .base import BaseModelObject, Identifier, RequestResource, RequestUpdateable, ResponseResource
7
+ from .identifiers import InternalId
8
8
  from .instance_api import NodeReference
9
9
 
10
10
  if sys.version_info >= (3, 11):
@@ -23,12 +23,18 @@ class RevisionStatus(BaseModelObject):
23
23
 
24
24
  class ThreeDModelRequest(RequestResource):
25
25
  name: str
26
+ # This field is part of the path request and not the body schema.
27
+ # but is needed for identifier conversion.
28
+ id: int | None = Field(None, exclude=True)
26
29
 
27
- def as_id(self) -> NameId:
28
- return NameId(name=self.name)
30
+ def as_id(self) -> InternalId:
31
+ if self.id is None:
32
+ raise ValueError("Cannot convert to InternalId when id is None.")
33
+ return InternalId(id=self.id)
29
34
 
30
35
 
31
- class ThreeDModelClassicRequest(ThreeDModelRequest):
36
+ class ThreeDModelClassicRequest(ThreeDModelRequest, RequestUpdateable):
37
+ container_fields: ClassVar[frozenset[str]] = frozenset({"metadata"})
32
38
  data_set_id: int | None = None
33
39
  metadata: dict[str, str] | None = None
34
40
 
@@ -91,17 +97,32 @@ class AssetMappingClassicRequest(RequestResource, Identifier):
91
97
  return f"{self.model_id}_{self.revision_id}_{self.node_id}_{asset_part}"
92
98
 
93
99
 
94
- class AssetMappingResponse(ResponseResource[AssetMappingClassicRequest]):
100
+ class AssetMappingClassicResponse(ResponseResource[AssetMappingClassicRequest]):
95
101
  node_id: int
96
102
  asset_id: int | None = None
97
103
  asset_instance_id: NodeReference | None = None
98
104
  tree_index: int | None = None
99
105
  subtree_size: int | None = None
100
106
  # These fields are part of the path request and response, but they are included here for convenience.
101
- model_id: int = Field(exclude=True)
102
- revision_id: int = Field(exclude=True)
107
+ model_id: int = Field(-1, exclude=True)
108
+ revision_id: int = Field(-1, exclude=True)
103
109
 
104
110
  def as_request_resource(self) -> AssetMappingClassicRequest:
105
111
  return AssetMappingClassicRequest.model_validate(
106
112
  {**self.dump(), "modelId": self.model_id, "revisionId": self.revision_id}
107
113
  )
114
+
115
+
116
+ class AssetMappingDMResponse(ResponseResource[AssetMappingDMRequest]):
117
+ node_id: int
118
+ asset_instance_id: NodeReference
119
+ tree_index: int | None = None
120
+ subtree_size: int | None = None
121
+ # These fields are part of the path request and response, but they are included here for convenience.
122
+ model_id: int = Field(-1, exclude=True)
123
+ revision_id: int = Field(-1, exclude=True)
124
+
125
+ def as_request_resource(self) -> AssetMappingDMRequest:
126
+ return AssetMappingDMRequest.model_validate(
127
+ {**self.dump(), "modelId": self.model_id, "revisionId": self.revision_id}
128
+ )
@@ -65,7 +65,7 @@ from .api.search import SearchAPI
65
65
  from .api.security_categories import SecurityCategoriesAPI
66
66
  from .api.sequences import SequencesAPI
67
67
  from .api.streams import StreamsAPI
68
- from .api.three_d import ThreeDAPI, ThreeDModelAPI
68
+ from .api.three_d import ThreeDAPI, ThreeDClassicModelsAPI
69
69
  from .api.timeseries import TimeSeriesAPI
70
70
  from .api.token import TokenAPI
71
71
  from .api.transformations import TransformationsAPI
@@ -151,7 +151,7 @@ class ToolkitClientMock(CogniteClientMock):
151
151
 
152
152
  self.tool = MagicMock(spec=ToolAPI)
153
153
  self.tool.three_d = MagicMock(spec=ThreeDAPI)
154
- self.tool.three_d.models = MagicMock(spec_set=ThreeDModelAPI)
154
+ self.tool.three_d.models_classic = MagicMock(spec_set=ThreeDClassicModelsAPI)
155
155
  self.tool.assets = MagicMock(spec_set=AssetsAPI)
156
156
  self.tool.timeseries = MagicMock(spec_set=TimeSeriesAPI)
157
157
  self.tool.filemetadata = MagicMock(spec_set=FileMetadataAPI)
@@ -30,8 +30,8 @@ from cognite_toolkit._cdf_tk.client.resource_classes.legacy.canvas import (
30
30
  from cognite_toolkit._cdf_tk.client.resource_classes.legacy.charts import Chart, ChartWrite
31
31
  from cognite_toolkit._cdf_tk.client.resource_classes.legacy.migration import ResourceViewMappingApply
32
32
  from cognite_toolkit._cdf_tk.client.resource_classes.three_d import (
33
+ AssetMappingClassicResponse,
33
34
  AssetMappingDMRequest,
34
- AssetMappingResponse,
35
35
  RevisionStatus,
36
36
  ThreeDModelResponse,
37
37
  )
@@ -477,12 +477,12 @@ class ThreeDMapper(DataMapper[ThreeDSelector, ThreeDModelResponse, ThreeDMigrati
477
477
  return None
478
478
 
479
479
 
480
- class ThreeDAssetMapper(DataMapper[ThreeDSelector, AssetMappingResponse, AssetMappingDMRequest]):
480
+ class ThreeDAssetMapper(DataMapper[ThreeDSelector, AssetMappingClassicResponse, AssetMappingDMRequest]):
481
481
  def __init__(self, client: ToolkitClient) -> None:
482
482
  self.client = client
483
483
 
484
484
  def map(
485
- self, source: Sequence[AssetMappingResponse]
485
+ self, source: Sequence[AssetMappingClassicResponse]
486
486
  ) -> Sequence[tuple[AssetMappingDMRequest | None, MigrationIssue]]:
487
487
  output: list[tuple[AssetMappingDMRequest | None, MigrationIssue]] = []
488
488
  self._populate_cache(source)
@@ -491,7 +491,7 @@ class ThreeDAssetMapper(DataMapper[ThreeDSelector, AssetMappingResponse, AssetMa
491
491
  output.append((mapped_item, issue))
492
492
  return output
493
493
 
494
- def _populate_cache(self, source: Sequence[AssetMappingResponse]) -> None:
494
+ def _populate_cache(self, source: Sequence[AssetMappingClassicResponse]) -> None:
495
495
  asset_ids: set[int] = set()
496
496
  for mapping in source:
497
497
  if mapping.asset_id is not None:
@@ -499,7 +499,7 @@ class ThreeDAssetMapper(DataMapper[ThreeDSelector, AssetMappingResponse, AssetMa
499
499
  self.client.migration.lookup.assets(list(asset_ids))
500
500
 
501
501
  def _map_single_item(
502
- self, item: AssetMappingResponse
502
+ self, item: AssetMappingClassicResponse
503
503
  ) -> tuple[AssetMappingDMRequest | None, ThreeDModelMigrationIssue]:
504
504
  issue = ThreeDModelMigrationIssue(model_name=f"AssetMapping_{item.model_id}", model_id=item.model_id)
505
505
  asset_instance_id = item.asset_instance_id
@@ -16,8 +16,8 @@ from cognite_toolkit._cdf_tk.client.http_client import (
16
16
  )
17
17
  from cognite_toolkit._cdf_tk.client.resource_classes.legacy.pending_instances_ids import PendingInstanceId
18
18
  from cognite_toolkit._cdf_tk.client.resource_classes.three_d import (
19
+ AssetMappingClassicResponse,
19
20
  AssetMappingDMRequest,
20
- AssetMappingResponse,
21
21
  ThreeDModelResponse,
22
22
  )
23
23
  from cognite_toolkit._cdf_tk.commands._migrate.data_classes import ThreeDMigrationRequest
@@ -415,7 +415,7 @@ class ThreeDMigrationIO(UploadableStorageIO[ThreeDSelector, ThreeDModelResponse,
415
415
  total = 0
416
416
  while True:
417
417
  request_limit = min(self.DOWNLOAD_LIMIT, limit - total) if limit is not None else self.DOWNLOAD_LIMIT
418
- response = self.client.tool.three_d.models.paginate(
418
+ response = self.client.tool.three_d.models_classic.paginate(
419
419
  published=published, include_revision_info=True, limit=request_limit, cursor=cursor
420
420
  )
421
421
  items = [item for item in response.items if self._is_selected(item, included_models)]
@@ -477,7 +477,9 @@ class ThreeDMigrationIO(UploadableStorageIO[ThreeDSelector, ThreeDModelResponse,
477
477
  return results
478
478
 
479
479
 
480
- class ThreeDAssetMappingMigrationIO(UploadableStorageIO[ThreeDSelector, AssetMappingResponse, AssetMappingDMRequest]):
480
+ class ThreeDAssetMappingMigrationIO(
481
+ UploadableStorageIO[ThreeDSelector, AssetMappingClassicResponse, AssetMappingDMRequest]
482
+ ):
481
483
  KIND = "3DMigrationAssetMapping"
482
484
  SUPPORTED_DOWNLOAD_FORMATS = frozenset({".ndjson"})
483
485
  SUPPORTED_COMPRESSIONS = frozenset({".gz"})
@@ -493,10 +495,12 @@ class ThreeDAssetMappingMigrationIO(UploadableStorageIO[ThreeDSelector, AssetMap
493
495
  # We can only migrate asset mappings for 3D models that are already migrated to data modeling.
494
496
  self._3D_io = ThreeDMigrationIO(client, data_model_type="data modeling")
495
497
 
496
- def as_id(self, item: AssetMappingResponse) -> str:
498
+ def as_id(self, item: AssetMappingClassicResponse) -> str:
497
499
  return f"AssetMapping_{item.model_id!s}_{item.revision_id!s}_{item.asset_id!s}"
498
500
 
499
- def stream_data(self, selector: ThreeDSelector, limit: int | None = None) -> Iterable[Page[AssetMappingResponse]]:
501
+ def stream_data(
502
+ self, selector: ThreeDSelector, limit: int | None = None
503
+ ) -> Iterable[Page[AssetMappingClassicResponse]]:
500
504
  total = 0
501
505
  for three_d_page in self._3D_io.stream_data(selector, None):
502
506
  for model in three_d_page.items:
@@ -510,7 +514,7 @@ class ThreeDAssetMappingMigrationIO(UploadableStorageIO[ThreeDSelector, AssetMap
510
514
  )
511
515
  if limit is not None and total >= limit:
512
516
  return
513
- response = self.client.tool.three_d.asset_mappings.paginate(
517
+ response = self.client.tool.three_d.asset_mappings_classic.paginate(
514
518
  model_id=model.id,
515
519
  revision_id=model.last_revision_info.revision_id,
516
520
  cursor=cursor,
@@ -562,6 +566,6 @@ class ThreeDAssetMappingMigrationIO(UploadableStorageIO[ThreeDSelector, AssetMap
562
566
  raise NotImplementedError("Deserializing 3D Asset Mappings from JSON is not supported.")
563
567
 
564
568
  def data_to_json_chunk(
565
- self, data_chunk: Sequence[AssetMappingResponse], selector: ThreeDSelector | None = None
569
+ self, data_chunk: Sequence[AssetMappingClassicResponse], selector: ThreeDSelector | None = None
566
570
  ) -> list[dict[str, JsonVal]]:
567
571
  raise NotImplementedError("Serializing 3D Asset Mappings to JSON is not supported.")