Skip to content

Commit 1836d7a

Browse files
committed
[NRL-1311] Add script to set pointer supersede info. Add script to put points from JSON files
1 parent 0ee2fd4 commit 1836d7a

File tree

2 files changed

+139
-0
lines changed

2 files changed

+139
-0
lines changed

scripts/put_pointers_from_files.py

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
#!/usr/bin/env python
2+
# Put pointers from the provided files into the pointers table
3+
# This will overwrite the pointer if it already exists in the table
4+
import json
5+
6+
import fire
7+
from aws_session_assume import get_boto_session
8+
9+
from nrlf.core.dynamodb.model import DocumentPointer
10+
from nrlf.core.logger import logger
11+
from nrlf.producer.fhir.r4.model import DocumentReference
12+
13+
logger.setLevel("ERROR")
14+
15+
16+
def _put_pointers_from_files(
17+
*filenames, env: str = "dev", table_name: str | None = None
18+
):
19+
docrefs: list[DocumentReference] = []
20+
print("Reading docrefs from files...")
21+
for filename in filenames:
22+
with open(filename) as f:
23+
docref_json = json.load(f)
24+
docref = DocumentReference.model_validate(docref_json)
25+
docrefs.append(docref)
26+
27+
session = get_boto_session(env)
28+
dynamodb = session.resource("dynamodb")
29+
if not table_name:
30+
table_name = f"nhsd-nrlf--{env}-pointers-table"
31+
table = dynamodb.Table(table_name)
32+
33+
for docref in docrefs:
34+
try:
35+
print(f"Putting {docref.id}....")
36+
pointer = DocumentPointer.from_document_reference(docref)
37+
table.put_item(Item=pointer.model_dump())
38+
except Exception as e:
39+
print(f"Unable to put pointer for {docref.id}. Error: {e}")
40+
41+
42+
if __name__ == "__main__":
43+
fire.Fire(_put_pointers_from_files)

scripts/set_pointer_supersede.py

Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
#!/usr/bin/env python
2+
# Set supersede info on a pointer
3+
import json
4+
5+
import aws_session_assume
6+
import fire
7+
8+
from nrlf.core.dynamodb.model import DocumentPointer
9+
from nrlf.core.logger import logger
10+
from nrlf.producer.fhir.r4.model import (
11+
DocumentReference,
12+
DocumentReferenceRelatesTo,
13+
Identifier,
14+
Reference,
15+
)
16+
17+
logger.setLevel("ERROR")
18+
19+
20+
def _set_pointer_supersede_info(
21+
pointer_id: str,
22+
supersede_pointer_id: str,
23+
delete_superceded: bool = False,
24+
env: str = "dev",
25+
table_name: str | None = None,
26+
):
27+
session = aws_session_assume.get_boto_session(env)
28+
dynamodb = session.resource("dynamodb")
29+
30+
if not table_name:
31+
table_name = f"nhsd-nrlf--{env}-pointers-table"
32+
table = dynamodb.Table(table_name)
33+
34+
print(
35+
f"Setting pointer {pointer_id} in {table_name} to supersede {supersede_pointer_id}...."
36+
)
37+
38+
try:
39+
doc_key = f"D#{pointer_id}"
40+
print(f"Getting {pointer_id}...")
41+
result = table.get_item(
42+
Key={"pk": doc_key, "sk": doc_key},
43+
)
44+
except Exception as e:
45+
print(f"Unable to get pointer. Error: {e}")
46+
return
47+
48+
if "Item" not in result:
49+
print(f"Unable to set superseded info. Pointer {pointer_id} not found.")
50+
return
51+
52+
item = result["Item"]
53+
54+
try:
55+
pointer = DocumentPointer.model_validate({"_from_dynamo": True, **item})
56+
except Exception as e:
57+
print(f"Could not validate pointer from table. Error: {e}")
58+
return
59+
60+
doc_ref = DocumentReference.model_validate_json(pointer.document)
61+
62+
if not doc_ref.relatesTo:
63+
doc_ref.relatesTo = []
64+
else:
65+
for relatesTo in doc_ref.relatesTo:
66+
if relatesTo.code == "replaces":
67+
print(
68+
f"Unable to add supersede info as pointer is already superseding a pointer: {relatesTo}"
69+
)
70+
return
71+
72+
doc_ref.relatesTo.append(
73+
DocumentReferenceRelatesTo(
74+
code="replaces",
75+
target=Reference(
76+
type="DocumentReference",
77+
identifier=Identifier(value=supersede_pointer_id),
78+
),
79+
)
80+
)
81+
82+
print(f"Adding superseded info to {pointer_id}...")
83+
updated_pointer = DocumentPointer.from_document_reference(doc_ref)
84+
table.put_item(
85+
Item=updated_pointer.dict(exclude_none=True, exclude={"_from_dynamo"})
86+
)
87+
88+
if delete_superceded:
89+
print(f"Deleting superseded {supersede_pointer_id}...")
90+
table.delete_item(
91+
Key={"pk": f"D#{supersede_pointer_id}", "sk": f"D#{supersede_pointer_id}"}
92+
)
93+
94+
95+
if __name__ == "__main__":
96+
fire.Fire(_set_pointer_supersede_info)

0 commit comments

Comments
 (0)