cognite-toolkit 0.6.97__py3-none-any.whl → 0.7.30__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 (136) hide show
  1. cognite_toolkit/_cdf.py +16 -17
  2. cognite_toolkit/_cdf_tk/apps/__init__.py +2 -0
  3. cognite_toolkit/_cdf_tk/apps/_core_app.py +13 -5
  4. cognite_toolkit/_cdf_tk/apps/_data_app.py +1 -1
  5. cognite_toolkit/_cdf_tk/apps/_dev_app.py +86 -0
  6. cognite_toolkit/_cdf_tk/apps/_download_app.py +692 -24
  7. cognite_toolkit/_cdf_tk/apps/_dump_app.py +43 -101
  8. cognite_toolkit/_cdf_tk/apps/_landing_app.py +18 -4
  9. cognite_toolkit/_cdf_tk/apps/_migrate_app.py +249 -9
  10. cognite_toolkit/_cdf_tk/apps/_modules_app.py +0 -3
  11. cognite_toolkit/_cdf_tk/apps/_purge.py +15 -43
  12. cognite_toolkit/_cdf_tk/apps/_run.py +11 -0
  13. cognite_toolkit/_cdf_tk/apps/_upload_app.py +45 -6
  14. cognite_toolkit/_cdf_tk/builders/__init__.py +2 -2
  15. cognite_toolkit/_cdf_tk/builders/_base.py +28 -42
  16. cognite_toolkit/_cdf_tk/cdf_toml.py +20 -1
  17. cognite_toolkit/_cdf_tk/client/_toolkit_client.py +23 -3
  18. cognite_toolkit/_cdf_tk/client/api/extended_functions.py +6 -9
  19. cognite_toolkit/_cdf_tk/client/api/infield.py +93 -1
  20. cognite_toolkit/_cdf_tk/client/api/migration.py +175 -1
  21. cognite_toolkit/_cdf_tk/client/api/streams.py +84 -0
  22. cognite_toolkit/_cdf_tk/client/api/three_d.py +50 -0
  23. cognite_toolkit/_cdf_tk/client/data_classes/base.py +25 -1
  24. cognite_toolkit/_cdf_tk/client/data_classes/canvas.py +46 -3
  25. cognite_toolkit/_cdf_tk/client/data_classes/charts.py +3 -3
  26. cognite_toolkit/_cdf_tk/client/data_classes/charts_data.py +95 -213
  27. cognite_toolkit/_cdf_tk/client/data_classes/infield.py +32 -18
  28. cognite_toolkit/_cdf_tk/client/data_classes/migration.py +10 -2
  29. cognite_toolkit/_cdf_tk/client/data_classes/streams.py +90 -0
  30. cognite_toolkit/_cdf_tk/client/data_classes/three_d.py +47 -0
  31. cognite_toolkit/_cdf_tk/client/testing.py +18 -2
  32. cognite_toolkit/_cdf_tk/commands/__init__.py +6 -6
  33. cognite_toolkit/_cdf_tk/commands/_changes.py +3 -42
  34. cognite_toolkit/_cdf_tk/commands/_download.py +21 -11
  35. cognite_toolkit/_cdf_tk/commands/_migrate/__init__.py +0 -2
  36. cognite_toolkit/_cdf_tk/commands/_migrate/command.py +22 -20
  37. cognite_toolkit/_cdf_tk/commands/_migrate/conversion.py +133 -91
  38. cognite_toolkit/_cdf_tk/commands/_migrate/data_classes.py +73 -22
  39. cognite_toolkit/_cdf_tk/commands/_migrate/data_mapper.py +311 -43
  40. cognite_toolkit/_cdf_tk/commands/_migrate/default_mappings.py +5 -5
  41. cognite_toolkit/_cdf_tk/commands/_migrate/issues.py +33 -0
  42. cognite_toolkit/_cdf_tk/commands/_migrate/migration_io.py +157 -8
  43. cognite_toolkit/_cdf_tk/commands/_migrate/selectors.py +9 -4
  44. cognite_toolkit/_cdf_tk/commands/_purge.py +27 -28
  45. cognite_toolkit/_cdf_tk/commands/_questionary_style.py +16 -0
  46. cognite_toolkit/_cdf_tk/commands/_upload.py +109 -86
  47. cognite_toolkit/_cdf_tk/commands/about.py +221 -0
  48. cognite_toolkit/_cdf_tk/commands/auth.py +19 -12
  49. cognite_toolkit/_cdf_tk/commands/build_cmd.py +15 -61
  50. cognite_toolkit/_cdf_tk/commands/clean.py +63 -16
  51. cognite_toolkit/_cdf_tk/commands/deploy.py +20 -17
  52. cognite_toolkit/_cdf_tk/commands/dump_resource.py +6 -4
  53. cognite_toolkit/_cdf_tk/commands/init.py +225 -3
  54. cognite_toolkit/_cdf_tk/commands/modules.py +20 -44
  55. cognite_toolkit/_cdf_tk/commands/pull.py +6 -19
  56. cognite_toolkit/_cdf_tk/commands/resources.py +179 -0
  57. cognite_toolkit/_cdf_tk/constants.py +20 -1
  58. cognite_toolkit/_cdf_tk/cruds/__init__.py +19 -5
  59. cognite_toolkit/_cdf_tk/cruds/_base_cruds.py +14 -70
  60. cognite_toolkit/_cdf_tk/cruds/_data_cruds.py +8 -17
  61. cognite_toolkit/_cdf_tk/cruds/_resource_cruds/__init__.py +4 -1
  62. cognite_toolkit/_cdf_tk/cruds/_resource_cruds/agent.py +11 -9
  63. cognite_toolkit/_cdf_tk/cruds/_resource_cruds/auth.py +4 -14
  64. cognite_toolkit/_cdf_tk/cruds/_resource_cruds/classic.py +44 -43
  65. cognite_toolkit/_cdf_tk/cruds/_resource_cruds/configuration.py +4 -11
  66. cognite_toolkit/_cdf_tk/cruds/_resource_cruds/data_organization.py +4 -13
  67. cognite_toolkit/_cdf_tk/cruds/_resource_cruds/datamodel.py +205 -66
  68. cognite_toolkit/_cdf_tk/cruds/_resource_cruds/extraction_pipeline.py +5 -17
  69. cognite_toolkit/_cdf_tk/cruds/_resource_cruds/fieldops.py +116 -27
  70. cognite_toolkit/_cdf_tk/cruds/_resource_cruds/file.py +6 -27
  71. cognite_toolkit/_cdf_tk/cruds/_resource_cruds/function.py +9 -28
  72. cognite_toolkit/_cdf_tk/cruds/_resource_cruds/hosted_extractors.py +12 -30
  73. cognite_toolkit/_cdf_tk/cruds/_resource_cruds/industrial_tool.py +3 -7
  74. cognite_toolkit/_cdf_tk/cruds/_resource_cruds/location.py +3 -15
  75. cognite_toolkit/_cdf_tk/cruds/_resource_cruds/migration.py +4 -12
  76. cognite_toolkit/_cdf_tk/cruds/_resource_cruds/raw.py +4 -10
  77. cognite_toolkit/_cdf_tk/cruds/_resource_cruds/relationship.py +3 -8
  78. cognite_toolkit/_cdf_tk/cruds/_resource_cruds/robotics.py +15 -44
  79. cognite_toolkit/_cdf_tk/cruds/_resource_cruds/streams.py +94 -0
  80. cognite_toolkit/_cdf_tk/cruds/_resource_cruds/three_d_model.py +3 -7
  81. cognite_toolkit/_cdf_tk/cruds/_resource_cruds/timeseries.py +5 -15
  82. cognite_toolkit/_cdf_tk/cruds/_resource_cruds/transformation.py +39 -31
  83. cognite_toolkit/_cdf_tk/cruds/_resource_cruds/workflow.py +20 -40
  84. cognite_toolkit/_cdf_tk/cruds/_worker.py +24 -36
  85. cognite_toolkit/_cdf_tk/feature_flags.py +16 -36
  86. cognite_toolkit/_cdf_tk/plugins.py +2 -1
  87. cognite_toolkit/_cdf_tk/resource_classes/__init__.py +4 -0
  88. cognite_toolkit/_cdf_tk/resource_classes/capabilities.py +12 -0
  89. cognite_toolkit/_cdf_tk/resource_classes/functions.py +3 -1
  90. cognite_toolkit/_cdf_tk/resource_classes/infield_cdm_location_config.py +109 -0
  91. cognite_toolkit/_cdf_tk/resource_classes/migration.py +8 -17
  92. cognite_toolkit/_cdf_tk/resource_classes/streams.py +29 -0
  93. cognite_toolkit/_cdf_tk/storageio/__init__.py +9 -21
  94. cognite_toolkit/_cdf_tk/storageio/_annotations.py +19 -16
  95. cognite_toolkit/_cdf_tk/storageio/_applications.py +338 -26
  96. cognite_toolkit/_cdf_tk/storageio/_asset_centric.py +67 -104
  97. cognite_toolkit/_cdf_tk/storageio/_base.py +61 -29
  98. cognite_toolkit/_cdf_tk/storageio/_datapoints.py +276 -20
  99. cognite_toolkit/_cdf_tk/storageio/_file_content.py +436 -0
  100. cognite_toolkit/_cdf_tk/storageio/_instances.py +34 -2
  101. cognite_toolkit/_cdf_tk/storageio/_raw.py +26 -0
  102. cognite_toolkit/_cdf_tk/storageio/selectors/__init__.py +62 -4
  103. cognite_toolkit/_cdf_tk/storageio/selectors/_base.py +14 -2
  104. cognite_toolkit/_cdf_tk/storageio/selectors/_canvas.py +14 -0
  105. cognite_toolkit/_cdf_tk/storageio/selectors/_charts.py +14 -0
  106. cognite_toolkit/_cdf_tk/storageio/selectors/_datapoints.py +23 -3
  107. cognite_toolkit/_cdf_tk/storageio/selectors/_file_content.py +164 -0
  108. cognite_toolkit/_cdf_tk/tk_warnings/other.py +4 -0
  109. cognite_toolkit/_cdf_tk/tracker.py +2 -2
  110. cognite_toolkit/_cdf_tk/utils/dtype_conversion.py +9 -3
  111. cognite_toolkit/_cdf_tk/utils/fileio/__init__.py +2 -0
  112. cognite_toolkit/_cdf_tk/utils/fileio/_base.py +5 -1
  113. cognite_toolkit/_cdf_tk/utils/fileio/_readers.py +112 -20
  114. cognite_toolkit/_cdf_tk/utils/fileio/_writers.py +15 -15
  115. cognite_toolkit/_cdf_tk/utils/http_client/_client.py +284 -18
  116. cognite_toolkit/_cdf_tk/utils/http_client/_data_classes.py +50 -4
  117. cognite_toolkit/_cdf_tk/utils/http_client/_data_classes2.py +187 -0
  118. cognite_toolkit/_cdf_tk/utils/interactive_select.py +9 -14
  119. cognite_toolkit/_cdf_tk/utils/sql_parser.py +2 -3
  120. cognite_toolkit/_cdf_tk/utils/useful_types.py +6 -2
  121. cognite_toolkit/_cdf_tk/validation.py +79 -1
  122. cognite_toolkit/_repo_files/GitHub/.github/workflows/deploy.yaml +1 -1
  123. cognite_toolkit/_repo_files/GitHub/.github/workflows/dry-run.yaml +1 -1
  124. cognite_toolkit/_resources/cdf.toml +5 -4
  125. cognite_toolkit/_version.py +1 -1
  126. cognite_toolkit/config.dev.yaml +13 -0
  127. {cognite_toolkit-0.6.97.dist-info → cognite_toolkit-0.7.30.dist-info}/METADATA +24 -24
  128. {cognite_toolkit-0.6.97.dist-info → cognite_toolkit-0.7.30.dist-info}/RECORD +153 -143
  129. cognite_toolkit-0.7.30.dist-info/WHEEL +4 -0
  130. {cognite_toolkit-0.6.97.dist-info → cognite_toolkit-0.7.30.dist-info}/entry_points.txt +1 -0
  131. cognite_toolkit/_cdf_tk/commands/_migrate/canvas.py +0 -201
  132. cognite_toolkit/_cdf_tk/commands/dump_data.py +0 -489
  133. cognite_toolkit/_cdf_tk/commands/featureflag.py +0 -27
  134. cognite_toolkit/_cdf_tk/utils/table_writers.py +0 -434
  135. cognite_toolkit-0.6.97.dist-info/WHEEL +0 -4
  136. cognite_toolkit-0.6.97.dist-info/licenses/LICENSE +0 -18
