Skip to content

Commit a96aa8c

Browse files
authored
Merge pull request #161 from mcneilco/ACAS-745
ACAS-745: Add raise_on_linked_data parameter to delete_lot method
2 parents 3cf8cb3 + 63bc2bd commit a96aa8c

File tree

2 files changed

+23
-5
lines changed

2 files changed

+23
-5
lines changed

acasclient/acasclient.py

+14-1
Original file line numberDiff line numberDiff line change
@@ -2247,11 +2247,12 @@ def get_lot_dependencies(self, lot_corp_name, include_linked_lots=True, include_
22472247
resp.raise_for_status()
22482248
return resp.json()
22492249

2250-
def delete_lot(self, lot_corp_name):
2250+
def delete_lot(self, lot_corp_name, raise_on_linked_data=True):
22512251
"""Delete a lot
22522252
22532253
Args:
22542254
lot_corp_name (str): Corp name of lot to delete
2255+
raise_on_linked_data (bool): Whether to raise an error if there is linked data, default True
22552256
22562257
Returns:
22572258
A dict with "success": true if successful. For example
@@ -2261,7 +2262,19 @@ def delete_lot(self, lot_corp_name):
22612262
Or None if there was an error
22622263
Raises:
22632264
HTTPError: If permission denied
2265+
ValueError: If there is linked data and raise_on_linked_data is True
22642266
"""
2267+
2268+
if raise_on_linked_data:
2269+
# Check for any lot dependencies
2270+
lot_dependencies_return = self.get_lot_dependencies(lot_corp_name, include_linked_lots=False, include_analysis_group_values=False)
2271+
2272+
# Only proceed if there is not any linked data
2273+
if lot_dependencies_return["linkedDataExists"]:
2274+
linked_experiments = lot_dependencies_return["linkedExperiments"]
2275+
error_message = f"Refusing to delete lot {lot_corp_name}. Re-run with raise_on_linked_data=False to delete lot and experimental data linked to lot (deletes assay data linked to lot data not full experiments). Linked experiments: {linked_experiments}."
2276+
raise ValueError(error_message)
2277+
22652278
resp = self.session.delete("{}/cmpdReg/metalots/corpName/{}"
22662279
.format(self.url, lot_corp_name))
22672280
if resp.status_code == 500:

tests/test_acasclient.py

+9-4
Original file line numberDiff line numberDiff line change
@@ -293,7 +293,7 @@ def delete_all_lots_and_experiments(self):
293293
if len(lots) > 0:
294294
# Delete any remaining lots not from bulk loads
295295
for lot in lots:
296-
self.client.delete_lot(lot['lotCorpName'])
296+
self.client.delete_lot(lot['lotCorpName'], raise_on_linked_data=False)
297297

298298
def requires_basic_cmpd_reg_load(func):
299299
"""
@@ -3314,13 +3314,13 @@ def test_004_delete_lot(self, experiment):
33143314
acas_admin = self.create_and_connect_backdoor_user(prefix="acas-admin-", acas_user=True, acas_admin=True, creg_user=False, creg_admin=False)
33153315
cmpdreg_admin = self.create_and_connect_backdoor_user(prefix="cmpdreg-admin-", acas_user=False, acas_admin=False, creg_user=True, creg_admin=True)
33163316

3317-
def can_delete_lot(self, user_client, lot_corp_name, set_owner_first=True):
3317+
def can_delete_lot(self, user_client, lot_corp_name, set_owner_first=True, raise_on_linked_data=False):
33183318
if set_owner_first:
33193319
meta_lot = self.client.get_meta_lot(lot_corp_name)
33203320
meta_lot["lot"]["chemist"] = user_client.username
33213321
self.client.save_meta_lot(meta_lot)
33223322
try:
3323-
response = user_client.delete_lot(lot_corp_name)
3323+
response = user_client.delete_lot(lot_corp_name, raise_on_linked_data=raise_on_linked_data)
33243324
except requests.HTTPError:
33253325
return False
33263326
self.assertIn("success", response)
@@ -3364,7 +3364,12 @@ def can_delete_lot(self, user_client, lot_corp_name, set_owner_first=True):
33643364
self.assertFalse(can_delete_lot(self, acas_admin, restricted_lot_corp_name, set_owner_first=True))
33653365

33663366
# Allow rule: CregAdmin/ACASAdmin can delete the lot and assay data
3367-
self.assertTrue(can_delete_lot(self, self.client, restricted_lot_corp_name, set_owner_first=True))
3367+
# First verify that raise_on_linked_data=True will raise an error
3368+
with self.assertRaises(ValueError) as context:
3369+
can_delete_lot(self, self.client, restricted_lot_corp_name, set_owner_first=True, raise_on_linked_data=True)
3370+
self.assertIn('Refusing to delete lot', str(context.exception))
3371+
# Now actually delete the lot
3372+
self.assertTrue(can_delete_lot(self, self.client, restricted_lot_corp_name, set_owner_first=True, raise_on_linked_data=False))
33683373

33693374
# Verify lot is actually deleted
33703375
meta_lot = self.client.get_meta_lot(restricted_lot_corp_name)

0 commit comments

Comments
 (0)