sapiopycommons 2024.10.24a342__py3-none-any.whl → 2024.10.29a346__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.

@@ -0,0 +1,440 @@
1
+ from sapiopylib.rest.pojo.datatype.FieldDefinition import FieldType
2
+ from sapiopylib.rest.utils.recordmodel.RecordModelWrapper import WrapperField
3
+
4
+
5
+ class ActiveTaskPseudoDef:
6
+ DATA_TYPE_NAME: str = "ActiveTask"
7
+ ACTIVE_TASK_ID__FIELD_NAME = WrapperField("ActiveTaskId", FieldType.LONG)
8
+ ACTIVE_WORKFLOW_ID__FIELD_NAME = WrapperField("ActiveWorkflowId", FieldType.LONG)
9
+ DATE_EDITED__FIELD_NAME = WrapperField("DateEdited", FieldType.DATE)
10
+ EDITED_BY__FIELD_NAME = WrapperField("EditedBy", FieldType.STRING)
11
+ STATUS__FIELD_NAME = WrapperField("Status", FieldType.ENUM)
12
+ TASK_USAGE_ID__FIELD_NAME = WrapperField("TaskUsageId", FieldType.LONG)
13
+
14
+
15
+ class ActiveWorkflowPseudoDef:
16
+ DATA_TYPE_NAME: str = "ActiveWorkflow"
17
+ ACTIVE_WORKFLOW_ID__FIELD_NAME = WrapperField("ActiveWorkflowId", FieldType.LONG)
18
+ CREATED_BY__FIELD_NAME = WrapperField("CreatedBy", FieldType.STRING)
19
+ DATE_CREATED__FIELD_NAME = WrapperField("DateCreated", FieldType.DATE)
20
+ DATE_EDITED__FIELD_NAME = WrapperField("DateEdited", FieldType.STRING)
21
+ EDITED_BY__FIELD_NAME = WrapperField("EditedBy", FieldType.STRING)
22
+ ESTIMATED_ATTACHMENTS__FIELD_NAME = WrapperField("EstimatedAttachments", FieldType.LONG)
23
+ NAME__FIELD_NAME = WrapperField("Name", FieldType.STRING)
24
+ RELATED_RECORD_ID__FIELD_NAME = WrapperField("RelatedRecordId", FieldType.LONG)
25
+ STATUS__FIELD_NAME = WrapperField("Status", FieldType.ENUM)
26
+ WORKFLOW_ID__FIELD_NAME = WrapperField("WorkflowId", FieldType.LONG)
27
+
28
+
29
+ class AuditLogPseudoDef:
30
+ DATA_TYPE_NAME: str = "AuditLog"
31
+ DATA_FIELD_NAME__FIELD_NAME = WrapperField("DataFieldName", FieldType.STRING)
32
+ DATA_TYPE_NAME__FIELD_NAME = WrapperField("DataTypeName", FieldType.STRING)
33
+ DESCRIPTION__FIELD_NAME = WrapperField("Description", FieldType.STRING)
34
+ EVENT_TYPE__FIELD_NAME = WrapperField("EventType", FieldType.ENUM)
35
+ FULL_NAME__FIELD_NAME = WrapperField("FullName", FieldType.STRING)
36
+ NEW_VALUE__FIELD_NAME = WrapperField("NewValue", FieldType.STRING)
37
+ ORIGINAL_VALUE__FIELD_NAME = WrapperField("OriginalValue", FieldType.STRING)
38
+ RECORD_ID__FIELD_NAME = WrapperField("RecordId", FieldType.LONG)
39
+ RECORD_NAME__FIELD_NAME = WrapperField("RecordName", FieldType.STRING)
40
+ TIME_STAMP__FIELD_NAME = WrapperField("TimeStamp", FieldType.DATE)
41
+ USER_COMMENT__FIELD_NAME = WrapperField("UserComment", FieldType.STRING)
42
+ USER_NAME__FIELD_NAME = WrapperField("UserName", FieldType.STRING)
43
+
44
+
45
+ class DataFieldDefinitionPseudoDef:
46
+ DATA_TYPE_NAME: str = "DataFieldDefinition"
47
+ APPROVE_EDIT__FIELD_NAME = WrapperField("ApproveEdit", FieldType.BOOLEAN)
48
+ AUTO_CLEAR_FIELD_LIST__FIELD_NAME = WrapperField("AutoClearFieldList", FieldType.STRING)
49
+ AUTO_SORT__FIELD_NAME = WrapperField("AutoSort", FieldType.BOOLEAN)
50
+ COLOR_MAPPING_ID__FIELD_NAME = WrapperField("ColorMappingId", FieldType.LONG)
51
+ DATA_FIELD_NAME__FIELD_NAME = WrapperField("DataFieldName", FieldType.STRING)
52
+ DATA_FIELD_TAG__FIELD_NAME = WrapperField("DataFieldTag", FieldType.STRING)
53
+ DATA_FIELD_TYPE__FIELD_NAME = WrapperField("DataFieldType", FieldType.STRING)
54
+ DATA_TYPE_NAME__FIELD_NAME = WrapperField("DataTypeName", FieldType.STRING)
55
+ DECIMAL_DIGITS__FIELD_NAME = WrapperField("DecimalDigits", FieldType.INTEGER)
56
+ DEFAULT_VALUE__FIELD_NAME = WrapperField("DefaultValue", FieldType.STRING)
57
+ DEPENDENT_FIELDS__FIELD_NAME = WrapperField("Dependent_Fields", FieldType.STRING)
58
+ DESCRIPTION__FIELD_NAME = WrapperField("Description", FieldType.STRING)
59
+ DIRECT_EDIT__FIELD_NAME = WrapperField("DirectEdit", FieldType.BOOLEAN)
60
+ DISPLAY_NAME__FIELD_NAME = WrapperField("DisplayName", FieldType.STRING)
61
+ EDITABLE__FIELD_NAME = WrapperField("Editable", FieldType.BOOLEAN)
62
+ ENUM_VALUES__FIELD_NAME = WrapperField("EnumValues", FieldType.STRING)
63
+ FORM_COL__FIELD_NAME = WrapperField("FormCol", FieldType.SHORT)
64
+ FORM_COL_SPAN__FIELD_NAME = WrapperField("FormColSpan", FieldType.SHORT)
65
+ FORM_NAME__FIELD_NAME = WrapperField("FormName", FieldType.STRING)
66
+ HTML_EDITOR__FIELD_NAME = WrapperField("HtmlEditor", FieldType.BOOLEAN)
67
+ IDENTIFIER__FIELD_NAME = WrapperField("Identifier", FieldType.BOOLEAN)
68
+ INDEX_FOR_SEARCH__FIELD_NAME = WrapperField("IndexForSearch", FieldType.BOOLEAN)
69
+ LINK_OUT__FIELD_NAME = WrapperField("LinkOut", FieldType.BOOLEAN)
70
+ LINK_OUT_URL__FIELD_NAME = WrapperField("LinkOutUrl", FieldType.BOOLEAN)
71
+ MAX_LENGTH__FIELD_NAME = WrapperField("MaxLength", FieldType.INTEGER)
72
+ MAXIMUM_VALUE__FIELD_NAME = WrapperField("MaximumValue", FieldType.DOUBLE)
73
+ MINIMUM_VALUE__FIELD_NAME = WrapperField("MinimumValue", FieldType.DOUBLE)
74
+ MULT_SELECT__FIELD_NAME = WrapperField("MultSelect", FieldType.BOOLEAN)
75
+ NUM_LINES__FIELD_NAME = WrapperField("NumLines", FieldType.INTEGER)
76
+ REQUIRED__FIELD_NAME = WrapperField("Required", FieldType.BOOLEAN)
77
+ SORT_KEY__FIELD_NAME = WrapperField("SortKey", FieldType.BOOLEAN)
78
+ STATIC_DATE__FIELD_NAME = WrapperField("StaticDate", FieldType.BOOLEAN)
79
+ UNIQUE_VALUE__FIELD_NAME = WrapperField("UniqueValue", FieldType.BOOLEAN)
80
+ VISIBLE__FIELD_NAME = WrapperField("Visible", FieldType.BOOLEAN)
81
+ WORKFLOW_ONLY_EDITING__FIELD_NAME = WrapperField("WorkflowOnlyEditing", FieldType.BOOLEAN)
82
+
83
+
84
+ class DataTypeDefinitionPseudoDef:
85
+ DATA_TYPE_NAME: str = "DataTypeDefinition"
86
+ ADDABLE__FIELD_NAME = WrapperField("Addable", FieldType.BOOLEAN)
87
+ ATTACHMENT__FIELD_NAME = WrapperField("Attachment", FieldType.BOOLEAN)
88
+ ATTACHMENT_TYPE__FIELD_NAME = WrapperField("AttachmentType", FieldType.STRING)
89
+ DATA_TYPE_TAG__FIELD_NAME = WrapperField("DATA_TYPE_TAG", FieldType.STRING)
90
+ DATA_TYPE_ID__FIELD_NAME = WrapperField("DataTypeId", FieldType.LONG)
91
+ DATA_TYPE_NAME__FIELD_NAME = WrapperField("DataTypeName", FieldType.STRING)
92
+ DELETABLE__FIELD_NAME = WrapperField("Deletable", FieldType.BOOLEAN)
93
+ DESCRIPTION__FIELD_NAME = WrapperField("Description", FieldType.STRING)
94
+ DISPLAY_NAME__FIELD_NAME = WrapperField("DisplayName", FieldType.STRING)
95
+ EXTENSION_TYPE__FIELD_NAME = WrapperField("ExtensionType", FieldType.BOOLEAN)
96
+ GROUP_ADDABLE__FIELD_NAME = WrapperField("GroupAddable", FieldType.BOOLEAN)
97
+ HIDE_DATA_RECORDS__FIELD_NAME = WrapperField("HideDataRecords", FieldType.BOOLEAN)
98
+ HIGH_VOLUME__FIELD_NAME = WrapperField("HighVolume", FieldType.BOOLEAN)
99
+ IS_HIDE_IN_MOBILE__FIELD_NAME = WrapperField("IS_HIDE_IN_MOBILE", FieldType.BOOLEAN)
100
+ IS_HVDT_ON_SAVE_ENABLED__FIELD_NAME = WrapperField("IS_HVDT_ON_SAVE_ENABLED", FieldType.BOOLEAN)
101
+ IS_PUBLIC_ATTACHMENT__FIELD_NAME = WrapperField("IS_PUBLIC_ATTACHMENT", FieldType.BOOLEAN)
102
+ ICON_COLOR__FIELD_NAME = WrapperField("IconColor", FieldType.STRING)
103
+ ICON_NAME__FIELD_NAME = WrapperField("IconName", FieldType.STRING)
104
+ IMPORTABLE__FIELD_NAME = WrapperField("Importable", FieldType.BOOLEAN)
105
+ IS_ACTIVE__FIELD_NAME = WrapperField("IsActive", FieldType.BOOLEAN)
106
+ IS_HIDDEN__FIELD_NAME = WrapperField("IsHidden", FieldType.BOOLEAN)
107
+ MAX_TABLE_ROW_COUNT__FIELD_NAME = WrapperField("MaxTableRowCount", FieldType.LONG)
108
+ PLURAL_DISPLAY_NAME__FIELD_NAME = WrapperField("PluralDisplayName", FieldType.STRING)
109
+ RECORD_ASSIGNABLE__FIELD_NAME = WrapperField("RecordAssignable", FieldType.BOOLEAN)
110
+ RECORD_IMAGE_ASSIGNABLE__FIELD_NAME = WrapperField("RecordImageAssignable", FieldType.BOOLEAN)
111
+ RECORD_IMAGE_MANUALLY_ADDABLE__FIELD_NAME = WrapperField("RecordImageManuallyAddable", FieldType.BOOLEAN)
112
+ REMOVABLE__FIELD_NAME = WrapperField("Removable", FieldType.BOOLEAN)
113
+ RESTRICTED__FIELD_NAME = WrapperField("Restricted", FieldType.BOOLEAN)
114
+ SHOW_ON_HOME_SCREEN__FIELD_NAME = WrapperField("ShowOnHomeScreen", FieldType.BOOLEAN)
115
+ SHOW_SUB_TABLES__FIELD_NAME = WrapperField("ShowSubTables", FieldType.BOOLEAN)
116
+ SHOW_TABS__FIELD_NAME = WrapperField("ShowTabs", FieldType.BOOLEAN)
117
+ SINGLE_PARENT__FIELD_NAME = WrapperField("SingleParent", FieldType.BOOLEAN)
118
+ UNDER_CONTAINER__FIELD_NAME = WrapperField("UnderContainer", FieldType.BOOLEAN)
119
+
120
+
121
+ class EnbDataTypeDefinitionPseudoDef:
122
+ DATA_TYPE_NAME: str = "EnbDataTypeDefinition"
123
+ DATA_TYPE_ID__FIELD_NAME = WrapperField("DataTypeId", FieldType.LONG)
124
+ DATA_TYPE_NAME__FIELD_NAME = WrapperField("DataTypeName", FieldType.STRING)
125
+ DESCRIPTION__FIELD_NAME = WrapperField("Description", FieldType.STRING)
126
+ DISPLAY_NAME__FIELD_NAME = WrapperField("DisplayName", FieldType.STRING)
127
+ ENB_DATA_TYPE_NAME__FIELD_NAME = WrapperField("EnbDataTypeName", FieldType.STRING)
128
+ ICON_COLOR__FIELD_NAME = WrapperField("IconColor", FieldType.STRING)
129
+ ICON_NAME__FIELD_NAME = WrapperField("IconName", FieldType.STRING)
130
+ NOTEBOOK_EXPERIMENT_ID__FIELD_NAME = WrapperField("Notebook_Experiment_ID", FieldType.LONG)
131
+ PLURAL_DISPLAY_NAME__FIELD_NAME = WrapperField("PluralDisplayName", FieldType.STRING)
132
+
133
+
134
+ class EnbEntryPseudoDef:
135
+ DATA_TYPE_NAME: str = "EnbEntry"
136
+ APPROVAL_DUE_DATE__FIELD_NAME = WrapperField("ApprovalDueDate", FieldType.DATE)
137
+ COLUMN_ORDER__FIELD_NAME = WrapperField("ColumnOrder", FieldType.INTEGER)
138
+ COLUMN_SPAN__FIELD_NAME = WrapperField("ColumnSpan", FieldType.INTEGER)
139
+ CREATED_BY__FIELD_NAME = WrapperField("CreatedBy", FieldType.STRING)
140
+ DATA_TYPE_NAME__FIELD_NAME = WrapperField("DataTypeName", FieldType.STRING)
141
+ DATE_CREATED__FIELD_NAME = WrapperField("DateCreated", FieldType.DATE)
142
+ DEPENDENT_ENTRY_ID_LIST__FIELD_NAME = WrapperField("DependentEntryIdList", FieldType.STRING)
143
+ ENTRY_DESCRIPTION__FIELD_NAME = WrapperField("EntryDescription", FieldType.STRING)
144
+ ENTRY_HEIGHT__FIELD_NAME = WrapperField("EntryHeight", FieldType.INTEGER)
145
+ ENTRY_ID__FIELD_NAME = WrapperField("EntryId", FieldType.LONG)
146
+ ENTRY_NAME__FIELD_NAME = WrapperField("EntryName", FieldType.STRING)
147
+ ENTRY_ORDER__FIELD_NAME = WrapperField("EntryOrder", FieldType.INTEGER)
148
+ ENTRY_REQUIRES_E_SIGN__FIELD_NAME = WrapperField("EntryRequiresESign", FieldType.BOOLEAN)
149
+ ENTRY_SINGLETON_ID__FIELD_NAME = WrapperField("EntrySingletonId", FieldType.STRING)
150
+ ENTRY_STATUS__FIELD_NAME = WrapperField("EntryStatus", FieldType.STRING)
151
+ ENTRY_TYPE__FIELD_NAME = WrapperField("EntryType", FieldType.STRING)
152
+ EXPERIMENT_ID__FIELD_NAME = WrapperField("ExperimentId", FieldType.LONG)
153
+ HAS_COMMENTS__FIELD_NAME = WrapperField("HasComments", FieldType.BOOLEAN)
154
+ IS_CREATED_FROM_TEMPLATE__FIELD_NAME = WrapperField("IsCreatedFromTemplate", FieldType.BOOLEAN)
155
+ IS_REQUIRED_ENTRY__FIELD_NAME = WrapperField("IsRequiredEntry", FieldType.BOOLEAN)
156
+ IS_SHOWN_IN_TEMPLATE__FIELD_NAME = WrapperField("IsShownInTemplate", FieldType.BOOLEAN)
157
+ LAST_MODIFIED_BY__FIELD_NAME = WrapperField("LastModifiedBy", FieldType.STRING)
158
+ LAST_MODIFIED_DATE__FIELD_NAME = WrapperField("LastModifiedDate", FieldType.DATE)
159
+ RELATED_ENTRY_ID_LIST__FIELD_NAME = WrapperField("RelatedEntryIdList", FieldType.STRING)
160
+ REQUIRES_GRABBER_PLUGIN__FIELD_NAME = WrapperField("RequriesGrabberPlugin", FieldType.BOOLEAN)
161
+ SOURCE_ENTRY_ID__FIELD_NAME = WrapperField("SourceEntryId", FieldType.LONG)
162
+ SUBMITTED_BY__FIELD_NAME = WrapperField("SubmittedBy", FieldType.STRING)
163
+ SUBMITTED_DATE__FIELD_NAME = WrapperField("SubmittedDate", FieldType.DATE)
164
+ TAB_ID__FIELD_NAME = WrapperField("TabId", FieldType.LONG)
165
+ TEMPLATE_ITEM_FULFILLED_TIME_STAMP__FIELD_NAME = WrapperField("TemplateItemFulfilledTimeStamp", FieldType.LONG)
166
+
167
+
168
+ class EnbEntryOptionsPseudoDef:
169
+ DATA_TYPE_NAME: str = "EnbEntryOptions"
170
+ ENTRY_ID__FIELD_NAME = WrapperField("EntryId", FieldType.LONG)
171
+ ENTRY_OPTION_VALUE__FIELD_NAME = WrapperField("EntryOptionValue", FieldType.STRING)
172
+ ENTRY_OPTION_KEY__FIELD_NAME = WrapperField("EntryOptionkey", FieldType.STRING)
173
+
174
+
175
+ class ExperimentEntryRecordPseudoDef:
176
+ DATA_TYPE_NAME: str = "ExperimentEntryRecord"
177
+ ENTRY_ID__FIELD_NAME = WrapperField("EntryId", FieldType.LONG)
178
+ RECORD_ID__FIELD_NAME = WrapperField("RecordId", FieldType.LONG)
179
+
180
+
181
+ class LimsUserPseudoDef:
182
+ DATA_TYPE_NAME: str = "LimsUser"
183
+ API_USER__FIELD_NAME = WrapperField("ApiUser", FieldType.BOOLEAN)
184
+ EMAIL_ADDRESS__FIELD_NAME = WrapperField("EmailAddress", FieldType.STRING)
185
+ FIRST_NAME__FIELD_NAME = WrapperField("FirstName", FieldType.STRING)
186
+ LAST_NAME__FIELD_NAME = WrapperField("LastName", FieldType.STRING)
187
+ MIDDLE_NAME__FIELD_NAME = WrapperField("MiddleName", FieldType.STRING)
188
+ PWD_EXPIRE_DATE__FIELD_NAME = WrapperField("PwdExpireDate", FieldType.DATE)
189
+ PWD_EXPIRE_INTERVAL__FIELD_NAME = WrapperField("PwdExpireInterval", FieldType.INTEGER)
190
+ USER_NAME__FIELD_NAME = WrapperField("UserName", FieldType.STRING)
191
+
192
+
193
+ class NotebookExperimentPseudoDef:
194
+ DATA_TYPE_NAME: str = "NotebookExperiment"
195
+ ACCESS_LEVEL__FIELD_NAME = WrapperField("AccessLevel", FieldType.STRING)
196
+ APPROVAL_DUE_DATE__FIELD_NAME = WrapperField("ApprovalDueDate", FieldType.DATE)
197
+ CREATED_BY__FIELD_NAME = WrapperField("CreatedBy", FieldType.STRING)
198
+ DATE_CREATED__FIELD_NAME = WrapperField("DateCreated", FieldType.DATE)
199
+ DESCRIPTION__FIELD_NAME = WrapperField("Description", FieldType.STRING)
200
+ EXPERIMENT_ID__FIELD_NAME = WrapperField("ExperimentId", FieldType.LONG)
201
+ EXPERIMENT_NAME__FIELD_NAME = WrapperField("ExperimentName", FieldType.STRING)
202
+ EXPERIMENT_OWNER__FIELD_NAME = WrapperField("ExperimentOwner", FieldType.STRING)
203
+ EXPERIMENT_RECORD_ID__FIELD_NAME = WrapperField("ExperimentRecordId", FieldType.LONG)
204
+ EXPERIMENT_TYPE_NAME__FIELD_NAME = WrapperField("ExperimentTypeName", FieldType.STRING)
205
+ IS_ACTIVE__FIELD_NAME = WrapperField("IsActive", FieldType.BOOLEAN)
206
+ IS_MODIFIABLE__FIELD_NAME = WrapperField("IsModifiable", FieldType.BOOLEAN)
207
+ IS_TEMPLATE__FIELD_NAME = WrapperField("IsTemplate", FieldType.BOOLEAN)
208
+ IS_PROTOCOL_TEMPLATE__FIELD_NAME = WrapperField("Is_Protocol_Template", FieldType.BOOLEAN)
209
+ LAST_MODIFIED_BY__FIELD_NAME = WrapperField("LastModifiedBy", FieldType.STRING)
210
+ LAST_MODIFIED_DATE__FIELD_NAME = WrapperField("LastModifiedDate", FieldType.DATE)
211
+ SOURCE_TEMPLATE_ID__FIELD_NAME = WrapperField("SourceTemplateId", FieldType.LONG)
212
+ STATUS__FIELD_NAME = WrapperField("Status", FieldType.STRING)
213
+
214
+
215
+ class NotebookExperimentOptionPseudoDef:
216
+ DATA_TYPE_NAME: str = "NotebookExperimentOption"
217
+ EXPERIMENT_ID__FIELD_NAME = WrapperField("ExperimentId", FieldType.LONG)
218
+ OPTION_KEY__FIELD_NAME = WrapperField("OptionKey", FieldType.STRING)
219
+ OPTION_VALUE__FIELD_NAME = WrapperField("OptionValue", FieldType.STRING)
220
+
221
+
222
+ class SystemLogPseudoDef:
223
+ DATA_TYPE_NAME: str = "SystemLog"
224
+ DATA_FIELD_NAME__FIELD_NAME = WrapperField("DataFieldName", FieldType.STRING)
225
+ DATA_TYPE_NAME__FIELD_NAME = WrapperField("DataTypeName", FieldType.STRING)
226
+ DESCRIPTION__FIELD_NAME = WrapperField("Description", FieldType.STRING)
227
+ EVENT_ID__FIELD_NAME = WrapperField("EventId", FieldType.LONG)
228
+ EVENT_TYPE__FIELD_NAME = WrapperField("EventType", FieldType.STRING)
229
+ FULL_NAME__FIELD_NAME = WrapperField("FullName", FieldType.STRING)
230
+ NEW_VALUE__FIELD_NAME = WrapperField("NewValue", FieldType.STRING)
231
+ ORIGINAL_VALUE__FIELD_NAME = WrapperField("OriginalValue", FieldType.STRING)
232
+ RECORD_ID__FIELD_NAME = WrapperField("RecordId", FieldType.LONG)
233
+ RECORD_NAME__FIELD_NAME = WrapperField("RecordName", FieldType.STRING)
234
+ TIMESTAMP__FIELD_NAME = WrapperField("Timestamp", FieldType.DATE)
235
+ USER_COMMENT__FIELD_NAME = WrapperField("UserComment", FieldType.STRING)
236
+ USERNAME__FIELD_NAME = WrapperField("Username", FieldType.STRING)
237
+
238
+
239
+ class SystemObjectChangeLogPseudoDef:
240
+ DATA_TYPE_NAME: str = "System_Object_Change_Log"
241
+ ALT_ID__FIELD_NAME = WrapperField("Alt_Id", FieldType.STRING)
242
+ ATTRIBUTE_NAME__FIELD_NAME = WrapperField("Attribute_Name", FieldType.STRING)
243
+ CHANGE_TYPE__FIELD_NAME = WrapperField("Change_Type", FieldType.STRING)
244
+ DATA_FIELD_NAME__FIELD_NAME = WrapperField("Data_Field_Name", FieldType.STRING)
245
+ DATA_TYPE_NAME__FIELD_NAME = WrapperField("Data_Type_Name", FieldType.STRING)
246
+ EVENT_ID__FIELD_NAME = WrapperField("Event_Id", FieldType.STRING)
247
+ NEW_VALUE__FIELD_NAME = WrapperField("New_Value", FieldType.STRING)
248
+ OBJECT_ID__FIELD_NAME = WrapperField("Object_Id", FieldType.STRING)
249
+ OBJECT_TYPE__FIELD_NAME = WrapperField("Object_Type", FieldType.STRING)
250
+ OLD_VALUE__FIELD_NAME = WrapperField("Old_Value", FieldType.STRING)
251
+ TIMESTAMP__FIELD_NAME = WrapperField("Timestamp", FieldType.DATE)
252
+ USERNAME__FIELD_NAME = WrapperField("Username", FieldType.STRING)
253
+
254
+
255
+ class TaskPseudoDef:
256
+ DATA_TYPE_NAME: str = "Task"
257
+ ATTACHMENT_REQUIRED__FIELD_NAME = WrapperField("AttachmentRequired", FieldType.BOOLEAN)
258
+ CREATED_BY__FIELD_NAME = WrapperField("CreatedBy", FieldType.STRING)
259
+ CUSTOM_ACTION__FIELD_NAME = WrapperField("CustomAction", FieldType.STRING)
260
+ DATA_TYPE_NAME_LIST__FIELD_NAME = WrapperField("DataTypeNameList", FieldType.STRING)
261
+ DATE_CREATED__FIELD_NAME = WrapperField("DateCreated", FieldType.DATE)
262
+ DATE_EDITED__FIELD_NAME = WrapperField("DateEdited", FieldType.DATE)
263
+ DISPLAY_TYPE__FIELD_NAME = WrapperField("DisplayType", FieldType.ENUM)
264
+ EDITED_BY__FIELD_NAME = WrapperField("EditedBy", FieldType.STRING)
265
+ INPUT_DATA_TYPE_NAME__FIELD_NAME = WrapperField("InputDataTypeName", FieldType.STRING)
266
+ IS_TEMPLATE__FIELD_NAME = WrapperField("IsTemplate", FieldType.BOOLEAN)
267
+ LONG_DESC__FIELD_NAME = WrapperField("LongDesc", FieldType.STRING)
268
+ MENU_TASK_ID__FIELD_NAME = WrapperField("MenuTaskId", FieldType.ENUM)
269
+ NAME__FIELD_NAME = WrapperField("Name", FieldType.STRING)
270
+ SHORT_DESC__FIELD_NAME = WrapperField("ShortDesc", FieldType.STRING)
271
+ TASK_ID__FIELD_NAME = WrapperField("TaskId", FieldType.LONG)
272
+ TASK_VERSION__FIELD_NAME = WrapperField("TaskVersion", FieldType.LONG)
273
+ TEMPLATE_TASK_ID__FIELD_NAME = WrapperField("TemplateTaskId", FieldType.LONG)
274
+ TYPE__FIELD_NAME = WrapperField("Type", FieldType.ENUM)
275
+
276
+
277
+ class TaskAttachmentPseudoDef:
278
+ DATA_TYPE_NAME: str = "TaskAttachment"
279
+ ACTIVE_TASK_ID__FIELD_NAME = WrapperField("ActiveTaskId", FieldType.LONG)
280
+ RECORD_ID__FIELD_NAME = WrapperField("RecordId", FieldType.LONG)
281
+
282
+
283
+ class TaskOptionPseudoDef:
284
+ DATA_TYPE_NAME: str = "TaskOption"
285
+ OPTION_KEY__FIELD_NAME = WrapperField("OptionKey", FieldType.STRING)
286
+ OPTION_VALUE__FIELD_NAME = WrapperField("OptionValue", FieldType.STRING)
287
+ TASK_ID__FIELD_NAME = WrapperField("TaskId", FieldType.LONG)
288
+
289
+
290
+ class TaskUsagePseudoDef:
291
+ DATA_TYPE_NAME: str = "TaskUsage"
292
+ FORCE_ATTACH__FIELD_NAME = WrapperField("ForceAttach", FieldType.BOOLEAN)
293
+ IS_TEMPLATE__FIELD_NAME = WrapperField("IsTemplate", FieldType.BOOLEAN)
294
+ TASK_ID__FIELD_NAME = WrapperField("TaskId", FieldType.LONG)
295
+ TASK_ORDER__FIELD_NAME = WrapperField("TaskOrder", FieldType.INTEGER)
296
+ TASK_USAGE_ID__FIELD_NAME = WrapperField("TaskUsageId", FieldType.LONG)
297
+ WORKFLOW_ID__FIELD_NAME = WrapperField("WorkflowId", FieldType.LONG)
298
+
299
+
300
+ class VeloxWebhookPseudoDef:
301
+ DATA_TYPE_NAME: str = "VELOXWEBHOOK"
302
+ CUSTOM_PLUGIN_POINT__FIELD_NAME = WrapperField("CUSTOM_PLUGIN_POINT", FieldType.STRING)
303
+ DATA_TYPE_NAME_SET__FIELD_NAME = WrapperField("DATA_TYPE_NAME_SET", FieldType.STRING)
304
+ DESCRIPTION__FIELD_NAME = WrapperField("DESCRIPTION", FieldType.STRING)
305
+ ENB_ENTRY_TYPE__FIELD_NAME = WrapperField("ENB_ENTRY_TYPE", FieldType.STRING)
306
+ EXPERIMENT_ENTRY_NAME__FIELD_NAME = WrapperField("EXPERIMENT_ENTRY_NAME", FieldType.STRING)
307
+ GUID__FIELD_NAME = WrapperField("GUID", FieldType.STRING)
308
+ ICON_COLOR__FIELD_NAME = WrapperField("ICON_COLOR", FieldType.STRING)
309
+ ICON_GUID__FIELD_NAME = WrapperField("ICON_GUID", FieldType.STRING)
310
+ IS_RETRY_ON_FAILURE__FIELD_NAME = WrapperField("IS_RETRY_ON_FAILURE", FieldType.BOOLEAN)
311
+ IS_TRANSACTIONAL__FIELD_NAME = WrapperField("IS_TRANSACTIONAL", FieldType.BOOLEAN)
312
+ LINE_1_TEXT__FIELD_NAME = WrapperField("LINE_1_TEXT", FieldType.STRING)
313
+ LINE_2_TEXT__FIELD_NAME = WrapperField("LINE_2_TEXT", FieldType.STRING)
314
+ PLUGIN_ORDER__FIELD_NAME = WrapperField("PLUGIN_ORDER", FieldType.INTEGER)
315
+ PLUGIN_POINT__FIELD_NAME = WrapperField("PLUGIN_POINT", FieldType.STRING)
316
+ SECTION_NAME_PATH__FIELD_NAME = WrapperField("SECTION_NAME_PATH", FieldType.STRING)
317
+ TEMPLATE_NAME__FIELD_NAME = WrapperField("TEMPLATE_NAME", FieldType.STRING)
318
+ WEBHOOK_URL__FIELD_NAME = WrapperField("WEBHOOK_URL", FieldType.STRING)
319
+
320
+
321
+ class VeloxWebhookExecutionPseudoDef:
322
+ DATA_TYPE_NAME: str = "VELOXWEBHOOK_EXECUTION"
323
+ EXECUTION_TIMESTAMP__FIELD_NAME = WrapperField("EXECUTION_TIMESTAMP", FieldType.DATE)
324
+ EXECUTION_USERNAME__FIELD_NAME = WrapperField("EXECUTION_USERNAME", FieldType.STRING)
325
+ GUID__FIELD_NAME = WrapperField("GUID", FieldType.STRING)
326
+ LAST_ATTEMPT_NUMBER__FIELD_NAME = WrapperField("LAST_ATTEMPT_NUMBER", FieldType.INTEGER)
327
+ LAST_ATTEMPT_RESULT__FIELD_NAME = WrapperField("LAST_ATTEMPT_RESULT", FieldType.STRING)
328
+ REQUEST_BODY__FIELD_NAME = WrapperField("REQUEST_BODY", FieldType.STRING)
329
+ WEBHOOK_GUID__FIELD_NAME = WrapperField("WEBHOOK_GUID", FieldType.STRING)
330
+ WEBHOOK_URL__FIELD_NAME = WrapperField("WEBHOOK_URL", FieldType.STRING)
331
+
332
+
333
+ class VeloxWebhookExecutionAttemptPseudoDef:
334
+ DATA_TYPE_NAME: str = "VELOXWEBHOOK_EXECUTION_ATTEMPT"
335
+ ATTEMPT_DURATION__FIELD_NAME = WrapperField("ATTEMPT_DURATION", FieldType.INTEGER)
336
+ ATTEMPT_NUMBER__FIELD_NAME = WrapperField("ATTEMPT_NUMBER", FieldType.INTEGER)
337
+ ATTEMPT_RESULT__FIELD_NAME = WrapperField("ATTEMPT_RESULT", FieldType.STRING)
338
+ ATTEMPT_TIMESTAMP__FIELD_NAME = WrapperField("ATTEMPT_TIMESTAMP", FieldType.DATE)
339
+ EXECUTION_GUID__FIELD_NAME = WrapperField("EXECUTION_GUID", FieldType.STRING)
340
+ GUID__FIELD_NAME = WrapperField("GUID", FieldType.STRING)
341
+ RESPONSE_BODY__FIELD_NAME = WrapperField("RESPONSE_BODY", FieldType.STRING)
342
+ RESPONSE_CODE__FIELD_NAME = WrapperField("RESPONSE_CODE", FieldType.INTEGER)
343
+ WEBHOOK_GUID__FIELD_NAME = WrapperField("WEBHOOK_GUID", FieldType.STRING)
344
+ WEBHOOK_URL__FIELD_NAME = WrapperField("WEBHOOK_URL", FieldType.STRING)
345
+
346
+
347
+ class VeloxWebhookExecutionLogPseudoDef:
348
+ DATA_TYPE_NAME: str = "VELOXWEBHOOK_EXECUTION_LOG"
349
+ ATTEMPT_GUID__FIELD_NAME = WrapperField("ATTEMPT_GUID", FieldType.STRING)
350
+ LOG_LEVEL__FIELD_NAME = WrapperField("LOG_LEVEL", FieldType.STRING)
351
+ LOG_LINE_NUM__FIELD_NAME = WrapperField("LOG_LINE_NUM", FieldType.INTEGER)
352
+ LOG_MESSAGE__FIELD_NAME = WrapperField("LOG_MESSAGE", FieldType.STRING)
353
+ LOG_TIMESTAMP__FIELD_NAME = WrapperField("LOG_TIMESTAMP", FieldType.DATE)
354
+
355
+
356
+ class VeloxRuleCostPseudoDef:
357
+ DATA_TYPE_NAME: str = "VELOX_RULE_COST"
358
+ ACTION_COST__FIELD_NAME = WrapperField("ACTION_COST", FieldType.LONG)
359
+ ACTION_COUNT__FIELD_NAME = WrapperField("ACTION_COUNT", FieldType.LONG)
360
+ ANCESTOR_DESCENDANT_COUNT__FIELD_NAME = WrapperField("ANCESTOR_DESCENDANT_COUNT", FieldType.LONG)
361
+ PARENT_CHILD_COUNT__FIELD_NAME = WrapperField("PARENT_CHILD_COUNT", FieldType.LONG)
362
+ PROCESSING_TIME__FIELD_NAME = WrapperField("PROCESSING_TIME", FieldType.LONG)
363
+ RULE_GUID__FIELD_NAME = WrapperField("RULE_GUID", FieldType.STRING)
364
+ SOURCE_RECORD_COUNT__FIELD_NAME = WrapperField("SOURCE_RECORD_COUNT", FieldType.LONG)
365
+ TIMESTAMP__FIELD_NAME = WrapperField("TIMESTAMP", FieldType.DATE)
366
+ TOTAL_COST__FIELD_NAME = WrapperField("TOTAL_COST", FieldType.LONG)
367
+ TRANSACTION_GUID__FIELD_NAME = WrapperField("TRANSACTION_GUID", FieldType.STRING)
368
+ USERNAME__FIELD_NAME = WrapperField("USERNAME", FieldType.STRING)
369
+
370
+
371
+ class VeloxConversationPseudoDef:
372
+ DATA_TYPE_NAME: str = "VeloxConversation"
373
+ CONVERSATION_DESCRIPTION__FIELD_NAME = WrapperField("ConversationDescription", FieldType.STRING)
374
+ CONVERSATION_GUID__FIELD_NAME = WrapperField("ConversationGuid", FieldType.STRING)
375
+ CONVERSATION_NAME__FIELD_NAME = WrapperField("ConversationName", FieldType.STRING)
376
+ CREATED_BY__FIELD_NAME = WrapperField("CreatedBy", FieldType.STRING)
377
+ DATE_CREATED__FIELD_NAME = WrapperField("DateCreated", FieldType.DATE)
378
+ SERVER_PLUGIN_PATH__FIELD_NAME = WrapperField("Server_Plugin_Path", FieldType.STRING)
379
+
380
+
381
+ class VeloxConversationMessagePseudoDef:
382
+ DATA_TYPE_NAME: str = "VeloxConversationMessage"
383
+ CONVERSATION_GUID__FIELD_NAME = WrapperField("ConversationGuid", FieldType.STRING)
384
+ MESSAGE__FIELD_NAME = WrapperField("Message", FieldType.STRING)
385
+ MESSAGE_GUID__FIELD_NAME = WrapperField("MessageGuid", FieldType.STRING)
386
+ MESSAGE_SENDER__FIELD_NAME = WrapperField("MessageSender", FieldType.STRING)
387
+ MESSAGE_TIMESTAMP__FIELD_NAME = WrapperField("MessageTimestamp", FieldType.DATE)
388
+
389
+
390
+ class VeloxScriptPseudoDef:
391
+ DATA_TYPE_NAME: str = "VeloxScript"
392
+ CODE__FIELD_NAME = WrapperField("Code", FieldType.STRING)
393
+ CREATED_BY__FIELD_NAME = WrapperField("CreatedBy", FieldType.STRING)
394
+ DATE_CREATED__FIELD_NAME = WrapperField("DateCreated", FieldType.LONG)
395
+ LAST_MODIFIED_BY__FIELD_NAME = WrapperField("LastModifiedBy", FieldType.STRING)
396
+ LAST_MODIFIED_DATE__FIELD_NAME = WrapperField("LastModifiedDate", FieldType.LONG)
397
+ PATH__FIELD_NAME = WrapperField("Path", FieldType.STRING)
398
+ PLUGIN_DESCRIPTION__FIELD_NAME = WrapperField("PluginDescription", FieldType.STRING)
399
+ PLUGIN_LINE1_TEXT__FIELD_NAME = WrapperField("PluginLine1Text", FieldType.STRING)
400
+ PLUGIN_LINE2_TEXT__FIELD_NAME = WrapperField("PluginLine2Text", FieldType.STRING)
401
+ PLUGIN_ORDER__FIELD_NAME = WrapperField("PluginOrder", FieldType.INTEGER)
402
+ PLUGIN_POINT__FIELD_NAME = WrapperField("PluginPoint", FieldType.STRING)
403
+ PROJECT_GUID__FIELD_NAME = WrapperField("ProjectGuid", FieldType.STRING)
404
+ SCRIPT_GUID__FIELD_NAME = WrapperField("ScriptGuid", FieldType.STRING)
405
+
406
+
407
+ class VeloxScriptProjectPseudoDef:
408
+ DATA_TYPE_NAME: str = "VeloxScriptProject"
409
+ CLASS_PATH__FIELD_NAME = WrapperField("ClassPath", FieldType.STRING)
410
+ CREATED_BY__FIELD_NAME = WrapperField("CreatedBy", FieldType.STRING)
411
+ DATE_CREATED__FIELD_NAME = WrapperField("DateCreated", FieldType.LONG)
412
+ DEPLOYMENT_OUT_OF_DATE__FIELD_NAME = WrapperField("DeploymentOutOfDate", FieldType.BOOLEAN)
413
+ DESCRIPTION__FIELD_NAME = WrapperField("Description", FieldType.STRING)
414
+ PROJECT_GUID__FIELD_NAME = WrapperField("ProjectGuid", FieldType.STRING)
415
+ PROJECT_NAME__FIELD_NAME = WrapperField("ProjectName", FieldType.STRING)
416
+ SCRIPT_LANGUAGE__FIELD_NAME = WrapperField("ScriptLanguage", FieldType.STRING)
417
+
418
+
419
+ class WorkflowPseudoDef:
420
+ DATA_TYPE_NAME: str = "Workflow"
421
+ ALL_ACCESS__FIELD_NAME = WrapperField("AllAccess", FieldType.BOOLEAN)
422
+ CATEGORY__FIELD_NAME = WrapperField("Category", FieldType.STRING)
423
+ CREATED_BY__FIELD_NAME = WrapperField("CreatedBy", FieldType.STRING)
424
+ DATE_CREATED__FIELD_NAME = WrapperField("DateCreated", FieldType.DATE)
425
+ DATE_EDITED__FIELD_NAME = WrapperField("DateEdited", FieldType.DATE)
426
+ DIRECT_LAUNCH__FIELD_NAME = WrapperField("DirectLaunch", FieldType.BOOLEAN)
427
+ EDITED_BY__FIELD_NAME = WrapperField("EditedBy", FieldType.STRING)
428
+ IS_TEMPLATE__FIELD_NAME = WrapperField("IsTemplate", FieldType.BOOLEAN)
429
+ LONG_DESC__FIELD_NAME = WrapperField("LongDesc", FieldType.STRING)
430
+ NAME__FIELD_NAME = WrapperField("Name", FieldType.STRING)
431
+ SHORT_DESC__FIELD_NAME = WrapperField("ShortDesc", FieldType.STRING)
432
+ WORKFLOW_ID__FIELD_NAME = WrapperField("WorkflowId", FieldType.LONG)
433
+ WORKFLOW_VERSION__FIELD_NAME = WrapperField("WorkflowVersion", FieldType.LONG)
434
+
435
+
436
+ class WorkflowOptionPseudoDef:
437
+ DATA_TYPE_NAME: str = "WorkflowOption"
438
+ OPTION_KEY__FIELD_NAME = WrapperField("OptionKey", FieldType.STRING)
439
+ OPTION_VALUE__FIELD_NAME = WrapperField("OptionValue", FieldType.STRING)
440
+ WORKFLOW_ID__FIELD_NAME = WrapperField("WorkflowId", FieldType.LONG)
@@ -23,6 +23,7 @@ from sapiopylib.rest.utils.recordmodel.RecordModelManager import RecordModelInst
23
23
  from sapiopylib.rest.utils.recordmodel.RecordModelWrapper import WrappedType
