sapiopycommons 2025.3.21a458__py3-none-any.whl → 2025.3.25a459__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.
- sapiopycommons/ai/__init__.py +0 -0
- sapiopycommons/ai/tool_of_tools.py +917 -0
- sapiopycommons/callbacks/callback_util.py +25 -17
- sapiopycommons/customreport/auto_pagers.py +28 -18
- sapiopycommons/datatype/attachment_util.py +4 -2
- sapiopycommons/datatype/data_fields.py +22 -0
- sapiopycommons/eln/experiment_handler.py +1112 -184
- sapiopycommons/eln/experiment_report_util.py +8 -3
- sapiopycommons/eln/experiment_tags.py +7 -0
- sapiopycommons/eln/plate_designer.py +159 -59
- sapiopycommons/general/html_formatter.py +456 -0
- sapiopycommons/general/sapio_links.py +12 -4
- sapiopycommons/processtracking/custom_workflow_handler.py +42 -27
- sapiopycommons/recordmodel/record_handler.py +187 -130
- sapiopycommons/rules/eln_rule_handler.py +33 -29
- sapiopycommons/rules/on_save_rule_handler.py +33 -29
- {sapiopycommons-2025.3.21a458.dist-info → sapiopycommons-2025.3.25a459.dist-info}/METADATA +1 -1
- {sapiopycommons-2025.3.21a458.dist-info → sapiopycommons-2025.3.25a459.dist-info}/RECORD +20 -16
- {sapiopycommons-2025.3.21a458.dist-info → sapiopycommons-2025.3.25a459.dist-info}/WHEEL +0 -0
- {sapiopycommons-2025.3.21a458.dist-info → sapiopycommons-2025.3.25a459.dist-info}/licenses/LICENSE +0 -0
|
@@ -6,11 +6,12 @@ from sapiopylib.rest.User import SapioUser
|
|
|
6
6
|
from sapiopylib.rest.pojo.DataRecord import DataRecord
|
|
7
7
|
from sapiopylib.rest.pojo.eln.SapioELNEnums import ElnBaseDataType
|
|
8
8
|
from sapiopylib.rest.pojo.webhook.WebhookContext import SapioWebhookContext
|
|
9
|
-
from sapiopylib.rest.utils.recordmodel.
|
|
9
|
+
from sapiopylib.rest.utils.recordmodel.PyRecordModel import PyRecordModel
|
|
10
10
|
from sapiopylib.rest.utils.recordmodel.RecordModelWrapper import WrappedType
|
|
11
11
|
|
|
12
12
|
from sapiopycommons.general.aliases import FieldMap, AliasUtil, DataTypeIdentifier
|
|
13
13
|
from sapiopycommons.general.exceptions import SapioException
|
|
14
|
+
from sapiopycommons.recordmodel.record_handler import RecordHandler
|
|
14
15
|
|
|
15
16
|
|
|
16
17
|
# FR-46064 - Initial port of PyWebhookUtils to sapiopycommons.
|
|
@@ -18,23 +19,23 @@ class ElnRuleHandler:
|
|
|
18
19
|
"""
|
|
19
20
|
A class which helps with the parsing and navigation of the ELN rule result map of a webhook context.
|
|
20
21
|
"""
|
|
21
|
-
|
|
22
|
+
_context: SapioWebhookContext
|
|
22
23
|
"""The context that this handler is working from."""
|
|
23
24
|
|
|
24
|
-
|
|
25
|
-
"""The record
|
|
25
|
+
_rec_handler: RecordHandler
|
|
26
|
+
"""The record handler, used for wrapping the data records as record models."""
|
|
26
27
|
|
|
27
28
|
# Reformatted and cached version of the Velox ELN rule result map for easier handling.
|
|
28
|
-
|
|
29
|
+
_records: dict[str, set[DataRecord]]
|
|
29
30
|
"""A mapping of data type to the set of data records from the context that match that data type."""
|
|
30
|
-
|
|
31
|
+
_entry_to_records: dict[str, dict[str, set[DataRecord]]]
|
|
31
32
|
"""A mapping of entry name to the sets of data records for that entry, each set of records being mapped by its
|
|
32
33
|
data type."""
|
|
33
|
-
|
|
34
|
+
_field_maps: dict[str, dict[int, FieldMap]]
|
|
34
35
|
"""A mapping of data type to the field maps from the context that match that data type. In order to prevent
|
|
35
36
|
duplicate field maps, each field map is in a dict keyed by the RecordId field in the field map, since field maps
|
|
36
37
|
are just dictionaries and dictionaries aren't hashable and therefore can't go in a set."""
|
|
37
|
-
|
|
38
|
+
_entry_to_field_maps: dict[str, dict[str, dict[int, FieldMap]]]
|
|
38
39
|
"""A mapping of entry name to the lists of field maps for that entry, each grouping of field maps being mapped by
|
|
39
40
|
its data type."""
|
|
40
41
|
|
|
@@ -59,8 +60,8 @@ class ElnRuleHandler:
|
|
|
59
60
|
|
|
60
61
|
if context.velox_eln_rule_result_map is None:
|
|
61
62
|
raise SapioException("No Velox ELN rule result map in context for ElnRuleHandler to parse.")
|
|
62
|
-
self.
|
|
63
|
-
self.
|
|
63
|
+
self._context = context
|
|
64
|
+
self._rec_handler = RecordHandler(context)
|
|
64
65
|
self.__cache_records()
|
|
65
66
|
|
|
66
67
|
def __cache_records(self) -> None:
|
|
@@ -70,10 +71,10 @@ class ElnRuleHandler:
|
|
|
70
71
|
from to another dict that maps the data types to the records of that type.
|
|
71
72
|
Doesn't cache any relationship info from the VeloxRuleType of the rule results.
|
|
72
73
|
"""
|
|
73
|
-
self.
|
|
74
|
-
self.
|
|
74
|
+
self._records = {}
|
|
75
|
+
self._entry_to_records = {}
|
|
75
76
|
# Each entry in the context has a list of results for that entry.
|
|
76
|
-
for entry, entry_results in self.
|
|
77
|
+
for entry, entry_results in self._context.velox_eln_rule_result_map.items():
|
|
77
78
|
# Keep track of the records for this specific entry.
|
|
78
79
|
entry_dict: dict[str, set[DataRecord]] = {}
|
|
79
80
|
# Entry results consist of a record ID of the record in the entry and a list of results tied to that record.
|
|
@@ -89,16 +90,16 @@ class ElnRuleHandler:
|
|
|
89
90
|
if ElnBaseDataType.is_eln_type(data_type):
|
|
90
91
|
data_type = ElnBaseDataType.get_base_type(data_type).data_type_name
|
|
91
92
|
# Update the list of records of this type that exist so far globally.
|
|
92
|
-
self.
|
|
93
|
+
self._records.setdefault(data_type, set()).add(record)
|
|
93
94
|
# Do the same for the list of records of this type for this specific entry.
|
|
94
95
|
entry_dict.setdefault(data_type, set()).add(record)
|
|
95
96
|
# Update the records for this entry.
|
|
96
|
-
self.
|
|
97
|
+
self._entry_to_records.update({entry: entry_dict})
|
|
97
98
|
|
|
98
|
-
self.
|
|
99
|
-
self.
|
|
99
|
+
self._field_maps = {}
|
|
100
|
+
self._entry_to_field_maps = {}
|
|
100
101
|
# Repeat the same thing for the field map results.
|
|
101
|
-
for entry, entry_results in self.
|
|
102
|
+
for entry, entry_results in self._context.velox_eln_rule_field_map_result_map.items():
|
|
102
103
|
entry_dict: dict[str, dict[int, FieldMap]] = {}
|
|
103
104
|
for record_result in entry_results:
|
|
104
105
|
for result in record_result.velox_type_rule_field_map_result_list:
|
|
@@ -107,23 +108,23 @@ class ElnRuleHandler:
|
|
|
107
108
|
data_type = ElnBaseDataType.get_base_type(data_type).data_type_name
|
|
108
109
|
for field_map in result.field_map_list:
|
|
109
110
|
rec_id: int = field_map.get("RecordId")
|
|
110
|
-
self.
|
|
111
|
+
self._field_maps.setdefault(data_type, {}).update({rec_id: field_map})
|
|
111
112
|
entry_dict.setdefault(data_type, {}).update({rec_id: field_map})
|
|
112
|
-
self.
|
|
113
|
+
self._entry_to_field_maps.update({entry: entry_dict})
|
|
113
114
|
|
|
114
115
|
def get_entry_names(self) -> list[str]:
|
|
115
116
|
"""
|
|
116
117
|
:return: A list of the entry names that may be used with the get_records and get_models functions. These are the
|
|
117
118
|
entries from the experiment that the records in the rule context originate from.
|
|
118
119
|
"""
|
|
119
|
-
return list(self.
|
|
120
|
+
return list(self._entry_to_records.keys())
|
|
120
121
|
|
|
121
122
|
def get_field_maps_entry_names(self) -> list[str]:
|
|
122
123
|
"""
|
|
123
124
|
:return: A list of the entry names that may be used with the get_field_maps function. These are the
|
|
124
125
|
entries from the experiment that the field maps in the rule context originate from.
|
|
125
126
|
"""
|
|
126
|
-
return list(self.
|
|
127
|
+
return list(self._entry_to_field_maps.keys())
|
|
127
128
|
|
|
128
129
|
def get_records(self, data_type: DataTypeIdentifier, entry: str | None = None) -> list[DataRecord]:
|
|
129
130
|
"""
|
|
@@ -137,7 +138,7 @@ class ElnRuleHandler:
|
|
|
137
138
|
:return: The records from the context that match the input parameters.
|
|
138
139
|
"""
|
|
139
140
|
data_type: str = AliasUtil.to_data_type_name(data_type)
|
|
140
|
-
records: dict[str, set[DataRecord]] = self.
|
|
141
|
+
records: dict[str, set[DataRecord]] = self._entry_to_records.get(entry, {}) if entry else self._records
|
|
141
142
|
return list(records.get(data_type, []))
|
|
142
143
|
|
|
143
144
|
# FR-46701: Add functions to the rule handlers for accessing the field maps of inaccessible records in the context.
|
|
@@ -158,19 +159,22 @@ class ElnRuleHandler:
|
|
|
158
159
|
:return: The field maps from the context that match the input parameters.
|
|
159
160
|
"""
|
|
160
161
|
data_type: str = AliasUtil.to_data_type_name(data_type)
|
|
161
|
-
field_maps: dict[str, dict[int, FieldMap]] = self.
|
|
162
|
+
field_maps: dict[str, dict[int, FieldMap]] = self._entry_to_field_maps.get(entry, {}) if entry else self._field_maps
|
|
162
163
|
return list(field_maps.get(data_type, {}).values())
|
|
163
164
|
|
|
164
|
-
|
|
165
|
+
# CR-47491: Support providing a data type name string to receive PyRecordModels instead of requiring a WrapperType.
|
|
166
|
+
def get_models(self, wrapper_type: type[WrappedType] | str, entry: str | None = None) \
|
|
167
|
+
-> list[WrappedType] | list[PyRecordModel]:
|
|
165
168
|
"""
|
|
166
169
|
Get record models from the cached context with the given data type. Capable of being filtered to searching
|
|
167
170
|
within the context of an entry name. If the given data type or entry does not exist in the context,
|
|
168
171
|
returns an empty list.
|
|
169
172
|
|
|
170
|
-
:param wrapper_type: The record model wrapper to
|
|
173
|
+
:param wrapper_type: The record model wrapper or data type name of the record to get from the context.
|
|
171
174
|
:param entry: The name of the entry to grab the records from. If None, returns the records that match the data
|
|
172
175
|
type from every entry. If an entry is provided, but it does not exist in the context, returns an empty list.
|
|
173
|
-
:return: The record models from the context that match the input parameters.
|
|
176
|
+
:return: The record models from the context that match the input parameters. If a data type name was used
|
|
177
|
+
instead of a model wrapper, then the returned records will be PyRecordModels instead of WrappedRecordModels.
|
|
174
178
|
"""
|
|
175
|
-
dt: str =
|
|
176
|
-
return self.
|
|
179
|
+
dt: str = AliasUtil.to_data_type_name(wrapper_type)
|
|
180
|
+
return self._rec_handler.wrap_models(self.get_records(dt, entry), wrapper_type)
|
|
@@ -6,11 +6,12 @@ from sapiopylib.rest.User import SapioUser
|
|
|
6
6
|
from sapiopylib.rest.pojo.DataRecord import DataRecord
|
|
7
7
|
from sapiopylib.rest.pojo.eln.SapioELNEnums import ElnBaseDataType
|
|
8
8
|
from sapiopylib.rest.pojo.webhook.WebhookContext import SapioWebhookContext
|
|
9
|
-
from sapiopylib.rest.utils.recordmodel.
|
|
9
|
+
from sapiopylib.rest.utils.recordmodel.PyRecordModel import PyRecordModel
|
|
10
10
|
from sapiopylib.rest.utils.recordmodel.RecordModelWrapper import WrappedType
|
|
11
11
|
|
|
12
12
|
from sapiopycommons.general.aliases import FieldMap, DataTypeIdentifier, AliasUtil
|
|
13
13
|
from sapiopycommons.general.exceptions import SapioException
|
|
14
|
+
from sapiopycommons.recordmodel.record_handler import RecordHandler
|
|
14
15
|
|
|
15
16
|
|
|
16
17
|
# FR-46064 - Initial port of PyWebhookUtils to sapiopycommons.
|
|
@@ -18,23 +19,23 @@ class OnSaveRuleHandler:
|
|
|
18
19
|
"""
|
|
19
20
|
A class which helps with the parsing and navigation of the on save rule result map of a webhook context.
|
|
20
21
|
"""
|
|
21
|
-
|
|
22
|
+
_context: SapioWebhookContext
|
|
22
23
|
"""The context that this handler is working from."""
|
|
23
24
|
|
|
24
|
-
|
|
25
|
-
"""The record
|
|
25
|
+
_rec_handler: RecordHandler
|
|
26
|
+
"""The record handler, used for wrapping the data records as record models."""
|
|
26
27
|
|
|
27
28
|
# Reformatted and cached version of the Velox on save rule result map for easier handling.
|
|
28
|
-
|
|
29
|
+
_records: dict[str, set[DataRecord]]
|
|
29
30
|
"""A mapping of data type to the set of data records from the context that match that data type."""
|
|
30
|
-
|
|
31
|
+
_base_id_to_records: dict[int, dict[str, set[DataRecord]]]
|
|
31
32
|
"""A mapping of record IDs of records in the context.data_record_list to the sets of data records related to that
|
|
32
33
|
record, each set of records being mapped by its data type."""
|
|
33
|
-
|
|
34
|
+
_field_maps: dict[str, dict[int, FieldMap]]
|
|
34
35
|
"""A mapping of data type to the field maps from the context that match that data type. In order to prevent
|
|
35
36
|
duplicate field maps, each field map is in a dict keyed by the RecordId field in the field map, since field maps
|
|
36
37
|
are just dictionaries and dictionaries aren't hashable and therefore can't go in a set."""
|
|
37
|
-
|
|
38
|
+
_base_id_to_field_maps: dict[int, dict[str, dict[int, FieldMap]]]
|
|
38
39
|
"""A mapping of record IDs of records in the context.data_record_list to the field maps related to that
|
|
39
40
|
record, each grouping of field maps being mapped by its data type."""
|
|
40
41
|
|
|
@@ -59,8 +60,8 @@ class OnSaveRuleHandler:
|
|
|
59
60
|
|
|
60
61
|
if context.velox_on_save_result_map is None:
|
|
61
62
|
raise SapioException("No Velox on save rule result map in context for OnSaveRuleHandler to parse.")
|
|
62
|
-
self.
|
|
63
|
-
self.
|
|
63
|
+
self._context = context
|
|
64
|
+
self._rec_handler = RecordHandler(context)
|
|
64
65
|
self.__cache_records()
|
|
65
66
|
|
|
66
67
|
def __cache_records(self) -> None:
|
|
@@ -69,10 +70,10 @@ class OnSaveRuleHandler:
|
|
|
69
70
|
each record to a set of all records of that data type. The other cache maps the record ID that the records relate
|
|
70
71
|
to with another dict that maps the data types to the records of that type. Doesn't cache any relationship info.
|
|
71
72
|
"""
|
|
72
|
-
self.
|
|
73
|
-
self.
|
|
73
|
+
self._records = {}
|
|
74
|
+
self._base_id_to_records = {}
|
|
74
75
|
# Each record ID in the context has a list of results for that record.
|
|
75
|
-
for record_id, rule_results in self.
|
|
76
|
+
for record_id, rule_results in self._context.velox_on_save_result_map.items():
|
|
76
77
|
# Keep track of the records for this specific record ID.
|
|
77
78
|
id_dict: dict[str, set[DataRecord]] = {}
|
|
78
79
|
# The list of results for a record consist of a list of data records and a VeloxType that specifies
|
|
@@ -86,16 +87,16 @@ class OnSaveRuleHandler:
|
|
|
86
87
|
if ElnBaseDataType.is_eln_type(data_type):
|
|
87
88
|
data_type = ElnBaseDataType.get_base_type(data_type).data_type_name
|
|
88
89
|
# Update the list of records of this type that exist so far globally.
|
|
89
|
-
self.
|
|
90
|
+
self._records.setdefault(data_type, set()).add(record)
|
|
90
91
|
# Do the same for the list of records of this type that relate to this record ID.
|
|
91
92
|
id_dict.setdefault(data_type, set()).add(record)
|
|
92
93
|
# Update the related records for this record ID.
|
|
93
|
-
self.
|
|
94
|
+
self._base_id_to_records.update({record_id: id_dict})
|
|
94
95
|
|
|
95
|
-
self.
|
|
96
|
-
self.
|
|
96
|
+
self._field_maps = {}
|
|
97
|
+
self._base_id_to_field_maps = {}
|
|
97
98
|
# Repeat the same thing for the field map results.
|
|
98
|
-
for record_id, rule_results in self.
|
|
99
|
+
for record_id, rule_results in self._context.velox_on_save_field_map_result_map.items():
|
|
99
100
|
id_dict: dict[str, dict[int, FieldMap]] = {}
|
|
100
101
|
for record_result in rule_results:
|
|
101
102
|
data_type: str = record_result.velox_type_pojo.data_type_name
|
|
@@ -103,23 +104,23 @@ class OnSaveRuleHandler:
|
|
|
103
104
|
data_type = ElnBaseDataType.get_base_type(data_type).data_type_name
|
|
104
105
|
for field_map in record_result.field_map_list:
|
|
105
106
|
rec_id: int = field_map.get("RecordId")
|
|
106
|
-
self.
|
|
107
|
+
self._field_maps.setdefault(data_type, {}).update({rec_id: field_map})
|
|
107
108
|
id_dict.setdefault(data_type, {}).update({rec_id: field_map})
|
|
108
|
-
self.
|
|
109
|
+
self._base_id_to_field_maps.update({record_id: id_dict})
|
|
109
110
|
|
|
110
111
|
def get_base_record_ids(self) -> list[int]:
|
|
111
112
|
"""
|
|
112
113
|
:return: A list of the record IDs that may be used with the get_records and get_models functions. These are the
|
|
113
114
|
record IDs to the records that caused the rule to trigger.
|
|
114
115
|
"""
|
|
115
|
-
return list(self.
|
|
116
|
+
return list(self._base_id_to_records.keys())
|
|
116
117
|
|
|
117
118
|
def get_field_maps_base_record_ids(self) -> list[int]:
|
|
118
119
|
"""
|
|
119
120
|
:return: A list of the record IDs that may be used with the get_field_maps function. These are the
|
|
120
121
|
record IDs to the records that caused the rule to trigger.
|
|
121
122
|
"""
|
|
122
|
-
return list(self.
|
|
123
|
+
return list(self._base_id_to_field_maps.keys())
|
|
123
124
|
|
|
124
125
|
def get_records(self, data_type: DataTypeIdentifier, record_id: int | None = None) -> list[DataRecord]:
|
|
125
126
|
"""
|
|
@@ -133,7 +134,7 @@ class OnSaveRuleHandler:
|
|
|
133
134
|
:return: The records from the context that match the input parameters.
|
|
134
135
|
"""
|
|
135
136
|
data_type: str = AliasUtil.to_data_type_name(data_type)
|
|
136
|
-
records: dict[str, set[DataRecord]] = self.
|
|
137
|
+
records: dict[str, set[DataRecord]] = self._base_id_to_records.get(record_id, {}) if record_id else self._records
|
|
137
138
|
return list(records.get(data_type, []))
|
|
138
139
|
|
|
139
140
|
# FR-46701: Add functions to the rule handlers for accessing the field maps of inaccessible records in the context.
|
|
@@ -154,19 +155,22 @@ class OnSaveRuleHandler:
|
|
|
154
155
|
:return: The field maps from the context that match the input parameters.
|
|
155
156
|
"""
|
|
156
157
|
data_type: str = AliasUtil.to_data_type_name(data_type)
|
|
157
|
-
field_maps: dict[str, dict[int, FieldMap]] = self.
|
|
158
|
+
field_maps: dict[str, dict[int, FieldMap]] = self._base_id_to_field_maps.get(record_id, {}) if record_id else self._field_maps
|
|
158
159
|
return list(field_maps.get(data_type, {}).values())
|
|
159
160
|
|
|
160
|
-
|
|
161
|
+
# CR-47491: Support providing a data type name string to receive PyRecordModels instead of requiring a WrapperType.
|
|
162
|
+
def get_models(self, wrapper_type: type[WrappedType] | str, record_id: int | None = None) \
|
|
163
|
+
-> list[WrappedType] | list[PyRecordModel]:
|
|
161
164
|
"""
|
|
162
165
|
Get records from the cached context with the given data type. Capable of being filtered to searching within
|
|
163
166
|
the context of a record ID. If the given data type or record ID does not exist in the context,
|
|
164
167
|
returns an empty list.
|
|
165
168
|
|
|
166
|
-
:param wrapper_type: The record model wrapper to
|
|
169
|
+
:param wrapper_type: The record model wrapper or data type name of the record to get from the context.
|
|
167
170
|
:param record_id: The record ID of the base record to search from. If None, returns the records that match the
|
|
168
171
|
data type from ID. If an ID is provided, but it does not exist in the context, returns an empty list.
|
|
169
|
-
:return: The record models from the context that match the input parameters.
|
|
172
|
+
:return: The record models from the context that match the input parameters. If a data type name was used
|
|
173
|
+
instead of a model wrapper, then the returned records will be PyRecordModels instead of WrappedRecordModels.
|
|
170
174
|
"""
|
|
171
|
-
dt: str =
|
|
172
|
-
return self.
|
|
175
|
+
dt: str = AliasUtil.to_data_type_name(wrapper_type)
|
|
176
|
+
return self._rec_handler.wrap_models(self.get_records(dt, record_id), wrapper_type)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.3
|
|
2
2
|
Name: sapiopycommons
|
|
3
|
-
Version: 2025.3.
|
|
3
|
+
Version: 2025.3.25a459
|
|
4
4
|
Summary: Official Sapio Python API Utilities Package
|
|
5
5
|
Project-URL: Homepage, https://github.com/sapiosciences
|
|
6
6
|
Author-email: Jonathan Steck <jsteck@sapiosciences.com>, Yechen Qiao <yqiao@sapiosciences.com>
|
|
@@ -1,23 +1,26 @@
|
|
|
1
1
|
sapiopycommons/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
2
|
+
sapiopycommons/ai/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
3
|
+
sapiopycommons/ai/tool_of_tools.py,sha256=zYmQ4rNX-qYQnc-vNDnYZjtv9JgmQAmVVuHfVOdBF3w,46984
|
|
2
4
|
sapiopycommons/callbacks/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
3
|
-
sapiopycommons/callbacks/callback_util.py,sha256=
|
|
5
|
+
sapiopycommons/callbacks/callback_util.py,sha256=sz76LzD9sVLPMcoOpmzPe1aILGXcpHfyZ-qex8oR11c,130849
|
|
4
6
|
sapiopycommons/callbacks/field_builder.py,sha256=p2XacN99MuKk3ite8GAqstUMpixqugul2CsC4gB83-o,38620
|
|
5
7
|
sapiopycommons/chem/IndigoMolecules.py,sha256=slM2y39zZFHc468c366EqR8T-GYJ24UnM9HWAqWFEwQ,3900
|
|
6
8
|
sapiopycommons/chem/Molecules.py,sha256=5PzRyE1s-Z3nfwh3Y4dCNdQOIJGhog08wyZvgTkKwyU,12384
|
|
7
9
|
sapiopycommons/chem/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
8
10
|
sapiopycommons/customreport/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
9
|
-
sapiopycommons/customreport/auto_pagers.py,sha256=
|
|
11
|
+
sapiopycommons/customreport/auto_pagers.py,sha256=3-XXWrP7r41a_Y-8YLPnfm0s65m4qEEUqu4azX47oPI,14828
|
|
10
12
|
sapiopycommons/customreport/column_builder.py,sha256=0RO53e9rKPZ07C--KcepN6_tpRw_FxF3O9vdG0ilKG8,3014
|
|
11
13
|
sapiopycommons/customreport/custom_report_builder.py,sha256=BlTxZ4t1sfZA2Ciur1EfYvkZxHxJ7ADwYNAe2zwiN0c,7176
|
|
12
14
|
sapiopycommons/customreport/term_builder.py,sha256=PNp71NF1vFxidk5v6uQNi9oQR9KJIk8WfhyntvvZN-U,18573
|
|
13
15
|
sapiopycommons/datatype/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
14
|
-
sapiopycommons/datatype/attachment_util.py,sha256=
|
|
15
|
-
sapiopycommons/datatype/data_fields.py,sha256=
|
|
16
|
+
sapiopycommons/datatype/attachment_util.py,sha256=N-nhsJ0oxa_Ft6Y6VWeNFYLzfuQqsjhHA6_-yIt2wVw,3596
|
|
17
|
+
sapiopycommons/datatype/data_fields.py,sha256=pczUlEcE0TeHEDU0Gkvu7voacSLPXCB7l9UbI1Tb6V0,5656
|
|
16
18
|
sapiopycommons/datatype/pseudo_data_types.py,sha256=6TG7aJxgmUZ8FQkWBcgmbK5oy7AFFNtKOPpi1w1OOYA,27657
|
|
17
19
|
sapiopycommons/eln/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
18
|
-
sapiopycommons/eln/experiment_handler.py,sha256=
|
|
19
|
-
sapiopycommons/eln/experiment_report_util.py,sha256=
|
|
20
|
-
sapiopycommons/eln/
|
|
20
|
+
sapiopycommons/eln/experiment_handler.py,sha256=FeqmjnxN5WyDDstN3_AMSo9r7nQi-5zou4m-3K5JsYM,123363
|
|
21
|
+
sapiopycommons/eln/experiment_report_util.py,sha256=NNNNPVD3_2ZAjoOqCMOnlnmPD0SCjDcgYi453ATSJBs,37027
|
|
22
|
+
sapiopycommons/eln/experiment_tags.py,sha256=7-fpOiSqrjbXmWIJhEhaxMgLsVCPAtKqH8xRzpDVKoE,356
|
|
23
|
+
sapiopycommons/eln/plate_designer.py,sha256=ix2cflz13PAHyu4deS3d5Qd3kQXk0C7IQxBQ2Dm9fEM,13692
|
|
21
24
|
sapiopycommons/files/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
22
25
|
sapiopycommons/files/complex_data_loader.py,sha256=T39veNhvYl6j_uZjIIJ8Mk5Aa7otR5RB-g8XlAdkksA,1421
|
|
23
26
|
sapiopycommons/files/file_bridge.py,sha256=vKbqxPexi15epr_-_qLrEfYoxNxB031mXN92iVtOMqE,9511
|
|
@@ -35,20 +38,21 @@ sapiopycommons/general/audit_log.py,sha256=KQq0PsvukUoE3l6TQb3-vpu5-MbSINpWlnQ9e
|
|
|
35
38
|
sapiopycommons/general/custom_report_util.py,sha256=NwwmejSQLwSbrndEk1gPyFNYk9GZoS7Wrp9ab9moFgw,18014
|
|
36
39
|
sapiopycommons/general/directive_util.py,sha256=7SeQrd2Ye5JHlXZtJZaVGgtaSLdq_Vm9EObuxf44Pz8,3905
|
|
37
40
|
sapiopycommons/general/exceptions.py,sha256=aPlzK1cvxeMU5UsokYlLrIBGltUfJZ7LH8zvLh9DxpI,3233
|
|
41
|
+
sapiopycommons/general/html_formatter.py,sha256=HE3OeGgwOw6x53zGSc4-UzP4-JoOmQIz3pX-DzNVg94,17138
|
|
38
42
|
sapiopycommons/general/popup_util.py,sha256=HKILegU1uCL_6abNlNL0Wn3xgX2JNa_kJeq7e5CZu6Q,31923
|
|
39
|
-
sapiopycommons/general/sapio_links.py,sha256=
|
|
43
|
+
sapiopycommons/general/sapio_links.py,sha256=YkcVKNLrSGoM7tCCXBAsIbIxylctwdcEyhePrRMODe0,2859
|
|
40
44
|
sapiopycommons/general/storage_util.py,sha256=ovmK_jN7v09BoX07XxwShpBUC5WYQOM7dbKV_VeLXJU,8892
|
|
41
45
|
sapiopycommons/general/time_util.py,sha256=jU1urPoZRv6evNucR0-288EyT4PrsDpCr-H1-7BKq9A,12363
|
|
42
46
|
sapiopycommons/multimodal/multimodal.py,sha256=PFaGJPbKvW__tnxb8KkgkJZOKjQdgxF_kGfD5chet1s,6779
|
|
43
47
|
sapiopycommons/multimodal/multimodal_data.py,sha256=0BeVPr9HaC0hNTF1v1phTIKGruvNnwerHsD994qJKBg,15099
|
|
44
48
|
sapiopycommons/processtracking/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
45
|
-
sapiopycommons/processtracking/custom_workflow_handler.py,sha256=
|
|
49
|
+
sapiopycommons/processtracking/custom_workflow_handler.py,sha256=QZVRDUXpHfYIKD9LtaOcOt0Sr3RGDaeGQb-LZYAgkCc,25117
|
|
46
50
|
sapiopycommons/processtracking/endpoints.py,sha256=w5bziI2xC7450M95rCF8JpRwkoni1kEDibyAux9B12Q,10848
|
|
47
51
|
sapiopycommons/recordmodel/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
48
|
-
sapiopycommons/recordmodel/record_handler.py,sha256=
|
|
52
|
+
sapiopycommons/recordmodel/record_handler.py,sha256=aPbR3OS0RlsKOGztY-LZaOmkXKUB8ZTw3qqdJKXwd6U,70872
|
|
49
53
|
sapiopycommons/rules/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
50
|
-
sapiopycommons/rules/eln_rule_handler.py,sha256=
|
|
51
|
-
sapiopycommons/rules/on_save_rule_handler.py,sha256=
|
|
54
|
+
sapiopycommons/rules/eln_rule_handler.py,sha256=1aC88brATcjL1O0Hd2hQ0XNguKsKh8xELXComotk3mQ,10772
|
|
55
|
+
sapiopycommons/rules/on_save_rule_handler.py,sha256=J1YKjOGA1KUTwpnZMa7oIi5QU_4mBJrPygSHNDsMIIA,10539
|
|
52
56
|
sapiopycommons/samples/aliquot.py,sha256=mWOJUqaQh0t3HklNuGdmuV7D5zzXs6fpLwtDdM6_XTo,3018
|
|
53
57
|
sapiopycommons/sftpconnect/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
54
58
|
sapiopycommons/sftpconnect/sftp_builder.py,sha256=lFK3FeXk-sFLefW0hqY8WGUQDeYiGaT6yDACzT_zFgQ,3015
|
|
@@ -56,7 +60,7 @@ sapiopycommons/webhook/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3
|
|
|
56
60
|
sapiopycommons/webhook/webhook_context.py,sha256=D793uLsb1691SalaPnBUk3rOSxn_hYLhdvkaIxjNXss,1909
|
|
57
61
|
sapiopycommons/webhook/webhook_handlers.py,sha256=L0HetSm43NvA5KyW3xbLpGFh2DbAaeZJVtXIEl2fvV8,39689
|
|
58
62
|
sapiopycommons/webhook/webservice_handlers.py,sha256=Y5dHx_UFWFuSqaoPL6Re-fsKYRuxvCWZ8bj6KSZ3jfM,14285
|
|
59
|
-
sapiopycommons-2025.3.
|
|
60
|
-
sapiopycommons-2025.3.
|
|
61
|
-
sapiopycommons-2025.3.
|
|
62
|
-
sapiopycommons-2025.3.
|
|
63
|
+
sapiopycommons-2025.3.25a459.dist-info/METADATA,sha256=IYk0QEYICLPvek_a1d6QVLCreYY_sIzi_L9lk8TnbrI,3143
|
|
64
|
+
sapiopycommons-2025.3.25a459.dist-info/WHEEL,sha256=C2FUgwZgiLbznR-k0b_5k3Ai_1aASOXDss3lzCUsUug,87
|
|
65
|
+
sapiopycommons-2025.3.25a459.dist-info/licenses/LICENSE,sha256=HyVuytGSiAUQ6ErWBHTqt1iSGHhLmlC8fO7jTCuR8dU,16725
|
|
66
|
+
sapiopycommons-2025.3.25a459.dist-info/RECORD,,
|
|
File without changes
|
{sapiopycommons-2025.3.21a458.dist-info → sapiopycommons-2025.3.25a459.dist-info}/licenses/LICENSE
RENAMED
|
File without changes
|