Skip to content

Commit 82c8ba8

Browse files
authored
More descriptive error message if sample is referenced in other session (#28)
1 parent ebc0f14 commit 82c8ba8

File tree

3 files changed

+25
-4
lines changed

3 files changed

+25
-4
lines changed

src/scaup/crud/samples.py

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,14 @@
33
from fastapi import HTTPException, status
44
from lims_utils.logging import app_logger
55
from lims_utils.models import Paged, ProposalReference
6+
from psycopg.errors import ForeignKeyViolation
67
from sqlalchemy import and_, insert, select
8+
from sqlalchemy.exc import IntegrityError
79

810
from ..models.inner_db.tables import Container, Sample, SampleParentChild, Shipment
911
from ..models.samples import OptionalSample, SampleIn, SampleOut
1012
from ..utils.config import Config
11-
from ..utils.crud import assert_not_booked, edit_item
13+
from ..utils.crud import assert_not_booked, delete_item, edit_item
1214
from ..utils.database import inner_db
1315
from ..utils.external import Expeye, ExternalRequest
1416
from ..utils.session import retry_if_exists
@@ -189,3 +191,16 @@ def get_samples(
189191
pass
190192

191193
return validated_samples
194+
195+
196+
def delete_sample(sample_id: int):
197+
try:
198+
delete_item(table=Sample, item_id=sample_id)
199+
except IntegrityError as e:
200+
if isinstance(e.__cause__, ForeignKeyViolation):
201+
# If a foreign key violation occurs, that's because the sample is in SampleParentChild
202+
raise HTTPException(
203+
status_code=status.HTTP_409_CONFLICT,
204+
detail="Sample is linked to a different session and cannot be deleted",
205+
)
206+
raise

src/scaup/routes/samples.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,7 @@
33

44
from ..auth import Permissions, auth_scheme
55
from ..crud import samples as crud
6-
from ..models.inner_db.tables import Sample
76
from ..models.samples import OptionalSample, SampleOut
8-
from ..utils.crud import delete_item
97

108
auth_sample = Permissions.sample
119

@@ -29,4 +27,4 @@ def edit_sample(
2927
@router.delete("/{sampleId}", status_code=status.HTTP_204_NO_CONTENT)
3028
def delete_sample(sampleId=Depends(auth_sample)):
3129
"""Create new sample in shipment"""
32-
return delete_item(table=Sample, item_id=sampleId)
30+
return crud.delete_sample(sample_id=sampleId)
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
def test_delete_with_parent(client):
2+
"""Should fail if sample is referenced in SampleParentChild"""
3+
4+
resp = client.delete(
5+
"/samples/1877",
6+
)
7+
8+
assert resp.status_code == 409

0 commit comments

Comments
 (0)