24
24
  from sapiopylib.rest.utils.recordmodel.properties import Child
25
25
 
26
+ from sapiopycommons.eln.experiment_report_util import ExperimentReportUtil
26
27
  from sapiopycommons.general.aliases import AliasUtil, SapioRecord, ExperimentIdentifier, UserIdentifier, \
27
28
  DataTypeIdentifier, RecordModel
28
29
  from sapiopycommons.general.exceptions import SapioException
@@ -56,9 +57,9 @@ class ExperimentHandler:
56
57
  # additional queries to obtain, but may also be repeatedly accessed. In such cases, cache the information after it
57
58
  # has been requested so that the user doesn't need to worry about caching it themselves.
58
59
  # CR-46341: Replace class variables with instance variables.
59
- __exp_record: DataRecord
60
+ __exp_record: DataRecord | None
60
61
  """The data record for this experiment. Only cached when first accessed."""
61
- __exp_template: ElnTemplate
62
+ __exp_template: ElnTemplate | None
62
63
  """The template for this experiment. Only cached when first accessed."""
63
64
  __exp_options: dict[str, str]
64
65
  """Experiment options for this experiment. Only cached when first accessed."""
@@ -67,9 +68,9 @@ class ExperimentHandler:
67
68
  """Whether this ExperimentHandler has queried the system for all steps in the experiment."""
