sapiopycommons 2025.7.18a614__py3-none-any.whl → 2025.7.21a626__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 (35) hide show
  1. sapiopycommons/ai/api/plan/tool/proto/tool_pb2.py +16 -14
  2. sapiopycommons/ai/api/plan/tool/proto/tool_pb2.pyi +22 -4
  3. sapiopycommons/ai/protobuf_utils.py +1 -0
  4. sapiopycommons/ai/test_client.py +1 -0
  5. sapiopycommons/ai/tool_service_base.py +148 -72
  6. sapiopycommons/callbacks/callback_util.py +665 -332
  7. sapiopycommons/callbacks/field_builder.py +2 -0
  8. sapiopycommons/chem/IndigoMolecules.py +29 -1
  9. sapiopycommons/chem/Molecules.py +3 -3
  10. sapiopycommons/customreport/auto_pagers.py +26 -1
  11. sapiopycommons/customreport/term_builder.py +1 -1
  12. sapiopycommons/datatype/pseudo_data_types.py +349 -326
  13. sapiopycommons/eln/experiment_cache.py +188 -0
  14. sapiopycommons/eln/experiment_handler.py +408 -767
  15. sapiopycommons/eln/experiment_report_util.py +11 -6
  16. sapiopycommons/eln/experiment_step_factory.py +476 -0
  17. sapiopycommons/eln/plate_designer.py +7 -2
  18. sapiopycommons/eln/step_creation.py +236 -0
  19. sapiopycommons/files/file_util.py +7 -5
  20. sapiopycommons/general/accession_service.py +2 -2
  21. sapiopycommons/general/aliases.py +3 -1
  22. sapiopycommons/general/audit_log.py +7 -0
  23. sapiopycommons/general/custom_report_util.py +12 -0
  24. sapiopycommons/general/data_structure_util.py +115 -0
  25. sapiopycommons/processtracking/custom_workflow_handler.py +11 -1
  26. sapiopycommons/processtracking/endpoints.py +27 -0
  27. sapiopycommons/recordmodel/record_handler.py +783 -389
  28. sapiopycommons/rules/eln_rule_handler.py +8 -1
  29. sapiopycommons/rules/on_save_rule_handler.py +8 -1
  30. sapiopycommons/webhook/webhook_handlers.py +9 -4
  31. sapiopycommons/webhook/webservice_handlers.py +2 -2
  32. {sapiopycommons-2025.7.18a614.dist-info → sapiopycommons-2025.7.21a626.dist-info}/METADATA +2 -2
  33. {sapiopycommons-2025.7.18a614.dist-info → sapiopycommons-2025.7.21a626.dist-info}/RECORD +35 -31
  34. {sapiopycommons-2025.7.18a614.dist-info → sapiopycommons-2025.7.21a626.dist-info}/WHEEL +0 -0
  35. {sapiopycommons-2025.7.18a614.dist-info → sapiopycommons-2025.7.21a626.dist-info}/licenses/LICENSE +0 -0
@@ -126,12 +126,16 @@ class ElnRuleHandler:
126
126
  """
127
127
  return list(self._entry_to_field_maps.keys())
128
128
 
129
+ # CR-47529: Add info about HVDT behavior to the docstring of these functions.
129
130
  def get_records(self, data_type: DataTypeIdentifier, entry: str | None = None) -> list[DataRecord]:
130
131
  """
131
132
  Get records from the cached context with the given data type. Capable of being filtered to searching within
132
133
  the context of an entry name. If the given data type or entry does not exist in the context,
133
134
  returns an empty list.
134
135
 
136
+ Note that if you are attempting to retrieve record that are high volume data types and are receiving nothing,
137
+ the HVDTs may have been sent as field maps. Consider using the get_field_maps function if this occurs.
138
+
135
139
  :param data_type: The data type of the records to return.
136
140
  :param entry: The name of the entry to grab the records from. If None, returns the records that match the data
137
141
  type from every entry. If an entry is provided, but it does not exist in the context, returns an empty list.
