Skip to content

Commit 3a15676

Browse files
committed
Perform manufacturer serial number check when creating dewars
1 parent 9cf6aa8 commit 3a15676

File tree

4 files changed

+41
-22
lines changed

4 files changed

+41
-22
lines changed

src/scaup/crud/top_level_containers.py

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,15 @@ def _check_fields(
6060
)
6161

6262
if code_response.status_code == 200:
63+
registry_json: dict[str, Any] = code_response.json()
64+
msn = registry_json.get("manufacturerSerialNumber")
65+
if isinstance(params, TopLevelContainerIn) and msn is not None:
66+
app_logger.error(f"{msn}, {params.manufacturerSerialNumber}")
67+
if msn != params.manufacturerSerialNumber:
68+
raise HTTPException(
69+
status_code=status.HTTP_404_NOT_FOUND,
70+
detail="Manufacturer serial number does not match the provided facility code",
71+
)
6372
return
6473

6574
raise HTTPException(
@@ -114,7 +123,7 @@ def create_top_level_container(shipmentId: int | None, params: TopLevelContainer
114123
url=f"/proposals/{proposal.reference}/dewar-registry",
115124
json={
116125
"facilityCode": new_code,
117-
"manufacturerSerialNumber": (None if params.code.lower().strip() == "n/a" else params.code),
126+
"manufacturerSerialNumber": params.manufacturerSerialNumber,
118127
},
119128
)
120129

src/scaup/models/top_level_containers.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,17 +24,17 @@ class BaseTopLevelContainer(BaseModel):
2424
"by the container index is used"
2525
),
2626
)
27+
code: str | None = None
2728

2829

2930
class TopLevelContainerIn(BaseTopLevelContainer):
3031
type: str
31-
code: str = "n/a"
32+
manufacturerSerialNumber: str | None = None
3233
isInternal: bool = False
3334

3435

3536
class OptionalTopLevelContainer(BaseTopLevelContainer):
3637
type: Optional[str] = None
37-
code: Optional[str] = None
3838
barCode: Optional[str] = None
3939

4040

tests/shipments/test_create_item.py

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,7 @@
2121
),
2222
pytest.param(
2323
"topLevelContainers",
24-
{
25-
"type": "dewar",
26-
"code": "DLS-EM-0001",
27-
},
24+
{"type": "dewar", "code": "DLS-EM-0001", "manufacturerSerialNumber": "serial123"},
2825
TopLevelContainer,
2926
id="topLevelContainers",
3027
),

tests/shipments/top_level_containers/test_create.py

Lines changed: 28 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -29,10 +29,7 @@ def test_create_no_name(client):
2929

3030
resp = client.post(
3131
"/shipments/1/topLevelContainers",
32-
json={
33-
"type": "dewar",
34-
"code": "DLS-EM-0001",
35-
},
32+
json={"type": "dewar", "code": "DLS-EM-0001", "manufacturerSerialNumber": "serial123"},
3633
)
3734

3835
assert resp.status_code == 201
@@ -48,10 +45,7 @@ def test_create_auto_barcode_no_instrument(client):
4845

4946
resp = client.post(
5047
"/shipments/1/topLevelContainers",
51-
json={
52-
"type": "dewar",
53-
"code": "DLS-EM-0001",
54-
},
48+
json={"type": "dewar", "code": "DLS-EM-0001", "manufacturerSerialNumber": "serial123"},
5549
)
5650

5751
assert resp.status_code == 201
@@ -122,10 +116,7 @@ def test_create_duplicate_name(client):
122116

123117
resp = client.post(
124118
"/shipments/1/topLevelContainers",
125-
json={
126-
"type": "dewar",
127-
"code": "DLS-EM-0000",
128-
},
119+
json={"type": "dewar", "code": "DLS-EM-0000", "manufacturerSerialNumber": "serial123"},
129120
)
130121

131122
assert resp.status_code == 409
@@ -162,9 +153,30 @@ def test_create_no_code(client):
162153
)
163154

164155

156+
@responses.activate
157+
def test_create_invalid_serial(client):
158+
"""Should raise error if invalid manufacturer serial code is provided for registered dewar"""
159+
responses.get(
160+
f"{Config.ispyb_api.url}/proposals/cm1/dewar-registry/DLS-EM-0001",
161+
status=200,
162+
json={"manufacturerSerialNumber": "different123"},
163+
)
164+
165+
resp = client.post(
166+
"/shipments/1/topLevelContainers",
167+
json={
168+
"type": "dewar",
169+
"code": "DLS-EM-0001",
170+
"manufacturerSerialNumber": "test123",
171+
},
172+
)
173+
174+
assert resp.status_code == 404
175+
176+
165177
@responses.activate
166178
def test_create_with_serial(client):
167-
"""Should automatically generate code if serial code is provided"""
179+
"""Should automatically create dewar registry entry with serial code if serial code is provided"""
168180
creation_response = responses.post(
169181
f"{Config.ispyb_api.url}/proposals/cm1/dewar-registry",
170182
status=201,
@@ -181,7 +193,8 @@ def test_create_with_serial(client):
181193
"/shipments/1/topLevelContainers",
182194
json={
183195
"type": "dewar",
184-
"code": "test123",
196+
"code": None,
197+
"manufacturerSerialNumber": "serial123",
185198
},
186199
)
187200

@@ -193,7 +206,7 @@ def test_create_with_serial(client):
193206

194207
assert json.loads(creation_response.calls[0].request.body.decode()) == {
195208
"facilityCode": "DLS-BI-5672",
196-
"manufacturerSerialNumber": "test123",
209+
"manufacturerSerialNumber": "serial123",
197210
}
198211

199212

0 commit comments

Comments
 (0)