@@ -1,70 +1,30 @@
1
- import sys
2
- from dataclasses import dataclass, field, fields
3
- from functools import lru_cache
4
1
  from typing import Any
5
2
 
6
- from cognite.client import CogniteClient
7
- from cognite.client.data_classes._base import CogniteObject
8
3
  from cognite.client.data_classes.data_modeling import NodeId, ViewId
9
- from cognite.client.utils._auxiliary import to_camel_case
4
+ from pydantic import JsonValue, field_serializer, field_validator
10
5
 
11
- if sys.version_info >= (3, 11):
12
- from typing import Self
13
- else:
14
- from typing_extensions import Self
6
+ from .base import BaseModelObject
15
7
 
16
8
 
17
- @dataclass
18
- class ChartObject(CogniteObject):
19
- # ChartObjects are used in the frontend and the backend does not do any validation of these fields.
20
- # Therefore, to ensure that we do not lose any data, we store unknown fields in a separate dictionary.
21
- # This allows unknown fields to be preserved when loading and dumping ChartObjects
22
- # (serialization and deserialization).
23
- _unknown_fields: dict[str, object] | None = field(default=None, init=False, repr=False)
24
-
25
- @classmethod
26
- def _load(cls, resource: dict[str, Any], cognite_client: CogniteClient | None = None) -> Self:
27
- """Load a ChartObject from a dictionary."""
28
- instance = super()._load(resource, cognite_client=cognite_client)
29
- instance._unknown_fields = {k: v for k, v in resource.items() if k not in cls._known_camel_case_props()}
30
- return instance
31
-
32
- @classmethod
33
- @lru_cache(maxsize=1)
34
- def _known_camel_case_props(cls) -> set[str]:
35
- return {to_camel_case(f.name) for f in fields(cls)}
36
-
37
- def dump(self, camel_case: bool = True) -> dict[str, Any]:
38
- """Dump the ChartObject to a dictionary."""
39
- data = super().dump(camel_case=camel_case)
40
- if self._unknown_fields:
41
- data.update(self._unknown_fields)
42
- return data
43
-
44
-
45
- @dataclass
46
- class UserInfo(ChartObject):
9
+ class UserInfo(BaseModelObject):
47
10
  id: str | None = None