68
69
  __steps: dict[str, ElnEntryStep]
69
70
  """Steps from this experiment. All steps are cached the first time any individual step is accessed."""
70
- __step_options: dict[ElnEntryStep, dict[str, str]]
71
- """Entry options for each step in this experiment. Only cached for each individual step when they are first accessed.
72
- The cache is updated whenever the entry options for a step are changed by this handler."""
71
+ __step_options: dict[int, dict[str, str]]
72
+ """Entry options for each step in this experiment. All entry options are cached the first time any individual step's
73
+ options are queried. The cache is updated whenever the entry options for a step are changed by this handler."""
73
74
 
74
75
  # Constants
75
76
  __ENTRY_COMPLETE_STATUSES = [ExperimentEntryStatus.Completed, ExperimentEntryStatus.CompletedApproved]
@@ -276,6 +277,7 @@ class ExperimentHandler:
276
277
  """
277
278
  template_id: int | None = self.__eln_exp.template_id
278
279
  if template_id is None:
280
+ self.__exp_template = None
279
281
  if exception_on_none:
280
282
  raise SapioException(f"Experiment with ID {self.__exp_id} has no template ID.")
281
283
  return None
@@ -549,6 +551,39 @@ class ExperimentHandler:
549
551
  data_type: str = AliasUtil.to_data_type_name(data_type)
550
552
  return [x for x in all_steps if data_type in x.get_data_type_names()]
551
553
 
554
+ def get_step_by_option(self, key: str, value: str | None = None) -> ElnEntryStep:
555
+ """
556
+ Retrieve the step in this experiment that contains an entry option with the provided key and value.
557
+ Throws an exception if no entries or multiple entries in the experiment match.
558
+
559
+ :param key: The key of the entry option to match on.
560
+ :param value: The value of the entry option to match on. If not provided, then only matches on key.
561
+ :return: The entry in this experiment that matches the provided entry option key and value.
562
+ """
563
+ steps: list[ElnEntryStep] = self.get_steps_by_option(key, value)
564
+ count: int = len(steps)
565
+ if count != 1:
566
+ option = key + ("::" + value if value is not None else "")
567
+ raise SapioException(f"{('No' if count == 0 else 'Multiple')} entries in this experiment match the "
568
+ f"provided option: {option}")
569
+ return steps[0]
570
+
571
+ def get_steps_by_option(self, key: str, value: str | None = None) -> list[ElnEntryStep]:
572
+ """
573
+ Retrieve every step in this experiment that contains an entry option with the provided key and value.
574
+
575
+ :param key: The key of the entry option to match on.
576
+ :param value: The value of the entry option to match on. If not provided, then only matches on key.
577
+ :return: The entries in this experiment that match the provided entry option key and value.
578
+ """
579
+ ret_list: list[ElnEntryStep] = []
580
+ for step in self.get_all_steps():
581
+ options: dict[str, str] = self.get_step_options(step)
582
+ if key in options:
583
+ if value is None or options[key] == value:
584
+ ret_list.append(step)
585
+ return ret_list
586
+
552
587
  def get_step_records(self, step: Step) -> list[DataRecord]:
553
588
  """