@@ -150,7 +154,7 @@ class ElnRuleHandler:
150
154
 
151
155
  Field maps will only exist in the context if the data record that the fields are from is no longer accessible
152
156
  to the user. This can occur because the data record was deleted, or because the user does not have access to the
153
- record due to ACL.
157
+ record due to ACL. This can also occur under certain circumstances if the records are HVDTs.
154
158
 
155
159
  :param data_type: The data type of the field maps to return.
156
160
  :param entry: The name of the entry to grab the field maps from. If None, returns the field maps that match the
@@ -170,6 +174,9 @@ class ElnRuleHandler:
170
174
  within the context of an entry name. If the given data type or entry does not exist in the context,
171
175
  returns an empty list.
172
176
 
177
+ Note that if you are attempting to retrieve record that are high volume data types and are receiving nothing,
178
+ the HVDTs may have been sent as field maps. Consider using the get_field_maps function if this occurs.
179
+
173
180
  :param wrapper_type: The record model wrapper or data type name of the record to get from the context.
174
181
  :param entry: The name of the entry to grab the records from. If None, returns the records that match the data
175
182
  type from every entry. If an entry is provided, but it does not exist in the context, returns an empty list.
@@ -122,12 +122,16 @@ class OnSaveRuleHandler:
122
122
  """
123
123
  return list(self._base_id_to_field_maps.keys())
124
124
 
125
+ # CR-47529: Add info about HVDT behavior to the docstring of these functions.
125
126
  def get_records(self, data_type: DataTypeIdentifier, record_id: int | None = None) -> list[DataRecord]:
126
127
  """
127
128
  Get records from the cached context with the given data type. Capable of being filtered to searching within
128
129
  the context of a record ID. If the given data type or record ID does not exist in the context,
129
130
  returns an empty list.
130
131
 
132
+ Note that if you are attempting to retrieve record that are high volume data types and are receiving nothing,
133
+ the HVDTs may have been sent as field maps. Consider using the get_field_maps function if this occurs.
134
+
131
135
  :param data_type: The data type of the records to return.
132
136
  :param record_id: The record ID of the base record to search from. If None, returns the records that match the
133
137
  data type from every ID. If an ID is provided, but it does not exist in the context, returns an empty list.
@@ -146,7 +150,7 @@ class OnSaveRuleHandler:
146
150
 
147
151
  Field maps will only exist in the context if the data record that the fields are from is no longer accessible
148
152
  to the user. This can occur because the data record was deleted, or because the user does not have access to the
149
- record due to ACL.
153
+ record due to ACL. This can also occur under certain circumstances if the records are HVDTs.
150
154
 
151
155
  :param data_type: The data type of the field maps to return.
152
156
  :param record_id: The record ID of the base record to search from. If None, returns the field maps that match
@@ -166,6 +170,9 @@ class OnSaveRuleHandler:
166
170
  the context of a record ID. If the given data type or record ID does not exist in the context,
167
171
  returns an empty list.
168
172
 
173
+ Note that if you are attempting to retrieve record that are high volume data types and are receiving nothing,
174
+ the HVDTs may have been sent as field maps. Consider using the get_field_maps function if this occurs.
175
+
169
176
  :param wrapper_type: The record model wrapper or data type name of the record to get from the context.
170
177
  :param record_id: The record ID of the base record to search from. If None, returns the records that match the
171
178
  data type from ID. If an ID is provided, but it does not exist in the context, returns an empty list.
@@ -7,7 +7,6 @@ import traceback
7
7
  from abc import abstractmethod
8
8
  from logging import Logger
9
9
 
10
- from sapiopylib.rest import UserManagerService, GroupManagerService, MessengerService
11
10
  from sapiopylib.rest.AccessionService import AccessionManager
12
11
  from sapiopylib.rest.CustomReportService import CustomReportManager
13
12
  from sapiopylib.rest.DashboardManager import DashboardManager