48
11
  email: str | None = None
49
12
  display_name: str | None = None
50
13
 
51
14
 
52
- @dataclass
53
- class ChartSettings(ChartObject):
15
+ class ChartSettings(BaseModelObject):
54
16
  show_y_axis: bool = True
55
17
  show_min_max: bool = True
56
18
  show_gridlines: bool = True
57
19
  merge_units: bool = False
58
20
 
59
21
 
60
- @dataclass
61
- class ThresholdFilter(ChartObject):
22
+ class ThresholdFilter(BaseModelObject):
62
23
  min_unit: str | None = None
63
24
  max_unit: str | None = None
64
25
 
65
26
 
66
- @dataclass
67
- class ChartCall(ChartObject):
27
+ class ChartCall(BaseModelObject):
68
28
  id: str | None = None
69
29
  hash: int | None = None
70
30
  call_id: str | None = None
@@ -72,162 +32,143 @@ class ChartCall(ChartObject):
72
32
  status: str | None = None
73
33
 
74
34
 
75
- @dataclass
76
- class SubSetting(ChartObject):
35
+ class SubSetting(BaseModelObject):
77
36
  auto_align: bool | None = None
78
37
 
79
38
 
80
- @dataclass
81
- class FlowElement(ChartObject):
39
+ class ChartPosition(BaseModelObject):
40
+ x: float | None = None
41
+ y: float | None = None
42
+
43
+
44
+ class FlowElement(BaseModelObject):
82
45
  id: str | None = None
