sapiopycommons 2025.4.25a497__py3-none-any.whl → 2025.4.30a499__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.

Potentially problematic release.


This version of sapiopycommons might be problematic. Click here for more details.

Files changed (26) hide show
  1. sapiopycommons/ai/api/fielddefinitions/proto/fields_pb2.py +43 -0
  2. sapiopycommons/ai/api/fielddefinitions/proto/fields_pb2.pyi +31 -0
  3. sapiopycommons/ai/api/fielddefinitions/proto/fields_pb2_grpc.py +24 -0
  4. sapiopycommons/ai/api/fielddefinitions/proto/velox_field_def_pb2.py +89 -89
  5. sapiopycommons/ai/api/fielddefinitions/proto/velox_field_def_pb2.pyi +174 -174
  6. sapiopycommons/ai/api/plan/proto/step_output_pb2.py +11 -11
  7. sapiopycommons/ai/api/plan/proto/step_output_pb2.pyi +27 -27
  8. sapiopycommons/ai/api/plan/proto/step_pb2.py +9 -9
  9. sapiopycommons/ai/api/plan/proto/step_pb2.pyi +10 -10
  10. sapiopycommons/ai/api/plan/script/proto/script_pb2.py +13 -13
  11. sapiopycommons/ai/api/plan/script/proto/script_pb2.pyi +39 -39
  12. sapiopycommons/ai/api/plan/script/proto/script_pb2_grpc.py +12 -12
  13. sapiopycommons/ai/api/plan/tool/proto/entry_pb2.py +23 -23
  14. sapiopycommons/ai/api/plan/tool/proto/entry_pb2.pyi +63 -63
  15. sapiopycommons/ai/api/plan/tool/proto/tool_pb2.py +25 -31
  16. sapiopycommons/ai/api/plan/tool/proto/tool_pb2.pyi +136 -158
  17. sapiopycommons/ai/api/plan/tool/proto/tool_pb2_grpc.py +12 -12
  18. sapiopycommons/ai/api/session/proto/sapio_conn_info_pb2.py +5 -5
  19. sapiopycommons/ai/api/session/proto/sapio_conn_info_pb2.pyi +8 -8
  20. sapiopycommons/ai/protobuf_utils.py +452 -0
  21. sapiopycommons/ai/tool_service_base.py +288 -162
  22. {sapiopycommons-2025.4.25a497.dist-info → sapiopycommons-2025.4.30a499.dist-info}/METADATA +1 -1
  23. {sapiopycommons-2025.4.25a497.dist-info → sapiopycommons-2025.4.30a499.dist-info}/RECORD +25 -22
  24. sapiopycommons/ai/tool_of_tools.py +0 -917
  25. {sapiopycommons-2025.4.25a497.dist-info → sapiopycommons-2025.4.30a499.dist-info}/WHEEL +0 -0
  26. {sapiopycommons-2025.4.25a497.dist-info → sapiopycommons-2025.4.30a499.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,452 @@
1
+ from sapiopylib.rest.pojo.Sort import SortDirection
2
+ from sapiopylib.rest.pojo.datatype.FieldDefinition import AbstractVeloxFieldDefinition, FieldType, \
3
+ VeloxBooleanFieldDefinition, VeloxDateFieldDefinition, VeloxAccessionFieldDefinition, VeloxActionFieldDefinition, \
4
+ VeloxChildLinkFieldDefinition, VeloxDateRangeFieldDefinition, VeloxDoubleFieldDefinition, \
5
+ VeloxEnumFieldDefinition, VeloxIdentifierFieldDefinition, VeloxIntegerFieldDefinition, \
6
+ VeloxLongFieldDefinition, VeloxMultiParentFieldDefinition, VeloxParentFieldDefinition, \
7
+ VeloxPickListFieldDefinition, VeloxSelectionFieldDefinition, VeloxShortFieldDefinition, \
8
+ VeloxStringFieldDefinition, VeloxSideLinkFieldDefinition, VeloxActionStringFieldDefinition, FieldValidator, \
9
+ ListMode, SapioDoubleFormat, SapioStringFormat
10
+
11
+ from sapiopycommons.ai.api.fielddefinitions.proto.fields_pb2 import FieldValuePbo
12
+ from sapiopycommons.ai.api.fielddefinitions.proto.velox_field_def_pb2 import FieldTypePbo, SortDirectionPbo, \
13
+ DoubleFormatPbo, StringFormatPbo, FieldValidatorPbo, VeloxFieldDefPbo, BooleanPropertiesPbo, DatePropertiesPbo, \
14
+ DoublePropertiesPbo, IntegerPropertiesPbo, LongPropertiesPbo, SelectionPropertiesPbo, StringPropertiesPbo, \
15
+ SideLinkPropertiesPbo, ShortPropertiesPbo, PickListPropertiesPbo, ParentLinkPropertiesPbo, MultiParentPropertiesPbo, \
16
+ IdentifierPropertiesPbo, FileBlobPropertiesPbo, EnumPropertiesPbo, DateRangePropertiesPbo, ChildLinkPropertiesPbo, \
17
+ ActionStringPropertiesPbo, ActionPropertiesPbo, AccessionPropertiesPbo, SelectionDependentFieldEntryPbo, \
18
+ EnumDependentFieldEntryPbo, BooleanDependentFieldEntryPbo
19
+ from sapiopycommons.ai.api.plan.tool.proto.entry_pb2 import DataTypePbo
20
+ from sapiopycommons.general.aliases import FieldValue
21
+
22
+
23
+ class ProtobufUtils:
24
+ @staticmethod
25
+ def content_type_str(content_type: DataTypePbo) -> str:
26
+ """
27
+ Convert a DataTypePbo enum to its string representation.
28
+
29
+ :param content_type: The DataTypePbo enum value.
30
+ :return: The string representation of the DataTypePbo.
31
+ """
32
+ match content_type:
33
+ case DataTypePbo.BINARY:
34
+ return "binary"
35
+ case DataTypePbo.CSV:
36
+ return "csv"
37
+ case DataTypePbo.IMAGE:
38
+ return "image"
39
+ case DataTypePbo.JSON:
40
+ return "json"
41
+ case DataTypePbo.TEXT:
42
+ return "text"
43
+ case _:
44
+ raise Exception(f"Unexpected content type: {content_type}")
45
+
46
+ @staticmethod
47
+ def field_type_to_pbo(field_type: FieldType) -> FieldTypePbo:
48
+ """
49
+ Convert a FieldType enum to its corresponding FieldTypePbo.
50
+
51
+ :param field_type: The FieldType enum value.
52
+ :return: The corresponding FieldTypePbo.
53
+ """
54
+ match field_type:
55
+ case FieldType.ACTION:
56
+ return FieldTypePbo.ACTION
57
+ case FieldType.ACTION_STRING:
58
+ return FieldTypePbo.ACTION_STRING
59
+ case FieldType.AUTO_ACCESSION:
60
+ return FieldTypePbo.AUTO_ACCESSION
61
+ case FieldType.BOOLEAN:
62
+ return FieldTypePbo.BOOLEAN
63
+ case FieldType.CHILDLINK:
64
+ return FieldTypePbo.CHILDLINK
65
+ case FieldType.DATE:
66
+ return FieldTypePbo.DATE
67
+ case FieldType.DATE_RANGE:
68
+ return FieldTypePbo.DATE_RANGE
69
+ case FieldType.DOUBLE:
70
+ return FieldTypePbo.DOUBLE
71
+ case FieldType.ENUM:
72
+ return FieldTypePbo.ENUM
73
+ # case FieldType.FILE_BLOB: # Assuming FILE_BLOB exists in FieldType enum
74
+ # return FieldTypePbo.FILE_BLOB
75
+ case FieldType.IDENTIFIER:
76
+ return FieldTypePbo.IDENTIFIER
77
+ case FieldType.INTEGER:
78
+ return FieldTypePbo.INTEGER
79
+ case FieldType.LINK:
80
+ return FieldTypePbo.LINK
81
+ case FieldType.LONG:
82
+ return FieldTypePbo.LONG
83
+ case FieldType.MULTIPARENTLINK:
84
+ return FieldTypePbo.MULTIPARENTLINK
85
+ case FieldType.PARENTLINK:
86
+ return FieldTypePbo.PARENTLINK
87
+ case FieldType.PICKLIST:
88
+ return FieldTypePbo.PICKLIST
89
+ case FieldType.SELECTION:
90
+ return FieldTypePbo.SELECTION
91
+ case FieldType.SHORT:
92
+ return FieldTypePbo.SHORT
93
+ case FieldType.SIDE_LINK:
94
+ return FieldTypePbo.SIDE_LINK
95
+ case FieldType.STRING:
96
+ return FieldTypePbo.STRING
97
+ case _:
98
+ return FieldTypePbo.FIELD_TYPE_UNSPECIFIED
99
+
100
+ @staticmethod
101
+ def sort_direction_to_pbo(sort_direction: SortDirection | None) -> SortDirectionPbo:
102
+ """
103
+ Convert a SortDirection enum to its corresponding SortDirectionPbo.
104
+
105
+ :param sort_direction: The SortDirection enum value.
106
+ :return: The corresponding SortDirectionPbo.
107
+ """
108
+ if sort_direction is None or sort_direction == SortDirection.NONE:
109
+ return SortDirectionPbo.SORT_DIRECTION_NONE
110
+ elif sort_direction == SortDirection.ASCENDING:
111
+ return SortDirectionPbo.SORT_DIRECTION_ASCENDING
112
+ elif sort_direction == SortDirection.DESCENDING:
113
+ return SortDirectionPbo.SORT_DIRECTION_DESCENDING
114
+ else:
115
+ return SortDirectionPbo.SORT_DIRECTION_UNSPECIFIED
116
+
117
+ @staticmethod
118
+ def double_format_to_pbo(double_format: SapioDoubleFormat | None) -> DoubleFormatPbo:
119
+ """
120
+ Convert a SapioDoubleFormat enum to its corresponding DoubleFormatPbo.
121
+
122
+ :param double_format: The SapioDoubleFormat enum value.
123
+ :return: The corresponding DoubleFormatPbo.
124
+ """
125
+ if double_format is None:
126
+ return DoubleFormatPbo.DOUBLE_FORMAT_UNSPECIFIED
127
+ elif double_format == SapioDoubleFormat.CURRENCY:
128
+ return DoubleFormatPbo.DOUBLE_FORMAT_CURRENCY
129
+ elif double_format == SapioDoubleFormat.PERCENTAGE:
130
+ return DoubleFormatPbo.DOUBLE_FORMAT_PERCENTAGE
131
+ else:
132
+ return DoubleFormatPbo.DOUBLE_FORMAT_UNSPECIFIED
133
+
134
+ @staticmethod
135
+ def string_format_to_pbo(string_format: SapioStringFormat | None) -> StringFormatPbo:
136
+ """
137
+ Convert a SapioStringFormat enum to its corresponding StringFormatPbo.
138
+
139
+ :param string_format: The SapioStringFormat enum value.
140
+ :return: The corresponding StringFormatPbo.
141
+ """
142
+ if string_format is None:
143
+ return StringFormatPbo.STRING_FORMAT_UNSPECIFIED
144
+ elif string_format == SapioStringFormat.EMAIL:
145
+ return StringFormatPbo.STRING_FORMAT_EMAIL
146
+ elif string_format == SapioStringFormat.PHONE:
147
+ return StringFormatPbo.STRING_FORMAT_PHONE
148
+ else:
149
+ return StringFormatPbo.STRING_FORMAT_UNSPECIFIED
150
+
151
+ @staticmethod
152
+ def field_validator_to_pbo(validator: FieldValidator | None) -> FieldValidatorPbo | None:
153
+ """
154
+ Convert a FieldValidator object to its corresponding FieldValidatorPbo.
155
+
156
+ :param validator: The FieldValidator object.
157
+ :return: The corresponding FieldValidatorPbo or None if validator is None.
158
+ """
159
+ if validator is None:
160
+ return None
161
+ return FieldValidatorPbo(
162
+ validation_regex=validator.validation_regex,
163
+ error_message=validator.error_message
164
+ )
165
+
166
+ @staticmethod
167
+ def list_mode_to_str(list_mode: ListMode, field: VeloxSelectionFieldDefinition) -> str | None:
168
+ """
169
+ Convert a ListMode enum to its string representation.
170
+
171
+ :param list_mode: The ListMode enum value.
172
+ :param field: The VeloxSelectionFieldDefinition object.
173
+ :return: The string representation of the ListMode or None if list_mode is None.
174
+ """
175
+ if list_mode is None:
176
+ return None
177
+ list_mode_str = list_mode.list_mode_name
178
+ if list_mode == ListMode.LIST:
179
+ list_mode_str += field.pick_list_name or ""
180
+ elif list_mode == ListMode.PLUGIN:
181
+ list_mode_str += field.plugin_name or ""
182
+ elif list_mode == ListMode.REPORT:
183
+ list_mode_str += field.custom_report_name or ""
184
+ return list_mode_str
185
+
186
+ @staticmethod
187
+ def field_def_to_pbo(field: AbstractVeloxFieldDefinition) -> VeloxFieldDefPbo:
188
+ """
189
+ Convert a AbstractVeloxFieldDefinition object to its corresponding VeloxFieldDefPbo.
190
+
191
+ :param field: The AbstractVeloxFieldDefinition object.
192
+ :return: The corresponding VeloxFieldDefPbo.
193
+ """
194
+ accession_properties: AccessionPropertiesPbo | None = None
195
+ action_properties: ActionPropertiesPbo | None = None
196
+ action_string_properties: ActionStringPropertiesPbo | None = None
197
+ boolean_properties: BooleanPropertiesPbo | None = None
198
+ child_link_properties: ChildLinkPropertiesPbo | None = None
199
+ date_properties: DatePropertiesPbo | None = None
200
+ date_range_properties: DateRangePropertiesPbo | None = None
201
+ double_properties: DoublePropertiesPbo | None = None
202
+ enum_properties: EnumPropertiesPbo | None = None
203
+ file_blob_properties: FileBlobPropertiesPbo | None = None
204
+ identifier_properties: IdentifierPropertiesPbo | None = None
205
+ integer_properties: IntegerPropertiesPbo | None = None
206
+ long_properties: LongPropertiesPbo | None = None
207
+ multi_parent_properties: MultiParentPropertiesPbo | None = None
208
+ parent_link_properties: ParentLinkPropertiesPbo | None = None
209
+ picklist_properties: PickListPropertiesPbo | None = None
210
+ selection_properties: SelectionPropertiesPbo | None = None
211
+ short_properties: ShortPropertiesPbo | None = None
212
+ side_link_properties: SideLinkPropertiesPbo | None = None
213
+ string_properties: StringPropertiesPbo | None = None
214
+
215
+ if isinstance(field, VeloxAccessionFieldDefinition):
216
+ accession_properties = AccessionPropertiesPbo(
217
+ unique_value=field.unique_value,
218
+ # index_for_search # Missing in FieldDefinition.py
219
+ link_out=field.link_out,
220
+ link_out_url=field.link_out_url,
221
+ sequence_key=field.sequence_key,
222
+ prefix=field.prefix,
223
+ suffix=field.suffix,
224
+ number_of_digits=field.number_of_digits,
225
+ starting_value=field.starting_value
226
+ )
227
+ elif isinstance(field, VeloxActionFieldDefinition):
228
+ action_properties = ActionPropertiesPbo(
229
+ # icon_name # Missing in FieldDefinition.py
230
+ # icon_color # Missing in FieldDefinition.py
231
+ # background_color # Missing in FieldDefinition.py
232
+ # font_color # Missing in FieldDefinition.py
233
+ # action_plugin_path # Missing in FieldDefinition.py
234
+ )
235
+ elif isinstance(field, VeloxActionStringFieldDefinition):
236
+ action_string_properties = ActionStringPropertiesPbo(
237
+ default_value=field.default_value,
238
+ max_length=field.max_length,
239
+ unique_value=field.unique_value,
240
+ icon_name=field.icon_name,
241
+ action_plugin_path=field.action_plugin_path,
242
+ field_validator=ProtobufUtils.field_validator_to_pbo(field.field_validator),
243
+ direct_edit=field.direct_edit
244
+ )
245
+ elif isinstance(field, VeloxBooleanFieldDefinition):
246
+ boolean_properties = BooleanPropertiesPbo(
247
+ default_value=field.default_value,
248
+ is_process_todo_item=field.process_todo_item,
249
+ dependent_fields=[BooleanDependentFieldEntryPbo(k, v) for k, v in field.get_dependent_field_map().items()],
250
+ is_hide_disabled_fields=field.hide_disabled_fields
251
+ )
252
+ elif isinstance(field, VeloxChildLinkFieldDefinition):
253
+ child_link_properties = ChildLinkPropertiesPbo(
254
+ # default_value # Missing in FieldDefinition.py
255
+ )
256
+ elif isinstance(field, VeloxDateFieldDefinition):
257
+ date_properties = DatePropertiesPbo(
258
+ default_value=field.default_value,
259
+ static_date=field.static_date,
260
+ date_time_format=field.date_time_format
261
+ )
262
+ elif isinstance(field, VeloxDateRangeFieldDefinition):
263
+ date_range_properties = DateRangePropertiesPbo(
264
+ default_value=field.default_value,
265
+ is_static=field.static_date,
266
+ date_time_format=field.date_time_format
267
+ )
268
+ elif isinstance(field, VeloxDoubleFieldDefinition):
269
+ double_properties = DoublePropertiesPbo(
270
+ min_value=field.min_value,
271
+ max_value=field.max_value,
272
+ default_value=field.default_value,
273
+ precision=field.precision,
274
+ double_format=ProtobufUtils.double_format_to_pbo(field.double_format),
275
+ # color_ranges # Missing in FieldDefinition.py
276
+ )
277
+ # elif isinstance(field, VeloxFileBlobFieldDefinition): # Assuming this exists
278
+ # file_blob_properties = FileBlobPropertiesPbo()
279
+ elif isinstance(field, VeloxEnumFieldDefinition):
280
+ enum_properties = EnumPropertiesPbo(
281
+ default_value=field.default_value,
282
+ values=field.values if field.values is not None else [],
283
+ # color_mapping # Missing in FieldDefinition.py
284
+ # auto_clear_field_list # Missing in FieldDefinition.py
285
+ dependent_fields=[EnumDependentFieldEntryPbo(k, v) for k,v in field.get_dependent_field_map().items()],
286
+ is_hide_disabled_fields=field.hide_disabled_fields
287
+ )
288
+ elif isinstance(field, VeloxIdentifierFieldDefinition):
289
+ identifier_properties = IdentifierPropertiesPbo(
290
+ # default_value # Missing in FieldDefinition.py
291
+ )
292
+ elif isinstance(field, VeloxIntegerFieldDefinition):
293
+ integer_properties = IntegerPropertiesPbo(
294
+ min_value=field.min_value,
295
+ max_value=field.max_value,
296
+ default_value=field.default_value,
297
+ unique_value=field.unique_value,
298
+ # color_ranges # Missing in FieldDefinition.py
299
+ )
300
+ elif isinstance(field, VeloxLongFieldDefinition):
301
+ long_properties = LongPropertiesPbo(
302
+ min_value=field.min_value,
303
+ max_value=field.max_value,
304
+ default_value=field.default_value,
305
+ unique_value=field.unique_value,
306
+ # color_ranges # Missing in FieldDefinition.py
307
+ )
308
+ elif isinstance(field, VeloxMultiParentFieldDefinition):
309
+ multi_parent_properties = MultiParentPropertiesPbo()
310
+ elif isinstance(field, VeloxParentFieldDefinition):
311
+ parent_link_properties = ParentLinkPropertiesPbo(
312
+ # default_value # Missing in FieldDefinition.py
313
+ )
314
+ elif isinstance(field, VeloxPickListFieldDefinition):
315
+ picklist_properties = PickListPropertiesPbo(
316
+ default_value=field.default_value,
317
+ pick_list_name=field.pick_list_name,
318
+ direct_edit=field.direct_edit,
319
+ # link_out # Missing in FieldDefinition.py
320
+ # link_out_url # Missing in FieldDefinition.py
321
+ # index_for_search # Missing in FieldDefinition.py
322
+ # field_validator # Missing in FieldDefinition.py
323
+ # color_mapping # Missing in FieldDefinition.py
324
+ # auto_clear_field_list # Missing in FieldDefinition.py
325
+ # process_detail_map # Missing in FieldDefinition.py
326
+ dependent_fields=[SelectionDependentFieldEntryPbo(k, v) for k,v in field.get_dependent_field_map().items()],
327
+ is_hide_disabled_fields=field.hide_disabled_fields
328
+ )
329
+ elif isinstance(field, VeloxSelectionFieldDefinition):
330
+ list_mode_str = ProtobufUtils.list_mode_to_str(field.list_mode, field)
331
+ selection_properties = SelectionPropertiesPbo(
332
+ default_value=field.default_value,
333
+ list_mode=list_mode_str,
334
+ # auto_sort # Missing in FieldDefinition.py
335
+ direct_edit=field.direct_edit,
336
+ unique_value=field.unique_value,
337
+ # link_out # Missing in FieldDefinition.py
338
+ # link_out_url # Missing in FieldDefinition.py
339
+ multi_select=field.multi_select,
340
+ # index_for_search # Missing in FieldDefinition.py
341
+ # is_auto_size # Missing in FieldDefinition.py
342
+ # field_validator # Missing in FieldDefinition.py
343
+ static_list_values=field.static_list_values if field.static_list_values is not None else [],
344
+ # color_mapping # Missing in FieldDefinition.py
345
+ # auto_clear_field_list # Missing in FieldDefinition.py
346
+ # process_detail_map # Missing in FieldDefinition.py
347
+ dependent_fields=[SelectionDependentFieldEntryPbo(k, v) for k,v in field.get_dependent_field_map().items()],
348
+ is_hide_disabled_fields=field.hide_disabled_fields
349
+ )
350
+ elif isinstance(field, VeloxShortFieldDefinition):
351
+ short_properties = ShortPropertiesPbo(
352
+ min_value=field.min_value,
353
+ max_value=field.max_value,
354
+ default_value=field.default_value,
355
+ unique_value=field.unique_value,
356
+ # color_ranges # Missing in FieldDefinition.py
357
+ )
358
+ elif isinstance(field, VeloxSideLinkFieldDefinition):
359
+ side_link_properties = SideLinkPropertiesPbo(
360
+ linked_data_type_name=field.linked_data_type_name,
361
+ default_value=field.default_value,
362
+ # show_in_knowledge_graph # Missing in FieldDefinition.py
363
+ # knowledge_graph_display_name # Missing in FieldDefinition.py
364
+ )
365
+ elif isinstance(field, VeloxStringFieldDefinition):
366
+ string_properties = StringPropertiesPbo(
367
+ default_value=field.default_value,
368
+ max_length=field.max_length,
369
+ num_lines=field.num_lines,
370
+ unique_value=field.unique_value,
371
+ # index_for_search # Missing in FieldDefinition.py
372
+ html_editor=field.html_editor,
373
+ link_out=field.link_out,
374
+ link_out_url=field.link_out_url,
375
+ string_format=ProtobufUtils.string_format_to_pbo(field.string_format),
376
+ is_auto_size=field.auto_size,
377
+ field_validator=ProtobufUtils.field_validator_to_pbo(field.field_validator),
378
+ # preserve_padding # Missing in FieldDefinition.py
379
+ )
380
+ # else: # Handle unknown types or just let it pass with no specific properties
381
+ # print(f"Warning: Unhandled field type for properties mapping: {type(field)}")
382
+
383
+ return VeloxFieldDefPbo(
384
+ data_field_type=ProtobufUtils.field_type_to_pbo(field.data_field_type),
385
+ data_field_name=field.data_field_name,
386
+ display_name=field.display_name,
387
+ description=field.description,
388
+ required=field.required,
389
+ editable=field.editable,
390
+ visible=field.visible,
391
+ identifier=field.identifier,
392
+ identifier_order=field.identifier_order,
393
+ sort_direction=ProtobufUtils.sort_direction_to_pbo(field.sort_direction),
394
+ sort_order=field.sort_order,
395
+ tag=field.tag,
396
+ # approve_edit # Missing in FieldDefinition.py
397
+ # workflow_only_editing # Missing in FieldDefinition.py
398
+ # font_size # Missing in FieldDefinition.py
399
+ # bold_font # Missing in FieldDefinition.py
400
+ # italic_font # Missing in FieldDefinition.py
401
+ # text_decoration # Missing in FieldDefinition.py
402
+ is_key_field=field.key_field,
403
+ key_field_order=field.key_field_order,
404
+ # is_removable # Missing in FieldDefinition.py
405
+ is_system_field=field.system_field,
406
+ # is_restricted # Missing in FieldDefinition.py
407
+ is_audit_logged=field.audit_logged,
408
+ # is_active # Missing in FieldDefinition.py
409
+ # is_for_plugin_use_only # Missing in FieldDefinition.py
410
+ default_table_column_width=field.default_table_column_width,
411
+
412
+ accession_properties=accession_properties,
413
+ action_properties=action_properties,
414
+ action_string_properties=action_string_properties,
415
+ boolean_properties=boolean_properties,
416
+ child_link_properties=child_link_properties,
417
+ date_properties=date_properties,
418
+ date_range_properties=date_range_properties,
419
+ double_properties=double_properties,
420
+ enum_properties=enum_properties,
421
+ file_blob_properties=file_blob_properties,
422
+ identifier_properties=identifier_properties,
423
+ integer_properties=integer_properties,
424
+ long_properties=long_properties,
425
+ multi_parent_properties=multi_parent_properties,
426
+ parent_link_properties=parent_link_properties,
427
+ picklist_properties=picklist_properties,
428
+ selection_properties=selection_properties,
429
+ short_properties=short_properties,
430
+ side_link_properties=side_link_properties,
431
+ string_properties=string_properties,
432
+ )
433
+
434
+ @staticmethod
435
+ def field_pbo_to_value(field: VeloxFieldDefPbo | FieldTypePbo, value: FieldValuePbo) -> FieldValue:
436
+ """
437
+ Convert a StepRecordFieldValue to its corresponding Python value based on the field type.
438
+
439
+ :param field: The VeloxFieldDefPbo or FieldTypePbo object for the given value.
440
+ :param value: The StepRecordFieldValue object.
441
+ :return: The corresponding Python value.
442
+ """
443
+ field_type = field.data_field_type if isinstance(field, VeloxFieldDefPbo) else field
444
+ match field_type:
445
+ case FieldTypePbo.BOOLEAN:
446
+ return value.bool_value
447
+ case FieldTypePbo.DOUBLE:
448
+ return value.double_value
449
+ case FieldTypePbo.ENUM, FieldTypePbo.INTEGER, FieldTypePbo.LONG, FieldTypePbo.SHORT:
450
+ return value.int_value
451
+ case _:
452
+ return value.string_value