healthcare/api-client/v1/hl7v2/hl7v2_messages.py (254 lines of code) (raw):
# Copyright 2018 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import argparse
import os
# [START healthcare_create_hl7v2_message]
def create_hl7v2_message(
project_id, location, dataset_id, hl7v2_store_id, hl7v2_message_file
):
"""Creates an HL7v2 message and sends a notification to the
Cloud Pub/Sub topic.
See https://github.com/GoogleCloudPlatform/python-docs-samples/tree/main/healthcare/api-client/v1/hl7v2
before running the sample."""
# Imports the Google API Discovery Service.
from googleapiclient import discovery
# Imports Python's built-in "json" module
import json
api_version = "v1"
service_name = "healthcare"
# Returns an authorized API client by discovering the Healthcare API
# and using GOOGLE_APPLICATION_CREDENTIALS environment variable.
client = discovery.build(service_name, api_version)
# TODO(developer): Uncomment these lines and replace with your values.
# project_id = 'my-project' # replace with your GCP project ID
# location = 'us-central1' # replace with the parent dataset's location
# dataset_id = 'my-dataset' # replace with the HL7v2 store's parent dataset ID
# hl7v2_store_id = 'my-hl7v2-store' # replace with the HL7v2 store's ID
# hl7v2_message_file = 'hl7v2-message.json' # replace with the path to the HL7v2 file
hl7v2_parent = f"projects/{project_id}/locations/{location}"
hl7v2_store_name = "{}/datasets/{}/hl7V2Stores/{}".format(
hl7v2_parent, dataset_id, hl7v2_store_id
)
with open(hl7v2_message_file) as hl7v2_message:
hl7v2_message_content = json.load(hl7v2_message)
request = (
client.projects()
.locations()
.datasets()
.hl7V2Stores()
.messages()
.create(parent=hl7v2_store_name, body=hl7v2_message_content)
)
response = request.execute()
print(f"Created HL7v2 message from file: {hl7v2_message_file}")
return response
# [END healthcare_create_hl7v2_message]
# [START healthcare_delete_hl7v2_message]
def delete_hl7v2_message(
project_id, location, dataset_id, hl7v2_store_id, hl7v2_message_id
):
"""Deletes an HL7v2 message.
See https://github.com/GoogleCloudPlatform/python-docs-samples/tree/main/healthcare/api-client/v1/hl7v2
before running the sample."""
# Imports the Google API Discovery Service.
from googleapiclient import discovery
api_version = "v1"
service_name = "healthcare"
# Returns an authorized API client by discovering the Healthcare API
# and using GOOGLE_APPLICATION_CREDENTIALS environment variable.
client = discovery.build(service_name, api_version)
# TODO(developer): Uncomment these lines and replace with your values.
# project_id = 'my-project' # replace with your GCP project ID
# location = 'us-central1' # replace with the parent dataset's location
# dataset_id = 'my-dataset' # replace with the HL7v2 store's parent dataset ID
# hl7v2_store_id = 'my-hl7v2-store' # replace with the HL7v2 store's ID
# hl7v2_message_id = '2yqbdhYHlk_ucSmWkcKOVm_N0p0OpBXgIlVG18rB-cw=' # replace with the HL7v2 message ID that was returned by the server
hl7v2_parent = f"projects/{project_id}/locations/{location}"
hl7v2_message = "{}/datasets/{}/hl7V2Stores/{}/messages/{}".format(
hl7v2_parent, dataset_id, hl7v2_store_id, hl7v2_message_id
)
request = (
client.projects()
.locations()
.datasets()
.hl7V2Stores()
.messages()
.delete(name=hl7v2_message)
)
response = request.execute()
print(f"Deleted HL7v2 message with ID: {hl7v2_message_id}")
return response
# [END healthcare_delete_hl7v2_message]
# [START healthcare_get_hl7v2_message]
def get_hl7v2_message(
project_id, location, dataset_id, hl7v2_store_id, hl7v2_message_id
):
"""Gets an HL7v2 message.
See https://github.com/GoogleCloudPlatform/python-docs-samples/tree/main/healthcare/api-client/v1/hl7v2
before running the sample."""
# Imports the Google API Discovery Service.
from googleapiclient import discovery
api_version = "v1"
service_name = "healthcare"
# Returns an authorized API client by discovering the Healthcare API
# and using GOOGLE_APPLICATION_CREDENTIALS environment variable.
client = discovery.build(service_name, api_version)
# TODO(developer): Uncomment these lines and replace with your values.
# project_id = 'my-project' # replace with your GCP project ID
# location = 'us-central1' # replace with the parent dataset's location
# dataset_id = 'my-dataset' # replace with the HL7v2 store's parent dataset ID
# hl7v2_store_id = 'my-hl7v2-store' # replace with the HL7v2 store's ID
# hl7v2_message_id = '2yqbdhYHlk_ucSmWkcKOVm_N0p0OpBXgIlVG18rB-cw=' # replace with the HL7v2 message ID that was returned by the server
hl7v2_parent = f"projects/{project_id}/locations/{location}"
hl7v2_message_name = "{}/datasets/{}/hl7V2Stores/{}/messages/{}".format(
hl7v2_parent, dataset_id, hl7v2_store_id, hl7v2_message_id
)
msgs = client.projects().locations().datasets().hl7V2Stores().messages()
message = msgs.get(name=hl7v2_message_name).execute()
print("Name: {}".format(message.get("name")))
print("Data: {}".format(message.get("data")))
print("Creation time: {}".format(message.get("createTime")))
print("Sending facility: {}".format(message.get("sendFacility")))
print("Time sent: {}".format(message.get("sendTime")))
print("Message type: {}".format(message.get("messageType")))
print("Patient IDs:")
patient_ids = message.get("patientIds")
for patient_id in patient_ids:
print("\tPatient value: {}".format(patient_id.get("value")))
print("\tPatient type: {}".format(patient_id.get("type")))
print("Labels: {}".format(message.get("labels")))
print(message)
return message
# [END healthcare_get_hl7v2_message]
# [START healthcare_ingest_hl7v2_message]
def ingest_hl7v2_message(
project_id, location, dataset_id, hl7v2_store_id, hl7v2_message_file
):
"""Ingests a new HL7v2 message from the hospital and sends a notification
to the Cloud Pub/Sub topic. Return is an HL7v2 ACK message if the message
was successfully stored.
See https://github.com/GoogleCloudPlatform/python-docs-samples/tree/main/healthcare/api-client/v1/hl7v2
before running the sample."""
# Imports the Google API Discovery Service.
from googleapiclient import discovery
# Imports Python's built-in "json" module
import json
api_version = "v1"
service_name = "healthcare"
# Returns an authorized API client by discovering the Healthcare API
# and using GOOGLE_APPLICATION_CREDENTIALS environment variable.
client = discovery.build(service_name, api_version)
# TODO(developer): Uncomment these lines and replace with your values.
# project_id = 'my-project' # replace with your GCP project ID
# location = 'us-central1' # replace with the parent dataset's location
# dataset_id = 'my-dataset' # replace with the HL7v2 store's parent dataset ID
# hl7v2_store_id = 'my-hl7v2-store' # replace with the HL7v2 store's ID
# hl7v2_message_file = 'hl7v2-message.json' # replace with the path to the HL7v2 file
hl7v2_parent = f"projects/{project_id}/locations/{location}"
hl7v2_store_name = "{}/datasets/{}/hl7V2Stores/{}".format(
hl7v2_parent, dataset_id, hl7v2_store_id
)
with open(hl7v2_message_file) as hl7v2_message:
hl7v2_message_content = json.load(hl7v2_message)
request = (
client.projects()
.locations()
.datasets()
.hl7V2Stores()
.messages()
.ingest(parent=hl7v2_store_name, body=hl7v2_message_content)
)
response = request.execute()
print(f"Ingested HL7v2 message from file: {hl7v2_message_file}")
return response
# [END healthcare_ingest_hl7v2_message]
# [START healthcare_list_hl7v2_messages]
def list_hl7v2_messages(project_id, location, dataset_id, hl7v2_store_id):
"""Lists all the messages in the given HL7v2 store with support for
filtering.
See https://github.com/GoogleCloudPlatform/python-docs-samples/tree/main/healthcare/api-client/v1/hl7v2
before running the sample."""
# Imports the Google API Discovery Service.
from googleapiclient import discovery
api_version = "v1"
service_name = "healthcare"
# Returns an authorized API client by discovering the Healthcare API
# and using GOOGLE_APPLICATION_CREDENTIALS environment variable.
client = discovery.build(service_name, api_version)
# TODO(developer): Uncomment these lines and replace with your values.
# project_id = 'my-project' # replace with your GCP project ID
# location = 'us-central1' # replace with the parent dataset's location
# dataset_id = 'my-dataset' # replace with the HL7v2 store's parent dataset ID
# hl7v2_store_id = 'my-hl7v2-store' # replace with the HL7v2 store's ID
hl7v2_messages_parent = "projects/{}/locations/{}/datasets/{}".format(
project_id, location, dataset_id
)
hl7v2_message_path = "{}/hl7V2Stores/{}".format(
hl7v2_messages_parent, hl7v2_store_id
)
hl7v2_messages = (
client.projects()
.locations()
.datasets()
.hl7V2Stores()
.messages()
.list(parent=hl7v2_message_path)
.execute()
.get("hl7V2Messages", [])
)
for hl7v2_message in hl7v2_messages:
print(hl7v2_message)
return hl7v2_messages
# [END healthcare_list_hl7v2_messages]
# [START healthcare_patch_hl7v2_message]
def patch_hl7v2_message(
project_id,
location,
dataset_id,
hl7v2_store_id,
hl7v2_message_id,
label_key,
label_value,
):
"""Updates the message.
See https://github.com/GoogleCloudPlatform/python-docs-samples/tree/main/healthcare/api-client/v1/hl7v2
before running the sample."""
# Imports the Google API Discovery Service.
from googleapiclient import discovery
api_version = "v1"
service_name = "healthcare"
# Returns an authorized API client by discovering the Healthcare API
# and using GOOGLE_APPLICATION_CREDENTIALS environment variable.
client = discovery.build(service_name, api_version)
# TODO(developer): Uncomment these lines and replace with your values.
# project_id = 'my-project' # replace with your GCP project ID
# location = 'us-central1' # replace with the parent dataset's location
# dataset_id = 'my-dataset' # replace with the HL7v2 store's parent dataset ID
# hl7v2_store_id = 'my-hl7v2-store' # replace with the HL7v2 store's ID
# hl7v2_message_id = '2yqbdhYHlk_ucSmWkcKOVm_N0p0OpBXgIlVG18rB-cw=' # replace with the HL7v2 message ID that was returned by the server
# label_key = 'key1' # replace with a key
# label_value = 'label2' # replace with a key value
hl7v2_message_parent = f"projects/{project_id}/locations/{location}"
hl7v2_message_name = "{}/datasets/{}/hl7V2Stores/{}/messages/{}".format(
hl7v2_message_parent, dataset_id, hl7v2_store_id, hl7v2_message_id
)
patch = {"labels": {label_key: label_value}}
request = (
client.projects()
.locations()
.datasets()
.hl7V2Stores()
.messages()
.patch(name=hl7v2_message_name, updateMask="labels", body=patch)
)
response = request.execute()
print(
"Patched HL7v2 message {} with labels:\n\t{}: {}".format(
hl7v2_message_id, label_key, label_value
)
)
return response
# [END healthcare_patch_hl7v2_message]
def parse_command_line_args():
"""Parses command line arguments."""
parser = argparse.ArgumentParser(
description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter
)
parser.add_argument(
"--project_id",
default=os.environ.get("GOOGLE_CLOUD_PROJECT"),
help="GCP project name",
)
parser.add_argument("--location", default="us-central1", help="GCP location")
parser.add_argument("--dataset_id", default=None, help="Name of dataset")
parser.add_argument("--hl7v2_store_id", default=None, help="Name of HL7v2 store")
parser.add_argument(
"--hl7v2_message_file",
default=None,
help="A file containing a base64-encoded HL7v2 message",
)
parser.add_argument(
"--hl7v2_message_id",
default=None,
help="The identifier for the message returned by the server",
)
parser.add_argument(
"--label_key", default=None, help="Arbitrary label key to apply to the message"
)
parser.add_argument(
"--label_value",
default=None,
help="Arbitrary label value to apply to the message",
)
command = parser.add_subparsers(dest="command")
command.add_parser("create-hl7v2-message", help=create_hl7v2_message.__doc__)
command.add_parser("delete-hl7v2-message", help=delete_hl7v2_message.__doc__)
command.add_parser("get-hl7v2-message", help=get_hl7v2_message.__doc__)
command.add_parser("ingest-hl7v2-message", help=ingest_hl7v2_message.__doc__)
command.add_parser("list-hl7v2-messages", help=list_hl7v2_messages.__doc__)
command.add_parser("patch-hl7v2-message", help=patch_hl7v2_message.__doc__)
return parser.parse_args()
def run_command(args):
"""Calls the program using the specified command."""
if args.project_id is None:
print(
"You must specify a project ID or set the "
'"GOOGLE_CLOUD_PROJECT" environment variable.'
)
return
elif args.command == "create-hl7v2-message":
create_hl7v2_message(
args.project_id,
args.location,
args.dataset_id,
args.hl7v2_store_id,
args.hl7v2_message_file,
)
elif args.command == "delete-hl7v2-message":
delete_hl7v2_message(
args.project_id,
args.location,
args.dataset_id,
args.hl7v2_store_id,
args.hl7v2_message_id,
)
elif args.command == "get-hl7v2-message":
get_hl7v2_message(
args.project_id,
args.location,
args.dataset_id,
args.hl7v2_store_id,
args.hl7v2_message_id,
)
elif args.command == "ingest-hl7v2-message":
ingest_hl7v2_message(
args.project_id,
args.location,
args.dataset_id,
args.hl7v2_store_id,
args.hl7v2_message_file,
)
elif args.command == "list-hl7v2-messages":
list_hl7v2_messages(
args.project_id, args.location, args.dataset_id, args.hl7v2_store_id
)
elif args.command == "patch-hl7v2-message":
patch_hl7v2_message(
args.project_id,
args.location,
args.dataset_id,
args.hl7v2_store_id,
args.hl7v2_message_id,
args.label_key,
args.label_value,
)
def main():
args = parse_command_line_args()
run_command(args)
if __name__ == "__main__":
main()