83
46
  type: str | None = None
84
- position: tuple[float | None, float | None] | None = None
85
- data: dict[str, object] | None = None
47
+ position: ChartPosition | None = None
48
+ data: JsonValue | None = None
49
+ source: str | None = None
50
+ target: str | None = None
51
+ source_handle: str | None = None
52
+ target_handle: str | None = None
86
53
 
87
54
 
88
- @dataclass
89
- class Flow(ChartObject):
55
+ class Flow(BaseModelObject):
90
56
  zoom: float | None = None
91
57
  elements: list[FlowElement] | None = None
92
58
  position: tuple[float | None, float | None] | None = None
93
59
 
94
- def dump(self, camel_case: bool = True) -> dict[str, Any]:
95
- data = super().dump(camel_case=camel_case)
96
- if self.elements:
97
- data["elements"] = [el.dump(camel_case=camel_case) for el in self.elements]
98
- return data
99
60
 
100
- @classmethod
101
- def _load(cls, resource: dict[str, Any], cognite_client: CogniteClient | None = None) -> Self:
102
- """Load a Flow object from a dictionary."""
103
- instance = super()._load(resource, cognite_client=cognite_client)
104
- if "elements" in resource:
105
- instance.elements = [FlowElement._load(el, cognite_client=cognite_client) for el in resource["elements"]]
106
- return instance
61
+ class ChartElement(BaseModelObject):
62
+ id: str | None = None
63
+ type: str | None = None
107
64
 
108
65
 
109
- @dataclass
110
- class ChartSource(ChartObject):
111
- type: str | None = None
112
- id: str | None = None
66
+ class ChartSource(ChartElement): ...
113
67
 
114
68
 
115
- @dataclass
116
- class BaseChartElement(ChartObject):
117
- type: str | None = None
118
- id: str | None = None
119
- name: str | None = None
69
+ class ChartCoreTimeseries(ChartElement):
70
+ node_reference: NodeId | None = None
71
+ view_reference: ViewId | None = None
72
+ display_mode: str | None = None
120
73
  color: str | None = None
74
+ created_at: int | None = None
121
75
  enabled: bool | None = None
122
- line_weight: float | None = None
123
- line_style: str | None = None
124
76
  interpolation: str | None = None
125
- unit: str | None = None
77
+ line_style: str | None = None
78
+ line_weight: float | None = None
79
+ name: str | None = None
126
80
  preferred_unit: str | None = None
127
- created_at: int | None = None
128
- range: tuple[float | None, float | None] | None = None
129
- description: str | None = None
81
+ range: list[float | None] | None = None
130
82
 
83
+ @field_serializer("node_reference", when_used="always")
84
+ def serialize_node_reference(self, node_reference: NodeId | None) -> dict[str, Any] | None:
85
+ if node_reference:
86
+ return node_reference.dump(include_instance_type=False)
87
+ return None
131
88
 
132
- @dataclass
133
- class ChartCoreTimeseries(BaseChartElement):
134
- node_reference: NodeId | None = None
135
- view_reference: ViewId | None = None
136
- display_mode: str | None = None
89
+ @field_serializer("view_reference", when_used="always")
90
+ def serialize_view_reference(self, view_reference: ViewId | None) -> dict[str, Any] | None:
91
+ if view_reference:
92
+ return view_reference.dump(include_type=False)
93
+ return None
94
+
95
+ @field_validator("node_reference", mode="before")
96
+ @classmethod
97
+ def validate_node_reference(cls, value: Any) -> NodeId | None:
98
+ if value is None or isinstance(value, NodeId):
99
+ return value
100
+ return NodeId.load(value)
101
+
102
+ @field_validator("view_reference", mode="before")
103
+ @classmethod
104
+ def validate_view_reference(cls, value: Any) -> ViewId | None:
105
+ if value is None or isinstance(value, ViewId):
106
+ return value
107
+ return ViewId.load(value)
137
108
 
