Skip to content

Commit fc63b13

Browse files
Merge branch 'develop' into feature/jale13-nrl-1342-release-reporting-infra-to-int
2 parents 3ed8847 + d44647b commit fc63b13

File tree

2 files changed

+160
-0
lines changed

2 files changed

+160
-0
lines changed

scripts/put_pointers_from_files.py

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
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+
import os
6+
7+
import fire
8+
from aws_session_assume import get_boto_session
9+
10+
from nrlf.core.dynamodb.model import DocumentPointer
11+
from nrlf.core.logger import logger
12+
from nrlf.producer.fhir.r4.model import DocumentReference
13+
14+
logger.setLevel("ERROR")
15+
16+
SKIP_PROD_WARNING = os.getenv("SKIP_PROD_WARNING", "false")
17+
18+
19+
def _put_pointers_from_files(
20+
*filenames, env: str = "dev", table_name: str | None = None
21+
):
22+
if env == "prod" and SKIP_PROD_WARNING != "true":
23+
confirmation = input(
24+
"\nWARNING - This command will modify the PROD environment. Continue? [y/n] "
25+
)
26+
if confirmation != "y":
27+
return "Exiting at user request"
28+
29+
docrefs: list[DocumentReference] = []
30+
print("Reading docrefs from files...")
31+
for filename in filenames:
32+
with open(filename) as f:
33+
docref_json = json.load(f)
34+
docref = DocumentReference.model_validate(docref_json)
35+
docrefs.append(docref)
36+
37+
session = get_boto_session(env)
38+
dynamodb = session.resource("dynamodb")
39+
if not table_name:
40+
table_name = f"nhsd-nrlf--{env}-pointers-table"
41+
table = dynamodb.Table(table_name)
42+
43+
for docref in docrefs:
44+
try:
45+
print(f"Putting {docref.id}....")
46+
pointer = DocumentPointer.from_document_reference(docref)
47+
table.put_item(Item=pointer.model_dump())
48+
except Exception as e:
49+
print(f"Unable to put pointer for {docref.id}. Error: {e}")
50+
51+
52+
if __name__ == "__main__":
53+
fire.Fire(_put_pointers_from_files)

scripts/set_pointer_supersede.py

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

0 commit comments

Comments
 (0)