@@ -16,10 +15,13 @@ from sapiopylib.rest.DataRecordManagerService import DataRecordManager
16
15
  from sapiopylib.rest.DataService import DataManager
17
16
  from sapiopylib.rest.DataTypeService import DataTypeManager
18
17
  from sapiopylib.rest.ELNService import ElnManager
18
+ from sapiopylib.rest.GroupManagerService import VeloxGroupManager
19
+ from sapiopylib.rest.MessengerService import SapioMessenger
19
20
  from sapiopylib.rest.PicklistService import PickListManager
20
21
  from sapiopylib.rest.ReportManager import ReportManager
21
22
  from sapiopylib.rest.SesssionManagerService import SessionManager
22
23
  from sapiopylib.rest.User import SapioUser
24
+ from sapiopylib.rest.UserManagerService import VeloxUserManager
23
25
  from sapiopylib.rest.WebhookService import AbstractWebhookHandler
24
26
  from sapiopylib.rest.pojo.Message import VeloxLogMessage, VeloxLogLevel
25
27
  from sapiopylib.rest.pojo.webhook.ClientCallbackRequest import PopupType
@@ -85,9 +87,9 @@ class CommonsWebhookHandler(AbstractWebhookHandler):
85
87
  """A class for making requests to the data type webservice endpoints."""
86
88
  eln_man: ElnManager
87
89
  """A class for making requests to the ELN management webservice endpoints."""
88
- group_man: GroupManagerService
90
+ group_man: VeloxGroupManager
89
91
  """A class for making requests to the group management webservice endpoints."""
90
- messenger: MessengerService
92
+ messenger: SapioMessenger
91
93
  """A class for making requests to the message webservice endpoints."""
92
94
  list_man: PickListManager
93
95
  """A class for making requests to the pick list webservice endpoints."""
@@ -95,7 +97,7 @@ class CommonsWebhookHandler(AbstractWebhookHandler):
95
97
  """A class for making requests to the report webservice endpoints."""
96
98
  session_man: SessionManager
97
99
  """A class for making requests to the session management webservice endpoints."""
98
- user_man: UserManagerService
100
+ user_man: VeloxUserManager
99
101
  """A class for making requests to the user management webservice endpoints."""
100
102
 
101
103
  rec_man: RecordModelManager
@@ -220,6 +222,9 @@ class CommonsWebhookHandler(AbstractWebhookHandler):
220
222
  else:
221
223
  self.custom_context = None
222
224
 
225
+ # CR-47526: Set the dialog timeout to 1 hour by default. This can be overridden by the webhook.
226
+ self.callback.set_dialog_timeout(3600)
227
+
223
228
  # Set the default display types, titles, and messages for each type of exception that can display a message.
224
229
  self.default_user_error_display_type = MessageDisplayType.TOASTER_WARNING
225
230
  self.default_critical_error_display_type = MessageDisplayType.DISPLAY_ERROR
@@ -3,7 +3,7 @@ import traceback
3
3
  from abc import abstractmethod, ABC
4
4
  from base64 import b64decode
5
5
  from logging import Logger
6
- from typing import Any
6
+ from typing import Any, Mapping
7
7
 
8
8
  from flask import request, Response, Request
9
9
  from sapiopylib.rest.DataRecordManagerService import DataRecordManager
@@ -122,7 +122,7 @@ class AbstractWebserviceHandler(AbstractWebhookHandler):
122
122
  """
123
123
  pass
124
124
 
125
- def authenticate_user(self, headers: dict[str, str]) -> SapioUser:
125
+ def authenticate_user(self, headers: Mapping[str, str]) -> SapioUser:
126
126
  """
127
127
  Authenticate a user for making requests to a Sapio server using the provided headers. If no user can be
128
128
  authenticated, then an exception will be thrown.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: sapiopycommons
3
- Version: 2025.7.18a614
3
+ Version: 2025.7.21a626
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>
@@ -17,7 +17,7 @@ Classifier: Topic :: Scientific/Engineering :: Bio-Informatics
17
17
  Classifier: Topic :: Software Development :: Libraries :: Python Modules