138
109
 
139
- @dataclass
140
- class ChartTimeseries(BaseChartElement):
110
+ class ChartTimeseries(ChartElement):
111
+ color: str | None = None
112
+ created_at: int | None = None
113
+ enabled: bool | None = None
114
+ interpolation: str | None = None
115
+ line_style: str | None = None
116
+ line_weight: float | None = None
117
+ name: str | None = None
118
+ preferred_unit: str | None = None
119
+ range: list[float | None] | None = None
120
+ unit: str | None = None
141
121
  ts_id: int | None = None
142
122
  ts_external_id: str | None = None
143
123
  display_mode: str | None = None
144
124
  original_unit: str | None = None
125
+ description: str | None = None
145
126
 
146
127
 
147
- @dataclass
148
- class ChartWorkflow(BaseChartElement):
128
+ class ChartWorkflow(ChartElement):
149
129
  version: str | None = None
130
+ name: str | None = None
131
+ color: str | None = None
132
+ enabled: bool | None = None
133
+ line_weight: float | None = None
134
+ line_style: str | None = None
135
+ interpolation: str | None = None
136
+ unit: str | None = None
137
+ preferred_unit: str | None = None
138
+ range: list[float | None] | None = None
139
+ created_at: int | None = None
150
140
  settings: SubSetting | None = None
151
141
  flow: Flow | None = None
152
142
  calls: list[ChartCall] | None = None
153
143
 
154
- def dump(self, camel_case: bool = True) -> dict[str, Any]:
155
- data = super().dump(camel_case=camel_case)
156
- if self.settings:
157
- data["settings"] = self.settings.dump(camel_case=camel_case)
158
- if self.flow:
159
- data["flow"] = self.flow.dump(camel_case=camel_case)
160
- if self.calls:
161
- data["calls"] = [c.dump(camel_case=camel_case) for c in self.calls]
162
- return data
163
144
 
164
- @classmethod
165
- def _load(cls, resource: dict[str, Any], cognite_client: CogniteClient | None = None) -> Self:
166
- """Load a ChartWorkflow object from a dictionary."""
167
- instance = super()._load(resource, cognite_client=cognite_client)
168
- if "settings" in resource:
169
- instance.settings = SubSetting._load(resource["settings"], cognite_client=cognite_client)
170
- if "flow" in resource:
171
- instance.flow = Flow._load(resource["flow"], cognite_client=cognite_client)
172
- if "calls" in resource:
173
- instance.calls = [ChartCall._load(call, cognite_client=cognite_client) for call in resource["calls"]]
174
- return instance
175
-
176
-
177
- @dataclass
178
- class ChartThreshold(BaseChartElement):
145
+ class ChartThreshold(ChartElement):
179
146
  visible: bool | None = None
147
+ name: str | None = None
180
148
  source_id: str | None = None
181
149
  upper_limit: float | None = None
182
150
  filter: ThresholdFilter | None = None
183
151
  calls: list[ChartCall] | None = None
184
152
 
185
- def dump(self, camel_case: bool = True) -> dict[str, Any]:
186
- data = super().dump(camel_case=camel_case)
187
- if self.filter:
188
- data["filter"] = self.filter.dump(camel_case=camel_case)
189
- if self.calls:
190
- data["calls"] = [c.dump(camel_case=camel_case) for c in self.calls]
191
- return data
192
153
 
193
- @classmethod
194
- def _load(cls, resource: dict[str, Any], cognite_client: CogniteClient | None = None) -> Self:
195
- """Load a ChartThreshold object from a dictionary."""
196
- instance = super()._load(resource, cognite_client=cognite_client)
197
- if "filter" in resource:
198
- instance.filter = ThresholdFilter._load(resource["filter"], cognite_client=cognite_client)
199
- if "calls" in resource:
200
- instance.calls = [ChartCall._load(call, cognite_client=cognite_client) for call in resource["calls"]]
201
- return instance
202
-
203
-
204
- @dataclass
205
- class ChartScheduledCalculation(BaseChartElement):
154
+ class ChartScheduledCalculation(ChartElement):
155
+ color: str | None = None
156
+ created_at: int | None = None
157
+ description: str | None = None
158
+ enabled: bool | None = None
159
+ interpolation: str | None = None
160
+ line_style: str | None = None
161
+ line_weight: float | None = None
162
+ name: str | None = None
163
+ preferred_unit: str | None = None
164
+ range: list[float | None] | None = None
165
+ unit: str | None = None
206
166
  version: str | None = None
207
167
  settings: SubSetting | None = None
208
168
  flow: Flow | None = None
