External Event Effect

The ExternalEvent effect provides a way to create and update external clinical events within the Canvas platform. External events represent clinical encounters from external data sources such as ADT (Admission, Discharge, Transfer) feeds, enabling tracking of patient visits that occur outside of Canvas.

Attributes #

NameTypeDescription
external_event_idstr or UUID or NoneUnique identifier of an existing external event. Must be unset when creating; required when updating.
patient_idstr or NoneID of the patient for this event. Required when creating.
visit_identifierstr or NoneIdentifier for the visit/encounter. Required when creating.
message_control_idstr or NoneUnique identifier for the message (e.g., HL7 message control ID). Required when creating.
event_typestr or NoneType of event (e.g., “ADT^A01” for admission). Required when creating.
event_datetimedatetime or NoneDate and time when the event occurred.
event_cancelation_datetimedatetime or NoneDate and time when the event was cancelled. Set this to mark an event as cancelled.
message_datetimedatetime or NoneDate and time when the message was sent.
information_sourcestr or NoneSource of the event information (e.g., hospital name, system name).
facility_namestr or NoneName of the facility where the event occurred.
raw_messagestr or NoneRaw message content (e.g., original HL7 message).

Validation & Errors #

Before any effect is emitted, the model runs these checks:

Create Validation #

  • external_event_id must not be set (will be generated by the system)
  • patient_id is required
  • visit_identifier is required
  • message_control_id is required
  • event_type is required

Update Validation #

  • external_event_id is required and must reference an existing external event
  • All other fields are optional; only dirty (modified) fields are updated

Effect Methods #

create() #

Create a new external event record.

  • Effect Type: CREATE_EXTERNAL_EVENT
  • Payload: { "data": { patient_id, visit_identifier, message_control_id, event_type, ... } }

update() #

Update an existing external event.

  • Effect Type: UPDATE_EXTERNAL_EVENT
  • Payload: { "data": { external_event_id, <dirty_fields> } }
  • Only fields marked dirty (modified on the model) are included in the update.

Example Usage #

from datetime import datetime

from canvas_sdk.effects.external_event import ExternalEvent
from canvas_sdk.v1.data.external_event import ExternalEvent as ExternalEventModel
from canvas_sdk.v1.data.patient import Patient

patient = Patient.objects.first()

Create an Admission Event #

# Create an external event for a hospital admission
admission_event = ExternalEvent(
    patient_id=str(patient.id),
    visit_identifier="VISIT-2024-001234",
    message_control_id="MSG-20240115-143052",
    event_type="ADT^A01",  # Admission
    event_datetime=datetime.now(),
    message_datetime=datetime.now(),
    information_source="General Hospital ADT Feed",
    facility_name="General Hospital - Main Campus",
    raw_message="MSH|^~\&|HOSPITAL|FAC|CANVAS|...",
)

effect_create = admission_event.create()

Create a Discharge Event #

# Create an external event for a discharge
discharge_event = ExternalEvent(
    patient_id=str(patient.id),
    visit_identifier="VISIT-2024-001234",  # Same visit as admission
    message_control_id="MSG-20240118-091530",
    event_type="ADT^A03",  # Discharge
    event_datetime=datetime.now(),
    message_datetime=datetime.now(),
    information_source="General Hospital ADT Feed",
    facility_name="General Hospital - Main Campus",
)

effect_discharge = discharge_event.create()

Cancel an Existing Event #

# Find an existing external event to cancel
existing_event = ExternalEventModel.objects.filter(
    patient__id=patient.id,
    event_cancelation_datetime__isnull=True,  # Not already cancelled
).first()

if existing_event:
    # Cancel the event by setting the cancelation datetime
    cancel_effect = ExternalEvent(
        external_event_id=str(existing_event.id),
        event_cancelation_datetime=datetime.now(),
    )

    effect_cancel = cancel_effect.update()

Update Event Details #

# Update an existing external event with additional information
existing_event = ExternalEventModel.objects.filter(patient__id=patient.id).first()

if existing_event:
    updated_event = ExternalEvent(
        external_event_id=str(existing_event.id),
        facility_name="General Hospital - West Wing (Corrected)",
        raw_message="MSH|^~\&|HOSPITAL|FAC|CANVAS|...|CORRECTED",
    )

    effect_update = updated_event.update()

Create Event with All Fields #

# Create an external event with all optional fields populated
complete_event = ExternalEvent(
    # Required fields
    patient_id=str(patient.id),
    visit_identifier="VISIT-2024-005678",
    message_control_id="MSG-20240120-163045",
    event_type="ADT^A01",
    # Optional datetime fields
    event_datetime=datetime(2024, 1, 20, 16, 30, 0),
    message_datetime=datetime(2024, 1, 20, 16, 30, 45),
    # Optional string fields
    information_source="Regional Medical Center - HL7 Interface",
    facility_name="Regional Medical Center - Emergency Department",
    raw_message="MSH|^~\&|RMC|ED|CANVAS|RECV|20240120163045||ADT^A01|MSG123|P|2.5",
)

effect_complete = complete_event.create()

Common Event Types #

The event_type field typically contains HL7 ADT event codes:

Event TypeDescription
ADT^A01Admit/Visit Notification
ADT^A02Transfer a Patient
ADT^A03Discharge/End Visit
ADT^A04Register a Patient
ADT^A08Update Patient Information
ADT^A11Cancel Admit/Visit Notification
ADT^A12Cancel Transfer
ADT^A13Cancel Discharge/End Visit