18
18
  Requires-Python: >=3.10
19
19
  Requires-Dist: databind>=4.5
20
- Requires-Dist: sapiopylib>=2024.5.24.210
20
+ Requires-Dist: sapiopylib>=2025.4.17.264
21
21
  Description-Content-Type: text/markdown
22
22
 
23
23
 
@@ -1,8 +1,8 @@
1
1
  sapiopycommons/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
2
  sapiopycommons/ai/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
3
- sapiopycommons/ai/protobuf_utils.py,sha256=5Y0z_lRVipbHPJcHJf9GosK-ZjAh_I2JI3QwV8iyfKg,24884
4
- sapiopycommons/ai/test_client.py,sha256=8AlRTuy7XUC40aU4SgTQkNc_ZBp_ANhVNEKbUx8ABRM,10430
5
- sapiopycommons/ai/tool_service_base.py,sha256=rKFWDWdCz7NYr6V-crprnXdrOjItWqH-1OFM4vHLSDw,37312
3
+ sapiopycommons/ai/protobuf_utils.py,sha256=8VYGhAdD731Ojy5PTy61PlTcvfEdydkIdX-4rOFPtxM,24911
4
+ sapiopycommons/ai/test_client.py,sha256=PCc5s_-Uo8_CVsB1rpwvHtvXfHKa2iuZnC7VK-9cAoE,10457
5
+ sapiopycommons/ai/tool_service_base.py,sha256=jPcLl8waaXAiCDwTQKgMip4GkAtptdUWA8a7fwxR7Dw,41830
6
6
  sapiopycommons/ai/api/fielddefinitions/proto/fields_pb2.py,sha256=YcZjb_YM-XeLErM8hEC_S7vGMVGvcXAMGs2b-u5zvOE,2377
7
7
  sapiopycommons/ai/api/fielddefinitions/proto/fields_pb2.pyi,sha256=FwtXmNAf7iYGEFm4kbqb04v77jNHbZg18ZmEDhle_bU,1444
8
8
  sapiopycommons/ai/api/fielddefinitions/proto/fields_pb2_grpc.py,sha256=wPImJPdCUZNVEVoUWzsba9kGIXjEKPdUkawP5SnVyiU,932
@@ -21,47 +21,51 @@ sapiopycommons/ai/api/plan/script/proto/script_pb2_grpc.py,sha256=RkShHpe_d5EJHk
21
21
  sapiopycommons/ai/api/plan/tool/proto/entry_pb2.py,sha256=A-ufAWwbJ0odVXBZBQKvke6LYPijPl2dpb2IFRaXmPE,4124
22
22
  sapiopycommons/ai/api/plan/tool/proto/entry_pb2.pyi,sha256=NNBrdHz5PzAuUEXuGgTU4THy9rx8Sr9iGTb65QtVH4Q,4589
23
23
  sapiopycommons/ai/api/plan/tool/proto/entry_pb2_grpc.py,sha256=YKkX2kexERUx4asLCShufSnZhgf339Zk8Xw1FAgLfHQ,924
24
- sapiopycommons/ai/api/plan/tool/proto/tool_pb2.py,sha256=7etun0HS16henGl8AQsPWZ3t4dRpnwBt-ophw5pETR0,7295
25
- sapiopycommons/ai/api/plan/tool/proto/tool_pb2.pyi,sha256=_wDXVJEVctf8eQ3jJZa3gOK0yN8bV3ZugeSeLJ4mloM,16775
24
+ sapiopycommons/ai/api/plan/tool/proto/tool_pb2.py,sha256=fBBLJ5yLnSsJ0clFqkFaLvQwijx4rKztqc9wzZ3FnmU,7767
25
+ sapiopycommons/ai/api/plan/tool/proto/tool_pb2.pyi,sha256=2YmsET5TW6A-7AJm_uLdaa8Dexa5H5WZLNKqipi5Dq8,17733
26
26
  sapiopycommons/ai/api/plan/tool/proto/tool_pb2_grpc.py,sha256=68u5E1ZKha5frP5GuY8Ad-c0c79vBhtfnj5Q4u-8xOY,6982