554
589
  Query for the data records for the given step. The returned records are not cached by the ExperimentHandler.
@@ -601,6 +636,9 @@ class ExperimentHandler:
601
636
  if not records:
602
637
  return
603
638
  dt: str = AliasUtil.to_singular_data_type_name(records)
639
+ if ElnBaseDataType.is_base_data_type(dt):
640
+ raise SapioException(f"{dt} is an ELN data type. This function call has no effect on ELN data types. "
641
+ f"Use add_eln_rows or add_sample_details instead.")
604
642
  if dt != step.get_data_type_names()[0]:
605
643
  raise SapioException(f"Cannot add {dt} records to entry {step.get_name()} of type "
606
644
  f"{step.get_data_type_names()[0]}.")
@@ -625,6 +663,9 @@ class ExperimentHandler:
625
663
  if not records:
626
664
  return
627
665
  dt: str = AliasUtil.to_singular_data_type_name(records)
666
+ if ElnBaseDataType.is_base_data_type(dt):
667
+ raise SapioException(f"{dt} is an ELN data type. This function call has no effect on ELN data types. "
668
+ f"Use remove_eln_rows or remove_sample_details instead.")
628
669
  if dt != step.get_data_type_names()[0]:
629
670
  raise SapioException(f"Cannot remove {dt} records from entry {step.get_name()} of type "
630
671
  f"{step.get_data_type_names()[0]}.")