209
169
 
210
- def dump(self, camel_case: bool = True) -> dict[str, Any]:
211
- data = super().dump(camel_case=camel_case)
212
- if self.settings:
213
- data["settings"] = self.settings.dump(camel_case=camel_case)
214
- if self.flow:
215
- data["flow"] = self.flow.dump(camel_case=camel_case)
216
- return data
217
170
 
218
- @classmethod
219
- def _load(cls, resource: dict[str, Any], cognite_client: CogniteClient | None = None) -> Self:
220
- """Load a ChartScheduledCalculation object from a dictionary."""
221
- instance = super()._load(resource, cognite_client=cognite_client)
222
- if "settings" in resource:
223
- instance.settings = SubSetting._load(resource["settings"], cognite_client=cognite_client)
224
- if "flow" in resource:
225
- instance.flow = Flow._load(resource["flow"], cognite_client=cognite_client)
226
- return instance
227
-
228
-
229
- @dataclass
230
- class ChartData(ChartObject):
171
+ class ChartData(BaseModelObject):
231
172
  version: int | None = None
232
173
  name: str | None = None
233
174
  date_from: str | None = None
@@ -241,62 +182,3 @@ class ChartData(ChartObject):
241
182
  threshold_collection: list[ChartThreshold] | None = None
242
183
  scheduled_calculation_collection: list[ChartScheduledCalculation] | None = None
243
184
  settings: ChartSettings | None = None
244
-
245
- def dump(self, camel_case: bool = True) -> dict[str, Any]:
246
- """Dump the ChartData object to a dictionary."""
247
- data = super().dump(camel_case=camel_case)
248
- list_attrs = [
249
- "time_series_collection",
250
- "core_timeseries_collection",
251
- "workflow_collection",
252
- "source_collection",
253
- "threshold_collection",
254
- "scheduled_calculation_collection",
255
- ]
256
- for attr_name in list_attrs:
257
- if collection := getattr(self, attr_name):
258
- key = to_camel_case(attr_name) if camel_case else attr_name
259
- data[key] = [item.dump(camel_case=camel_case) for item in collection]
260
-
261
- single_attrs_map = {
262
- "user_info": "userInfo",
263
- "settings": "settings",
264
- }
265
- for attr_name, camel_key in single_attrs_map.items():
266
- if item := getattr(self, attr_name):
267
- key = camel_key if camel_case else attr_name
268
- data[key] = item.dump(camel_case=camel_case)
269
- return data
270
-
271
- @classmethod
272
- def _load(cls, resource: dict[str, Any], cognite_client: CogniteClient | None = None) -> Self:
273
- """Load a ChartData object from a dictionary."""
274
- instance = super()._load(resource, cognite_client=cognite_client)
275
- collections_map = [
276
- ("timeSeriesCollection", "time_series_collection", ChartTimeseries),
277
- ("coreTimeseriesCollection", "core_timeseries_collection", ChartCoreTimeseries),
278
- ("workflowCollection", "workflow_collection", ChartWorkflow),
279
- ("sourceCollection", "source_collection", ChartSource),
280
- ("thresholdCollection", "threshold_collection", ChartThreshold),
281
- ("scheduledCalculationCollection", "scheduled_calculation_collection", ChartScheduledCalculation),
282
- ]
283
- for resource_key, attr_name, subclass in collections_map:
284
- if resource_key in resource:
285
- setattr(
286
- instance,
287
- attr_name,
288
- [subclass._load(item, cognite_client=cognite_client) for item in resource[resource_key]], # type: ignore[attr-defined]
289
- )
290
- attribute_map = [
291
- ("userInfo", "user_info", UserInfo),
292
- ("settings", "settings", ChartSettings),
293
- ]
294
- for resource_key, attr_name, subclass in attribute_map:
295
- if resource_key in resource:
296
- setattr(
297
- instance,
298
- attr_name,
299
- subclass._load(resource[resource_key], cognite_client=cognite_client), # type: ignore[attr-defined]
300
- )
301
-
302
- return instance
@@ -1,15 +1,16 @@
1
1
  import sys
2
- from collections import UserList
3
2
  from typing import Any, ClassVar, Literal
4
3
 
5
- from cognite.client import CogniteClient
6
4
  from pydantic import JsonValue, field_validator
7
5
  from pydantic_core.core_schema import ValidationInfo
8
6
 
9
- from cognite_toolkit._cdf_tk.protocols import ResourceRequestListProtocol, ResourceResponseListProtocol
7
+ from cognite_toolkit._cdf_tk.protocols import (
8
+ ResourceRequestListProtocol,
9
+ ResourceResponseListProtocol,
10
+ )
10
11
  from cognite_toolkit._cdf_tk.utils.text import sanitize_instance_external_id
11
12
 
12
- from .base import ResponseResource
13
+ from .base import BaseResourceList, ResponseResource
13
14
  from .instance_api import InstanceRequestResource, ViewReference
14
15
 
15
16
  if sys.version_info >= (3, 11):