27
27
  sapiopycommons/ai/api/session/proto/sapio_conn_info_pb2.py,sha256=WKzNi-d5dqeJbmEXUVE5qJ4Qm34HmsqRXRtXih382g8,2100
28
28
  sapiopycommons/ai/api/session/proto/sapio_conn_info_pb2.pyi,sha256=vLYA8Tkzq2AwgVadoUp5vAg4HgGlgga0kzeS3e_XkCQ,1621
29
29
  sapiopycommons/ai/api/session/proto/sapio_conn_info_pb2_grpc.py,sha256=2W0YzT4SfnGTLq98AdvkyNM0n75Tkl8DervPS1ryGao,932
30
30
  sapiopycommons/callbacks/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
31
- sapiopycommons/callbacks/callback_util.py,sha256=sz76LzD9sVLPMcoOpmzPe1aILGXcpHfyZ-qex8oR11c,130849
32
- sapiopycommons/callbacks/field_builder.py,sha256=p2XacN99MuKk3ite8GAqstUMpixqugul2CsC4gB83-o,38620
33
- sapiopycommons/chem/IndigoMolecules.py,sha256=slM2y39zZFHc468c366EqR8T-GYJ24UnM9HWAqWFEwQ,3900
34
- sapiopycommons/chem/Molecules.py,sha256=5PzRyE1s-Z3nfwh3Y4dCNdQOIJGhog08wyZvgTkKwyU,12384
31
+ sapiopycommons/callbacks/callback_util.py,sha256=OuPJ1o6jcDQ7qV-dxrjAkJerGbVI9_9P-xu0r3ODaMM,153008
32
+ sapiopycommons/callbacks/field_builder.py,sha256=rnIP-RJafk3mZlAx1eJ8a0eSW9Ps_L6_WadCmusnENw,38772
33
+ sapiopycommons/chem/IndigoMolecules.py,sha256=7ucCaRMLu1zfH2uPIvXwRTSdpNcS03O1P9p_O-5B4xQ,5110
34
+ sapiopycommons/chem/Molecules.py,sha256=mVqPn32MPMjF0iZas-5MFkS-upIdoW5OB72KKZmJRJA,12523
35
35
  sapiopycommons/chem/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
36
36
  sapiopycommons/customreport/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
37
- sapiopycommons/customreport/auto_pagers.py,sha256=3-XXWrP7r41a_Y-8YLPnfm0s65m4qEEUqu4azX47oPI,14828
37
+ sapiopycommons/customreport/auto_pagers.py,sha256=89p-tik0MhsOplYje6LbAW4WClldpAmb8YXFDoXhIlY,17144
38
38
  sapiopycommons/customreport/column_builder.py,sha256=0RO53e9rKPZ07C--KcepN6_tpRw_FxF3O9vdG0ilKG8,3014
39
39
  sapiopycommons/customreport/custom_report_builder.py,sha256=BlTxZ4t1sfZA2Ciur1EfYvkZxHxJ7ADwYNAe2zwiN0c,7176
40
- sapiopycommons/customreport/term_builder.py,sha256=PNp71NF1vFxidk5v6uQNi9oQR9KJIk8WfhyntvvZN-U,18573
40
+ sapiopycommons/customreport/term_builder.py,sha256=1_PGjxNUy5YWim8WJ_HJfiTq6i0D3gLPDxLySlFt30o,18573
41
41
  sapiopycommons/datatype/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
42
42
  sapiopycommons/datatype/attachment_util.py,sha256=N-nhsJ0oxa_Ft6Y6VWeNFYLzfuQqsjhHA6_-yIt2wVw,3596