@@ -653,6 +694,9 @@ class ExperimentHandler:
653
694
  step = self.__to_eln_step(step)
654
695
  if records:
655
696
  dt: str = AliasUtil.to_singular_data_type_name(records)
697
+ if ElnBaseDataType.is_base_data_type(dt):
698
+ raise SapioException(f"{dt} is an ELN data type. This function call has no effect on ELN data types. "
699
+ f"Use add_eln_rows or add_sample_details instead.")
656
700
  if dt != step.get_data_type_names()[0]:
657
701
  raise SapioException(f"Cannot set {dt} records for entry {step.get_name()} of type "
658
702
  f"{step.get_data_type_names()[0]}.")
@@ -745,7 +789,7 @@ class ExperimentHandler:
745
789
  raise SapioException("The provided step is not an ELN data type entry.")
746
790
  if not records:
747
791
  return
748
- record_dt: str = AliasUtil.to_singular_data_type_name(records)
792
+ record_dt: str = AliasUtil.to_singular_data_type_name(records, False)
749
793
  if record_dt != dt:
750
794
  raise SapioException(f"Cannot remove {dt} records from entry {step.get_name()} of type "
751
795
  f"{step.get_data_type_names()[0]}.")
@@ -966,7 +1010,7 @@ class ExperimentHandler:
966
1010
  if clear_template_item_fulfilled_timestamp is True:
967
1011
  entry.template_item_fulfilled_timestamp = None
968
1012
  if entry_options_map is not None:
969
- self.__step_options.update({step: entry_options_map})
1013
+ self.__step_options.update({step.get_id(): entry_options_map})
970
1014
 
971
1015
  def get_step_option(self, step: Step, option: str) -> str:
972
1016
  """
@@ -996,8 +1040,8 @@ class ExperimentHandler:
996
1040
  list of steps in the experiment and caches them.
997
1041
 
998
1042
  Getting the step options requires a webservice query, which is made the first time any step option
999
- method is called for a specific step. The step options are cached so that subsequent calls of this
1000
- method for that step don't make a webservice call.
1043
+ method is called for any step in this experiment. The step options are cached so that subsequent calls of this
1044
+ method don't make a webservice call.
1001
1045
 
1002
1046
  :param step:
1003
1047
  The step to get the options of.
@@ -1005,7 +1049,10 @@ class ExperimentHandler:
1005
1049
  If given a name, throws an exception if no step of the given name exists in the experiment.
1006
1050
  :return: The map of options for the input step.
1007
1051
  """
1008
- return self.__get_step_options(step)
1052
+ step = self.__to_eln_step(step)
1053
+ if step not in self.__step_options:
1054
+ self.__step_options.update(ExperimentReportUtil.get_experiment_entry_options(self.user, self.get_all_steps()))
1055
+ return self.__step_options[step.get_id()]
1009
1056
 
1010
1057
  def add_step_options(self, step: Step, mapping: Mapping[str, str]):
1011
1058
  """
@@ -1175,16 +1222,3 @@ class ExperimentHandler:
1175
1222
  return self.__exp_options
1176
1223
  self.__exp_options = self.__eln_man.get_notebook_experiment_options(self.__exp_id)
1177
1224
  return self.__exp_options
1178
-
1179
- def __get_step_options(self, step: Step) -> dict[str, str]:
1180
- """
1181
- Cache the options for the input step if they haven't been cached yet.
1182
-
1183
- :return: The entry options for the input step.
1184
- """
1185
- step = self.__to_eln_step(step)
1186
- if step in self.__step_options:
1187
- return self.__step_options.get(step)
1188
- options: dict[str, str] = step.get_options()
1189
- self.__step_options.update({step: options})
1190
- return options