@@ -18,6 +19,9 @@ else:
18
19
  from typing_extensions import Self
19
20
 
20
21
  INFIELD_LOCATION_CONFIG_VIEW_ID = ViewReference(space="cdf_infield", external_id="InFieldLocationConfig", version="v1")
22
+ INFIELD_CDM_LOCATION_CONFIG_VIEW_ID = ViewReference(
23
+ space="infield_cdm_source_desc_sche_asset_file_ts", external_id="InFieldCDMLocationConfig", version="v1"
24
+ )
21
25
  DATA_EXPLORATION_CONFIG_VIEW_ID = ViewReference(space="cdf_infield", external_id="DataExplorationConfig", version="v1")
22
26
 
23
27
 
@@ -74,29 +78,39 @@ class InfieldLocationConfig(
74
78
 
75
79
 
76
80
  class InfieldLocationConfigList(
77
- UserList[InfieldLocationConfig],
81
+ BaseResourceList[InfieldLocationConfig],
78
82
  ResourceResponseListProtocol,
79
83
  ResourceRequestListProtocol,
80
84
  ):
81
85
  """A list of InfieldLocationConfig objects."""
82
86
 
83
87
  _RESOURCE = InfieldLocationConfig
84
- data: list[InfieldLocationConfig]
85
88
 
86
- def __init__(self, initlist: list[InfieldLocationConfig] | None = None, **_: Any) -> None:
87
- super().__init__(initlist or [])
89
+ def as_write(self) -> Self:
90
+ return self
91
+
88
92
 
89
- def dump(self, camel_case: bool = True) -> list[dict[str, Any]]:
90
- """Serialize the list of InfieldLocationConfig objects to a list of dictionaries."""
91
- return [item.dump(camel_case) for item in self.data]
93
+ class InFieldCDMLocationConfig(ResponseResource["InFieldCDMLocationConfig"], InstanceRequestResource):
94
+ """InField CDM Location Configuration resource class.
92
95
 
93
- @classmethod
94
- def load(
95
- cls, data: list[dict[str, Any]], cognite_client: CogniteClient | None = None
96
- ) -> "InfieldLocationConfigList":
97
- """Deserialize a list of dictionaries to an InfieldLocationConfigList."""
98
- items = [InfieldLocationConfig.model_validate(item) for item in data]
99
- return cls(items)
96
+ This class is used for both the response and request resource for InField CDM Location Configuration nodes.
97
+ """
98
+
99
+ VIEW_ID: ClassVar[ViewReference] = INFIELD_CDM_LOCATION_CONFIG_VIEW_ID
100
+ instance_type: Literal["node"] = "node"
101
+
102
+ name: str | None = None
103
+ description: str | None = None
104
+ feature_toggles: dict[str, JsonValue] | None = None
105
+ access_management: dict[str, JsonValue] | None = None
106
+ data_filters: dict[str, JsonValue] | None = None
107
+ data_storage: dict[str, JsonValue] | None = None
108
+ view_mappings: dict[str, JsonValue] | None = None
109
+ disciplines: list[dict[str, JsonValue]] | None = None
110
+ data_exploration_config: dict[str, JsonValue] | None = None
111
+
112
+ def as_request_resource(self) -> "InFieldCDMLocationConfig":
113
+ return self
100
114
 
101
115
  def as_write(self) -> Self:
102
116
  return self
@@ -16,7 +16,7 @@ from cognite.client.data_classes.data_modeling.instances import (
16
16
 
17
17
  from cognite_toolkit._cdf_tk.constants import COGNITE_MIGRATION_SPACE
18
18
  from cognite_toolkit._cdf_tk.tk_warnings import IgnoredValueWarning
19
- from cognite_toolkit._cdf_tk.utils.useful_types import AssetCentricType
19
+ from cognite_toolkit._cdf_tk.utils.useful_types import AssetCentricType, AssetCentricTypeExtended
20
20
 
21
21
  if sys.version_info >= (3, 11):
22
22
  from typing import Self
@@ -26,7 +26,7 @@ else:
26
26
 
27
27
  @dataclass(frozen=True)
28
28
  class AssetCentricId(CogniteObject):
29
- resource_type: AssetCentricType
29
+ resource_type: AssetCentricTypeExtended
30
30
  id_: int
31
31
 
32
32
  @classmethod
@@ -114,6 +114,14 @@ class InstanceSource(_InstanceSourceProperties, TypedNode):
114
114
  self.preferred_consumer_view_id = preferred_consumer_view_id
115
115
  self.ingestion_view = DirectRelationReference.load(ingestion_view) if ingestion_view else None
116
116
 
117
+ def dump(self, camel_case: bool = True) -> dict[str, Any]:
118
+ output = super().dump(camel_case)
119
+ if self.preferred_consumer_view_id:
120
+ output["properties"]["cognite_migration"]["InstanceSource/v1"]["preferredConsumerViewId"] = (
121
+ self.preferred_consumer_view_id.dump(camel_case=camel_case)
122
+ )
123
+ return output
124
+
117
125
  @classmethod
118
126
  def _load_properties(cls, resource: dict[str, Any]) -> dict[str, Any]:
119
127
  if "preferredConsumerViewId" in resource:
@@ -0,0 +1,90 @@
1
+ from typing import Literal
2
+
3
+ from cognite_toolkit._cdf_tk.constants import StreamTemplateName
4
+ from cognite_toolkit._cdf_tk.protocols import (
5
+ ResourceRequestListProtocol,
6
+ ResourceResponseListProtocol,
7
+ )
8
+
9
+ from .base import BaseModelObject, BaseResourceList, RequestResource, ResponseResource
10
+
11
+
12
+ class StreamRequest(RequestResource):
13
+ """Stream request resource class."""
14
+
15
+ external_id: str
16
+ settings: dict[Literal["template"], dict[Literal["name"], StreamTemplateName]]
17
+
18
+ def as_id(self) -> str:
19
+ return self.external_id
20
+
21
+
22
+ class StreamRequestList(BaseResourceList[StreamRequest], ResourceRequestListProtocol):
23
+ """List of Stream request resources."""
24
+
25
+ _RESOURCE = StreamRequest
26
+
27
+
28
+ class LifecycleObject(BaseModelObject):
29
+ """Lifecycle object."""
30
+
31
+ hot_phase_duration: str | None = None
32
+ data_deleted_after: str | None = None
33
+ retained_after_soft_delete: str
34
+
35
+
36
+ class ResourceUsage(BaseModelObject):
37
+ """Resource quota with provisioned and consumed values."""
38
+
39
+ provisioned: int
40
+ consumed: int | None = None
41
+
42
+
43
+ class LimitsObject(BaseModelObject):
44
+ """Limits object."""
45
+
46
+ max_records_total: ResourceUsage
47
+ max_giga_bytes_total: ResourceUsage
48
+ max_filtering_interval: str | None = None
49
+
50
+
51
+ class StreamSettings(BaseModelObject):
52
+ """Stream settings object."""
53
+
54
+ lifecycle: LifecycleObject
55
+ limits: LimitsObject
56
+
57
+
58
+ class StreamResponse(ResponseResource["StreamRequest"]):
59
+ """Stream response resource class."""
60
+
61
+ external_id: str
62
+ created_time: int
63
+ created_from_template: StreamTemplateName
64
+ type: Literal["Mutable", "Immutable"]
65
+ settings: StreamSettings | None = None
66
+
67
+ def as_request_resource(self) -> StreamRequest:
68
+ return StreamRequest.model_validate(
69
+ {
70
+ "externalId": self.external_id,
71
+ "settings": {"template": {"name": self.created_from_template}},
72
+ }
73
+ )
74
+
75
+ def as_write(self) -> StreamRequest:
76
+ return StreamRequest.model_validate(
77
+ {
78
+ "externalId": self.external_id,
79
+ "settings": {"template": {"name": self.created_from_template}},
80
+ }
81
+ )
82
+
83
+
84
+ class StreamResponseList(BaseResourceList[StreamResponse], ResourceResponseListProtocol):
85
+ """List of Stream response resources."""
86
+
87
+ _RESOURCE = StreamResponse
88
+
89
+ def as_write(self) -> StreamRequestList:
90
+ return StreamRequestList([item.as_write() for item in self.data])
@@ -0,0 +1,47 @@
1
+ from typing import Literal
2
+
3
+ from .base import BaseModelObject, RequestResource, ResponseResource
4
+
5
+
6
+ class NodeReference(BaseModelObject):
7
+ space: str
8
+ external_id: str
9
+
10
+
11
+ class RevisionStatus(BaseModelObject):
12
+ status: Literal["Queued", "Processing", "Done", "Failed"] | None = None
13
+ revision_id: int | None = None
14
+ created_time: int | None = None
15
+ revision_count: int | None = None
16
+ types: list[str] | None = None
17
+
18
+
19
+ class ThreeDModelRequest(RequestResource):
20
+ name: str
21
+
22
+
23
+ class ThreeDModelClassicRequest(ThreeDModelRequest):
24
+ data_set_id: int | None = None
25
+ metadata: dict[str, str] | None = None
26
+
27
+
28
+ class ThreeDModelDMSRequest(ThreeDModelRequest):
29
+ space: str
30
+ type: Literal["CAD", "PointCloud", "Image360"]
31
+ thumbnail_reference: NodeReference | None = None
32
+
33
+
34
+ class ThreeDModelResponse(ResponseResource[ThreeDModelRequest]):
35
+ name: str
36
+ id: int
37
+ created_time: int
38
+ data_set_id: int | None = None
39
+ metadata: dict[str, str] | None = None
40
+ space: str | None = None
41
+ last_revision_info: RevisionStatus | None = None
42
+
43
+ def as_request_resource(self) -> ThreeDModelRequest:
44
+ if self.space is None:
45
+ return ThreeDModelClassicRequest._load(self.dump())
46
+ else:
47
+ return ThreeDModelDMSRequest._load(self.dump())