43
43
  sapiopycommons/datatype/data_fields.py,sha256=pczUlEcE0TeHEDU0Gkvu7voacSLPXCB7l9UbI1Tb6V0,5656
44
- sapiopycommons/datatype/pseudo_data_types.py,sha256=6TG7aJxgmUZ8FQkWBcgmbK5oy7AFFNtKOPpi1w1OOYA,27657
44
+ sapiopycommons/datatype/pseudo_data_types.py,sha256=lAJDnFuStrUP0mK5AuYlFvLerwjEB-ABd6Z4qlCrwJA,40637
45
45
  sapiopycommons/eln/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
46
- sapiopycommons/eln/experiment_handler.py,sha256=FeqmjnxN5WyDDstN3_AMSo9r7nQi-5zou4m-3K5JsYM,123363
47
- sapiopycommons/eln/experiment_report_util.py,sha256=NNNNPVD3_2ZAjoOqCMOnlnmPD0SCjDcgYi453ATSJBs,37027
46
+ sapiopycommons/eln/experiment_cache.py,sha256=Zv4IcsAl95ftO2ul3DRc_Hyno0AfC3OvFV7RYb72ITo,9560
47
+ sapiopycommons/eln/experiment_handler.py,sha256=kMQuccmGyPzc8wYKsds6AZ_VjH9WLjtUY6hsSWXJx6s,98786
48
+ sapiopycommons/eln/experiment_report_util.py,sha256=GLpgwSEPuUqnY1v4oJ1ao60Va-YcgXh7E-cH9YnVeAg,37256
49
+ sapiopycommons/eln/experiment_step_factory.py,sha256=qw9UfLslVzB6dEIZPOZ85XHKpld81RhD4-csM6TgQNg,26099
48
50
  sapiopycommons/eln/experiment_tags.py,sha256=7-fpOiSqrjbXmWIJhEhaxMgLsVCPAtKqH8xRzpDVKoE,356
49
- sapiopycommons/eln/plate_designer.py,sha256=ix2cflz13PAHyu4deS3d5Qd3kQXk0C7IQxBQ2Dm9fEM,13692
51
+ sapiopycommons/eln/plate_designer.py,sha256=XFazSvhTbSy47t80-jc2tyx_-fQ_IUjKd18JQKEFcsY,13939
52
+ sapiopycommons/eln/step_creation.py,sha256=CFkGC-SxwAQpQlcs_obqLAVgmsNxKSGMqMtO_E6IVmw,10171
50
53
  sapiopycommons/files/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
51
54
  sapiopycommons/files/complex_data_loader.py,sha256=T39veNhvYl6j_uZjIIJ8Mk5Aa7otR5RB-g8XlAdkksA,1421
52
55
  sapiopycommons/files/file_bridge.py,sha256=vKbqxPexi15epr_-_qLrEfYoxNxB031mXN92iVtOMqE,9511
53
56
  sapiopycommons/files/file_bridge_handler.py,sha256=SEYDIQhSCmjI6qyLdDJE8JVKSd0WYvF7JvAq_Ahp9Do,25503
54
57
  sapiopycommons/files/file_data_handler.py,sha256=f96MlkMuQhUCi4oLnzJK5AiuElCp5jLI8_sJkZVwpws,36779
55
- sapiopycommons/files/file_util.py,sha256=w4Q7zYJb9YaPxrecmT4RT_OOibKMRP0NI1CyoOLfAP4,31747
58
+ sapiopycommons/files/file_util.py,sha256=djouyGjsYgWzjz2OBRnSeMDgj6NrsJUm1a2J93J8Wco,31915
56
59
  sapiopycommons/files/file_validator.py,sha256=ryg22-93csmRO_Pv0ZpWphNkB74xWZnHyJ23K56qLj0,28761
57
60
  sapiopycommons/files/file_writer.py,sha256=hACVl0duCjP28gJ1NPljkjagNCLod0ygUlPbvUmRDNM,17605
58
61
  sapiopycommons/flowcyto/flow_cyto.py,sha256=vs9WhXXKz3urpjL8QKSk56B-NSmQR3O3x_WFBKoeO10,3227
59
62
  sapiopycommons/flowcyto/flowcyto_data.py,sha256=mYKFuLbtpJ-EsQxLGtu4tNHVlygTxKixgJxJqD68F58,2596
60
63
  sapiopycommons/general/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
61
- sapiopycommons/general/accession_service.py,sha256=QeNGd78Zr08ezWpThTuAkxO4bXusEcp5x9jJRZRwliA,13483
62
- sapiopycommons/general/aliases.py,sha256=alc2R5TOSKbZif3pcGZ706y23Y9F4HQPC-Kj4xJZ_Us,14503
63
- sapiopycommons/general/audit_log.py,sha256=KQq0PsvukUoE3l6TQb3-vpu5-MbSINpWlnQ9e7jojPg,8743
64
- sapiopycommons/general/custom_report_util.py,sha256=NwwmejSQLwSbrndEk1gPyFNYk9GZoS7Wrp9ab9moFgw,18014
64
+ sapiopycommons/general/accession_service.py,sha256=3e__bVs7CYZ1CduLlGA9plnK7nCtdy7GXjCrNObPFgo,13484
65
+ sapiopycommons/general/aliases.py,sha256=VwnWf_P803pcteoAIs0DkLScVChCS5XNgryTp8FzaNc,14696
66
+ sapiopycommons/general/audit_log.py,sha256=sQAMcJx0cNkgZm7nTZSaGPxWvHG0_x6dBtU0jESavb4,9131
67
+ sapiopycommons/general/custom_report_util.py,sha256=9elLEUSgfM0gli8nRPz1uYkhaXN4Vnx3piSiNHv5IBs,19156
68
+ sapiopycommons/general/data_structure_util.py,sha256=fbQR_Fh4Scg67IpFPbQW9wVLw1oxlYxqp4LjBRTpjgU,4702
65
69
  sapiopycommons/general/directive_util.py,sha256=7SeQrd2Ye5JHlXZtJZaVGgtaSLdq_Vm9EObuxf44Pz8,3905
66
70
  sapiopycommons/general/exceptions.py,sha256=aPlzK1cvxeMU5UsokYlLrIBGltUfJZ7LH8zvLh9DxpI,3233
67
71
  sapiopycommons/general/html_formatter.py,sha256=HE3OeGgwOw6x53zGSc4-UzP4-JoOmQIz3pX-DzNVg94,17138
@@ -72,21 +76,21 @@ sapiopycommons/general/time_util.py,sha256=jU1urPoZRv6evNucR0-288EyT4PrsDpCr-H1-
72
76
  sapiopycommons/multimodal/multimodal.py,sha256=PFaGJPbKvW__tnxb8KkgkJZOKjQdgxF_kGfD5chet1s,6779
73
77
  sapiopycommons/multimodal/multimodal_data.py,sha256=0BeVPr9HaC0hNTF1v1phTIKGruvNnwerHsD994qJKBg,15099
74
78
  sapiopycommons/processtracking/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
75
- sapiopycommons/processtracking/custom_workflow_handler.py,sha256=QZVRDUXpHfYIKD9LtaOcOt0Sr3RGDaeGQb-LZYAgkCc,25117
76
- sapiopycommons/processtracking/endpoints.py,sha256=w5bziI2xC7450M95rCF8JpRwkoni1kEDibyAux9B12Q,10848
79
+ sapiopycommons/processtracking/custom_workflow_handler.py,sha256=eYKdYlwo8xx-6AkB_iPUBNV9yDoNvW2h_Sm3i8JpmRU,25844
80
+ sapiopycommons/processtracking/endpoints.py,sha256=5AJLbhRKQsOeeOdQa888xcCJZD5aavxD-DHZ36Qob_M,12548
77
81
  sapiopycommons/recordmodel/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
78
- sapiopycommons/recordmodel/record_handler.py,sha256=aPbR3OS0RlsKOGztY-LZaOmkXKUB8ZTw3qqdJKXwd6U,70872
82
+ sapiopycommons/recordmodel/record_handler.py,sha256=WxmgrWQ3nX3eVZSHJY7e8fj7CI7azSyEyovmYcy9098,95021
79
83
  sapiopycommons/rules/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
80
- sapiopycommons/rules/eln_rule_handler.py,sha256=1aC88brATcjL1O0Hd2hQ0XNguKsKh8xELXComotk3mQ,10772
81
- sapiopycommons/rules/on_save_rule_handler.py,sha256=J1YKjOGA1KUTwpnZMa7oIi5QU_4mBJrPygSHNDsMIIA,10539
84
+ sapiopycommons/rules/eln_rule_handler.py,sha256=MnE-eSl1kNfaXWFi9elTOC9V2fdUzrwWTvCHUprC8_I,11388
85
+ sapiopycommons/rules/on_save_rule_handler.py,sha256=fkNIlslAZZ0BUrRiwecyvf42JBR8FpCCQ6DBNKXP2jE,11155
82
86
  sapiopycommons/samples/aliquot.py,sha256=mWOJUqaQh0t3HklNuGdmuV7D5zzXs6fpLwtDdM6_XTo,3018
83
87
  sapiopycommons/sftpconnect/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
84
88
  sapiopycommons/sftpconnect/sftp_builder.py,sha256=lFK3FeXk-sFLefW0hqY8WGUQDeYiGaT6yDACzT_zFgQ,3015
85
89
  sapiopycommons/webhook/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
86
90
  sapiopycommons/webhook/webhook_context.py,sha256=D793uLsb1691SalaPnBUk3rOSxn_hYLhdvkaIxjNXss,1909
87
- sapiopycommons/webhook/webhook_handlers.py,sha256=L0HetSm43NvA5KyW3xbLpGFh2DbAaeZJVtXIEl2fvV8,39689
88
- sapiopycommons/webhook/webservice_handlers.py,sha256=Y5dHx_UFWFuSqaoPL6Re-fsKYRuxvCWZ8bj6KSZ3jfM,14285
89
- sapiopycommons-2025.7.18a614.dist-info/METADATA,sha256=rlFy7ClFDUE87l9zfvvvN6TJ4_EokvhxZBzJ5D0G7MQ,3143
90
- sapiopycommons-2025.7.18a614.dist-info/WHEEL,sha256=C2FUgwZgiLbznR-k0b_5k3Ai_1aASOXDss3lzCUsUug,87
91
- sapiopycommons-2025.7.18a614.dist-info/licenses/LICENSE,sha256=HyVuytGSiAUQ6ErWBHTqt1iSGHhLmlC8fO7jTCuR8dU,16725
92
- sapiopycommons-2025.7.18a614.dist-info/RECORD,,
91
+ sapiopycommons/webhook/webhook_handlers.py,sha256=7o_wXOruhT9auNh8OfhJAh4WhhiPKij67FMBSpGPICc,39939
92
+ sapiopycommons/webhook/webservice_handlers.py,sha256=tyaYGG1-v_JJrJHZ6cy5mGCxX9z1foLw7pM4MDJlFxs,14297
93
+ sapiopycommons-2025.7.21a626.dist-info/METADATA,sha256=fw9U172ZUMcU0zkGDeuQSLdzA72aPIfKvu5KKFSNaRM,3143
94
+ sapiopycommons-2025.7.21a626.dist-info/WHEEL,sha256=C2FUgwZgiLbznR-k0b_5k3Ai_1aASOXDss3lzCUsUug,87
95
+ sapiopycommons-2025.7.21a626.dist-info/licenses/LICENSE,sha256=HyVuytGSiAUQ6ErWBHTqt1iSGHhLmlC8fO7jTCuR8dU,16725
96
+ sapiopycommons-2025.7.21a626.dist-info/RECORD,,