diff --git a/test/cassettes/test_encounter_disposition_get.yaml b/test/cassettes/test_encounter_disposition_get.yaml new file mode 100644 index 0000000..85f6ffd --- /dev/null +++ b/test/cassettes/test_encounter_disposition_get.yaml @@ -0,0 +1,69 @@ +interactions: +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Authorization: + - API_TOKEN_88866c0b-3225-4293-9806-262449cede2f + Connection: + - keep-alive + Cookie: + - AWSALB=9nPqFdESWDjdwcdx22jS8gy2WpGgwHDexLyMVYhmPBz6AQuUEHxQ4uJnZ8nAx00UpMjmm4Mbq3sjKLLu6rIwFC5InZsl8dFcuVADCixpRr2VTPUARNuXJlwvzfdj; + AWSALBCORS=9nPqFdESWDjdwcdx22jS8gy2WpGgwHDexLyMVYhmPBz6AQuUEHxQ4uJnZ8nAx00UpMjmm4Mbq3sjKLLu6rIwFC5InZsl8dFcuVADCixpRr2VTPUARNuXJlwvzfdj + User-Agent: + - python-welkin/0.0.4 + method: GET + uri: https://api.live.welkincloud.io/tenant_REDACTED/instance_REDACTED/patients/173a8adf-92e8-4832-8900-027c71b0d768/encounters/d6f4b66e-1be6-403a-ae47-1bbcee264c5e/disposition + response: + body: + string: '{"id": "8cd87974-b1cb-4a6f-8873-71d5d188c4aa", "patientId": "173a8adf-92e8-4832-8900-027c71b0d768", + "cdtId": "c4c7f925-8da1-4e88-93b6-9afd4dda9421", "version": 6, "jsonBody": + {"external_guid": null, "notes": null, "uicedf-treatment": null, "uicedf-review": + "good stuff keep it up", "created_at": "2022-08-09T13:26:18.139Z", "source_type": + "ENCOUNTER", "external_id": null, "created_by_name": "Eddie Cohen", "created_by": + "379298b5-1b4e-48cb-a60f-e6d9cb9a5e65", "updated_by_name": "API_CLIENT:YJTWKVSGOBFE", + "updated_at": "2022-08-09T16:16:14.870Z", "updated_by": "4f576fa5-af07-4473-99ea-6afb4956e243", + "id": "8cd87974-b1cb-4a6f-8873-71d5d188c4aa", "source_id": "d6f4b66e-1be6-403a-ae47-1bbcee264c5e", + "uicedf-next-steps": "take yer pills", "source_name": "__encounter__"}, "cdtName": + "__encounter_disposition__"}' + headers: + Access-Control-Allow-Headers: + - authorization, content-type, xsrf-token, security-role + Access-Control-Allow-Methods: + - GET, POST, PUT, DELETE, PATCH, OPTIONS + Access-Control-Allow-Origin: + - '*' + Access-Control-Expose-Headers: + - xsrf-token + Access-Control-Max-Age: + - '3600' + Cache-Control: + - no-cache, no-store, max-age=0, must-revalidate + Connection: + - keep-alive + Content-Type: + - application/json + Date: + - Tue, 09 Aug 2022 17:23:57 GMT + Expires: + - '0' + Pragma: + - no-cache + Set-Cookie: + - AWSALB=qVU++2upLzDAsTTDHsnEHCIrQLPpKh+iACDnLlM2VGnIlxu0pETlRGaZaa7ZtZyGI4/otAhrreDuCmja0/sIHsVR/mAjVLNwAKoux7/AjA9dB47i9xkYrgTNohbk; + Expires=Tue, 16 Aug 2022 17:23:57 GMT; Path=/ + - AWSALBCORS=qVU++2upLzDAsTTDHsnEHCIrQLPpKh+iACDnLlM2VGnIlxu0pETlRGaZaa7ZtZyGI4/otAhrreDuCmja0/sIHsVR/mAjVLNwAKoux7/AjA9dB47i9xkYrgTNohbk; + Expires=Tue, 16 Aug 2022 17:23:57 GMT; Path=/; SameSite=None; Secure + Transfer-Encoding: + - chunked + X-Content-Type-Options: + - nosniff + X-XSS-Protection: + - 1; mode=block + status: + code: 200 + message: '' +version: 1 diff --git a/test/cassettes/test_encounter_disposition_get_nested.yaml b/test/cassettes/test_encounter_disposition_get_nested.yaml new file mode 100644 index 0000000..2606e57 --- /dev/null +++ b/test/cassettes/test_encounter_disposition_get_nested.yaml @@ -0,0 +1,163 @@ +interactions: +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Authorization: + - API_TOKEN_88866c0b-3225-4293-9806-262449cede2f + Connection: + - keep-alive + Cookie: + - AWSALB=QcApPf9td2KJtc37Y1U7O8IgHCEYSSNHqVzSLB2UkzxZHKE1lsrxkdkYfuIxQi5h1uxqCIgoCSUl0IpVZaIdmqdmIxGgbQ3GlsPD9cLCrzFvgvJu3uMwJsumsEve; + AWSALBCORS=QcApPf9td2KJtc37Y1U7O8IgHCEYSSNHqVzSLB2UkzxZHKE1lsrxkdkYfuIxQi5h1uxqCIgoCSUl0IpVZaIdmqdmIxGgbQ3GlsPD9cLCrzFvgvJu3uMwJsumsEve + User-Agent: + - python-welkin/0.0.4 + method: GET + uri: https://api.live.welkincloud.io/tenant_REDACTED/instance_REDACTED/patients/173a8adf-92e8-4832-8900-027c71b0d768/full-encounters/d6f4b66e-1be6-403a-ae47-1bbcee264c5e + response: + body: + string: '{"encounter": {"id": "d6f4b66e-1be6-403a-ae47-1bbcee264c5e", "patientId": + "173a8adf-92e8-4832-8900-027c71b0d768", "cdtId": "b267b852-1b85-479c-801b-c80252b3c824", + "version": 6, "jsonBody": {"startDatetime": null, "local_updated_at": "2022-08-09T16:56:35.448+00:00", + "external_guid": null, "notes": "", "description": "", "created_at": "2022-08-09T13:26:18.059Z", + "external_id": null, "type": "etmp-initial-consultation", "title": "Initial + Consultation", "activeUserName": null, "created_by_name": "Eddie Cohen", "currentScheduledAppointment": + {"id": "5eee678f-c1e5-4bb8-b53e-0ea8b79373c2", "createdBy": "createdBy_REDACTED_f10c3f1e-136a-4d95-bc04-531eaf080c7f", + "createdAt": "2022-08-09T13:26:18.032Z", "updatedBy": "updatedBy_REDACTED_78cc52fe-ec5f-4ecb-8d60-d27893d272ed", + "updatedAt": "2022-08-09T16:56:35.448Z", "externalId": null, "externalIdUpdatedAt": + "2022-08-09T13:26:18.032Z", "eventTitle": "Initial Consultation", "eventDescription": + "", "startDateTime": "2022-08-09T14:00:00.000Z", "localStartDateTime": "2022-08-09T14:00:00.000+00:00", + "endDateTime": "2022-08-09T14:30:00.000Z", "localEndDateTime": "2022-08-09T14:30:00.000+00:00", + "allDayEvent": false, "duration": 1800, "eventType": "ENCOUNTER", "eventStatus": + "Scheduled", "eventMode": "VIDEO", "eventColor": "#e67b2d", "hostId": "379298b5-1b4e-48cb-a60f-e6d9cb9a5e65", + "timezone": "UTC", "additionalInfo": null, "participants": [{"id": "358c483c-34bf-413c-8b01-a00c7b899bab", + "participantId": "379298b5-1b4e-48cb-a60f-e6d9cb9a5e65", "participantRole": + "psm", "participationStatus": "", "attended": false, "timezone": null, "firstName": + "Eddie", "lastName": "Cohen", "deleted": false, "hasAccess": false, "email": + "eddie@lightmatter.com", "phone": null, "gender": null, "birthDate": null, + "enabled": true}, {"id": "888f9bb2-da86-4659-acf9-ce3e1c359a2f", "participantId": + "173a8adf-92e8-4832-8900-027c71b0d768", "participantRole": "patient", "participationStatus": + "", "attended": false, "timezone": "US/Eastern", "firstName": "Bob", "lastName": + "Dole", "deleted": false, "hasAccess": false, "email": "bob@bobdole.com", + "phone": "+18779078585", "gender": "MALE", "birthDate": "1923-07-22T00:00:00.000Z", + "enabled": null}]}, "updated_by_name": "API_CLIENT:YJTWKVSGOBFE", "localCalendarEventStartDatetime": + "2022-08-09T14:00:00.000+00:00", "updated_at": "2022-08-09T16:56:35.451Z", + "ownerUserName": "Eddie Cohen", "templateTitle": "Initial Consultation", "id": + "d6f4b66e-1be6-403a-ae47-1bbcee264c5e", "source_name": null, "calendarEventId": + "5eee678f-c1e5-4bb8-b53e-0ea8b79373c2", "activeUserId": null, "calendarEvent": + {"id": "5eee678f-c1e5-4bb8-b53e-0ea8b79373c2", "createdBy": "createdBy_REDACTED_3ec56ed3-74c7-4115-891d-2bac9b3f8749", + "createdAt": "2022-08-09T13:26:18.032Z", "updatedBy": "updatedBy_REDACTED_7793368d-e8a9-49ae-8232-c4f35dcad780", + "updatedAt": "2022-08-09T13:26:18.032Z", "externalId": null, "externalIdUpdatedAt": + "2022-08-09T13:26:18.032Z", "eventTitle": "Initial Consultation", "eventDescription": + "", "startDateTime": "2022-08-09T14:00:00.000Z", "localStartDateTime": "2022-08-09T14:00:00.000+00:00", + "endDateTime": "2022-08-09T14:30:00.000Z", "localEndDateTime": "2022-08-09T14:30:00.000+00:00", + "allDayEvent": false, "duration": 1800, "eventType": "ENCOUNTER", "eventStatus": + "Scheduled", "eventMode": "VIDEO", "eventColor": "#e67b2d", "hostId": "379298b5-1b4e-48cb-a60f-e6d9cb9a5e65", + "timezone": "UTC", "additionalInfo": null, "participants": [{"id": "358c483c-34bf-413c-8b01-a00c7b899bab", + "participantId": "379298b5-1b4e-48cb-a60f-e6d9cb9a5e65", "participantRole": + "psm", "participationStatus": "", "attended": false, "timezone": null, "firstName": + "Eddie", "lastName": "Cohen", "deleted": false, "hasAccess": false, "email": + "eddie@lightmatter.com", "phone": null, "gender": null, "birthDate": null, + "enabled": true}, {"id": "888f9bb2-da86-4659-acf9-ce3e1c359a2f", "participantId": + "173a8adf-92e8-4832-8900-027c71b0d768", "participantRole": "patient", "participationStatus": + "", "attended": false, "timezone": "US/Eastern", "firstName": "Bob", "lastName": + "Dole", "deleted": false, "hasAccess": false, "email": "bob@bobdole.com", + "phone": "+18779078585", "gender": "MALE", "birthDate": "1923-07-22T00:00:00.000Z", + "enabled": null}]}, "calendarEventStartDatetime": "2022-08-09T14:00:00.000Z", + "dispositionId": "8cd87974-b1cb-4a6f-8873-71d5d188c4aa", "source_type": null, + "created_by": "379298b5-1b4e-48cb-a60f-e6d9cb9a5e65", "localEndDatetime": + "2022-08-09T14:30:00.000+00:00", "local_created_at": "2022-08-09T13:26:18.032+00:00", + "templateName": "etmp-initial-consultation", "instruction": "", "ownerUserId": + "379298b5-1b4e-48cb-a60f-e6d9cb9a5e65", "updated_by": "4f576fa5-af07-4473-99ea-6afb4956e243", + "source_id": null, "endDatetime": null, "localStartDatetime": "2022-08-09T14:00:00.000+00:00", + "status": "DRAFT"}, "cdtName": "__encounter__"}, "disposition": {"id": "8cd87974-b1cb-4a6f-8873-71d5d188c4aa", + "patientId": "173a8adf-92e8-4832-8900-027c71b0d768", "cdtId": "c4c7f925-8da1-4e88-93b6-9afd4dda9421", + "version": 6, "jsonBody": {"external_guid": null, "notes": null, "uicedf-treatment": + null, "uicedf-review": "good stuff keep it up", "created_at": "2022-08-09T13:26:18.139Z", + "source_type": "ENCOUNTER", "external_id": null, "created_by_name": "Eddie + Cohen", "created_by": "379298b5-1b4e-48cb-a60f-e6d9cb9a5e65", "updated_by_name": + "API_CLIENT:YJTWKVSGOBFE", "updated_at": "2022-08-09T16:16:14.870Z", "updated_by": + "4f576fa5-af07-4473-99ea-6afb4956e243", "id": "8cd87974-b1cb-4a6f-8873-71d5d188c4aa", + "source_id": "d6f4b66e-1be6-403a-ae47-1bbcee264c5e", "uicedf-next-steps": + "take yer pills", "source_name": "__encounter__"}, "cdtName": "__encounter_disposition__"}, + "calendarEvent": {"id": "5eee678f-c1e5-4bb8-b53e-0ea8b79373c2", "createdBy": + "createdBy_REDACTED_9f0367c7-80e6-4cfe-8acb-29a118daa2f7", "createdAt": "2022-08-09T13:26:18.032Z", + "updatedBy": "updatedBy_REDACTED_7c5aabe7-de73-482f-aebc-c4238ed3bd6a", "updatedAt": + "2022-08-09T16:56:35.448Z", "externalId": null, "externalIdUpdatedAt": "2022-08-09T13:26:18.032Z", + "eventTitle": "Initial Consultation", "eventDescription": "", "startDateTime": + "2022-08-09T14:00:00.000Z", "localStartDateTime": "2022-08-09T14:00:00.000+00:00", + "endDateTime": "2022-08-09T14:30:00.000Z", "localEndDateTime": "2022-08-09T14:30:00.000+00:00", + "allDayEvent": false, "duration": 1800, "eventType": "ENCOUNTER", "eventStatus": + "Scheduled", "eventMode": "VIDEO", "eventColor": "#e67b2d", "hostId": "379298b5-1b4e-48cb-a60f-e6d9cb9a5e65", + "timezone": "UTC", "additionalInfo": null, "participants": [{"id": "358c483c-34bf-413c-8b01-a00c7b899bab", + "participantId": "379298b5-1b4e-48cb-a60f-e6d9cb9a5e65", "participantRole": + "psm", "participationStatus": "", "attended": false, "timezone": null, "firstName": + "Eddie", "lastName": "Cohen", "deleted": false, "hasAccess": false, "email": + "eddie@lightmatter.com", "phone": null, "gender": null, "birthDate": null, + "enabled": true}, {"id": "888f9bb2-da86-4659-acf9-ce3e1c359a2f", "participantId": + "173a8adf-92e8-4832-8900-027c71b0d768", "participantRole": "patient", "participationStatus": + "", "attended": false, "timezone": "US/Eastern", "firstName": "Bob", "lastName": + "Dole", "deleted": false, "hasAccess": false, "email": "bob@bobdole.com", + "phone": "+18779078585", "gender": "MALE", "birthDate": "1923-07-22T00:00:00.000Z", + "enabled": null}]}, "userRelatedToCalendarEvent": {"territories": [], "roles": + [], "policies": [], "seats": [], "seatAssignAllowed": false, "createdByName": + "createdByName_REDACTED_337b2a6a-e743-415a-affa-dc1a71547e8f", "updatedByName": + "updatedByName_REDACTED_a1f4a4a0-71f4-4a83-b7ea-915f874786e5", "id": "379298b5-1b4e-48cb-a60f-e6d9cb9a5e65", + "username": "eddie", "email": "eddie@lightmatter.com", "locale": "en-US", + "firstName": "Eddie", "lastName": "Cohen", "enabled": true, "mfaEnabled": + false, "statusType": null, "createdAt": "2022-08-03T21:39:27.117Z", "updatedAt": + "2022-08-03T21:39:27.117Z", "ssoAccess": false, "passwordAccess": true, "terminologyName": + "english", "userState": "ACTIVE", "customUserAttributes": {}, "allowedToReceiveCalls": + true, "userAttributes": {}, "_root_user": false}, "assessmentLinks": [{"id": + "bec5f3eb-cd26-4952-8681-3e295acff549", "patientId": "173a8adf-92e8-4832-8900-027c71b0d768", + "cdtId": "a5f6cef4-ee72-49a7-a978-583da54f476e", "version": 6, "jsonBody": + {"external_guid": null, "created_at": "2022-08-09T13:26:18.095Z", "source_type": + "ENCOUNTER", "external_id": null, "fromTemplate": true, "created_by_name": + "Eddie Cohen", "created_by": "379298b5-1b4e-48cb-a60f-e6d9cb9a5e65", "assessmentTitle": + "Appointment Checkin", "relation": "ASSESSMENT", "updated_by_name": "Eddie + Cohen", "updated_at": "2022-08-09T13:26:18.095Z", "assessmentName": "asm-appointment-checkin", + "updated_by": "379298b5-1b4e-48cb-a60f-e6d9cb9a5e65", "id": "bec5f3eb-cd26-4952-8681-3e295acff549", + "source_id": "d6f4b66e-1be6-403a-ae47-1bbcee264c5e", "assessmentRecordId": + null, "source_name": "__encounter__"}, "cdtName": "__encounter_assessment__"}], + "comments": []}' + headers: + Access-Control-Allow-Headers: + - authorization, content-type, xsrf-token, security-role + Access-Control-Allow-Methods: + - GET, POST, PUT, DELETE, PATCH, OPTIONS + Access-Control-Allow-Origin: + - '*' + Access-Control-Expose-Headers: + - xsrf-token + Access-Control-Max-Age: + - '3600' + Cache-Control: + - no-cache, no-store, max-age=0, must-revalidate + Connection: + - keep-alive + Content-Type: + - application/json + Date: + - Tue, 09 Aug 2022 17:23:47 GMT + Expires: + - '0' + Pragma: + - no-cache + Set-Cookie: + - AWSALB=9nPqFdESWDjdwcdx22jS8gy2WpGgwHDexLyMVYhmPBz6AQuUEHxQ4uJnZ8nAx00UpMjmm4Mbq3sjKLLu6rIwFC5InZsl8dFcuVADCixpRr2VTPUARNuXJlwvzfdj; + Expires=Tue, 16 Aug 2022 17:23:47 GMT; Path=/ + - AWSALBCORS=9nPqFdESWDjdwcdx22jS8gy2WpGgwHDexLyMVYhmPBz6AQuUEHxQ4uJnZ8nAx00UpMjmm4Mbq3sjKLLu6rIwFC5InZsl8dFcuVADCixpRr2VTPUARNuXJlwvzfdj; + Expires=Tue, 16 Aug 2022 17:23:47 GMT; Path=/; SameSite=None; Secure + Transfer-Encoding: + - chunked + X-Content-Type-Options: + - nosniff + X-XSS-Protection: + - 1; mode=block + status: + code: 200 + message: '' +version: 1 diff --git a/test/cassettes/test_encounter_disposition_get_patient_id_encounter_id.yaml b/test/cassettes/test_encounter_disposition_get_patient_id_encounter_id.yaml new file mode 100644 index 0000000..01eb8b9 --- /dev/null +++ b/test/cassettes/test_encounter_disposition_get_patient_id_encounter_id.yaml @@ -0,0 +1,69 @@ +interactions: +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Authorization: + - API_TOKEN_88866c0b-3225-4293-9806-262449cede2f + Connection: + - keep-alive + Cookie: + - AWSALB=qVU++2upLzDAsTTDHsnEHCIrQLPpKh+iACDnLlM2VGnIlxu0pETlRGaZaa7ZtZyGI4/otAhrreDuCmja0/sIHsVR/mAjVLNwAKoux7/AjA9dB47i9xkYrgTNohbk; + AWSALBCORS=qVU++2upLzDAsTTDHsnEHCIrQLPpKh+iACDnLlM2VGnIlxu0pETlRGaZaa7ZtZyGI4/otAhrreDuCmja0/sIHsVR/mAjVLNwAKoux7/AjA9dB47i9xkYrgTNohbk + User-Agent: + - python-welkin/0.0.4 + method: GET + uri: https://api.live.welkincloud.io/tenant_REDACTED/instance_REDACTED/patients/173a8adf-92e8-4832-8900-027c71b0d768/encounters/d6f4b66e-1be6-403a-ae47-1bbcee264c5e/disposition + response: + body: + string: '{"id": "8cd87974-b1cb-4a6f-8873-71d5d188c4aa", "patientId": "173a8adf-92e8-4832-8900-027c71b0d768", + "cdtId": "c4c7f925-8da1-4e88-93b6-9afd4dda9421", "version": 6, "jsonBody": + {"external_guid": null, "notes": null, "uicedf-treatment": null, "uicedf-review": + "good stuff keep it up", "created_at": "2022-08-09T13:26:18.139Z", "source_type": + "ENCOUNTER", "external_id": null, "created_by_name": "Eddie Cohen", "created_by": + "379298b5-1b4e-48cb-a60f-e6d9cb9a5e65", "updated_by_name": "API_CLIENT:YJTWKVSGOBFE", + "updated_at": "2022-08-09T16:16:14.870Z", "updated_by": "4f576fa5-af07-4473-99ea-6afb4956e243", + "id": "8cd87974-b1cb-4a6f-8873-71d5d188c4aa", "source_id": "d6f4b66e-1be6-403a-ae47-1bbcee264c5e", + "uicedf-next-steps": "take yer pills", "source_name": "__encounter__"}, "cdtName": + "__encounter_disposition__"}' + headers: + Access-Control-Allow-Headers: + - authorization, content-type, xsrf-token, security-role + Access-Control-Allow-Methods: + - GET, POST, PUT, DELETE, PATCH, OPTIONS + Access-Control-Allow-Origin: + - '*' + Access-Control-Expose-Headers: + - xsrf-token + Access-Control-Max-Age: + - '3600' + Cache-Control: + - no-cache, no-store, max-age=0, must-revalidate + Connection: + - keep-alive + Content-Type: + - application/json + Date: + - Tue, 09 Aug 2022 17:24:08 GMT + Expires: + - '0' + Pragma: + - no-cache + Set-Cookie: + - AWSALB=eJMpWDBtpOPrRWc7yPt92V0V4T2ms76VHo4YKw5TyW1g66+oE57JjOrNOLuUZNe7sdtuUggJDBjipS53IGNQwmpqE43tZV2wD7Eg7EDa71e58ip/I/v5qovp9W7n; + Expires=Tue, 16 Aug 2022 17:24:08 GMT; Path=/ + - AWSALBCORS=eJMpWDBtpOPrRWc7yPt92V0V4T2ms76VHo4YKw5TyW1g66+oE57JjOrNOLuUZNe7sdtuUggJDBjipS53IGNQwmpqE43tZV2wD7Eg7EDa71e58ip/I/v5qovp9W7n; + Expires=Tue, 16 Aug 2022 17:24:08 GMT; Path=/; SameSite=None; Secure + Transfer-Encoding: + - chunked + X-Content-Type-Options: + - nosniff + X-XSS-Protection: + - 1; mode=block + status: + code: 200 + message: '' +version: 1 diff --git a/test/cassettes/test_encounter_disposition_update.yaml b/test/cassettes/test_encounter_disposition_update.yaml new file mode 100644 index 0000000..d726a51 --- /dev/null +++ b/test/cassettes/test_encounter_disposition_update.yaml @@ -0,0 +1,140 @@ +interactions: +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Authorization: + - API_TOKEN_bf63c4c2-16af-4e74-9f3a-551c1f35dad2 + Connection: + - keep-alive + Cookie: + - AWSALB=eJMpWDBtpOPrRWc7yPt92V0V4T2ms76VHo4YKw5TyW1g66+oE57JjOrNOLuUZNe7sdtuUggJDBjipS53IGNQwmpqE43tZV2wD7Eg7EDa71e58ip/I/v5qovp9W7n; + AWSALBCORS=eJMpWDBtpOPrRWc7yPt92V0V4T2ms76VHo4YKw5TyW1g66+oE57JjOrNOLuUZNe7sdtuUggJDBjipS53IGNQwmpqE43tZV2wD7Eg7EDa71e58ip/I/v5qovp9W7n + User-Agent: + - python-welkin/0.0.4 + method: GET + uri: https://api.live.welkincloud.io/tenant_REDACTED/instance_REDACTED/patients/173a8adf-92e8-4832-8900-027c71b0d768/encounters/d6f4b66e-1be6-403a-ae47-1bbcee264c5e/disposition + response: + body: + string: '{"id": "8cd87974-b1cb-4a6f-8873-71d5d188c4aa", "patientId": "173a8adf-92e8-4832-8900-027c71b0d768", + "cdtId": "c4c7f925-8da1-4e88-93b6-9afd4dda9421", "version": 6, "jsonBody": + {"external_guid": null, "notes": null, "uicedf-treatment": null, "uicedf-review": + "good stuff keep it up", "created_at": "2022-08-09T13:26:18.139Z", "source_type": + "ENCOUNTER", "external_id": null, "created_by_name": "Eddie Cohen", "created_by": + "379298b5-1b4e-48cb-a60f-e6d9cb9a5e65", "updated_by_name": "API_CLIENT:YJTWKVSGOBFE", + "updated_at": "2022-08-09T16:16:14.870Z", "updated_by": "4f576fa5-af07-4473-99ea-6afb4956e243", + "id": "8cd87974-b1cb-4a6f-8873-71d5d188c4aa", "source_id": "d6f4b66e-1be6-403a-ae47-1bbcee264c5e", + "uicedf-next-steps": "take yer pills", "source_name": "__encounter__"}, "cdtName": + "__encounter_disposition__"}' + headers: + Access-Control-Allow-Headers: + - authorization, content-type, xsrf-token, security-role + Access-Control-Allow-Methods: + - GET, POST, PUT, DELETE, PATCH, OPTIONS + Access-Control-Allow-Origin: + - '*' + Access-Control-Expose-Headers: + - xsrf-token + Access-Control-Max-Age: + - '3600' + Cache-Control: + - no-cache, no-store, max-age=0, must-revalidate + Connection: + - keep-alive + Content-Type: + - application/json + Date: + - Tue, 09 Aug 2022 17:24:49 GMT + Expires: + - '0' + Pragma: + - no-cache + Set-Cookie: + - AWSALB=y/W5844WgrlpJxcE7coBi7A9g/pb0M6WSz8L/2MEQBE+N7AtzJlMqd1BaRc2ja4PmFQkvkbA7ASuFUqzhrFcF+PSLm+CYTcyf4835vX/6QR2ArwTPaICZABXvsaw; + Expires=Tue, 16 Aug 2022 17:24:49 GMT; Path=/ + - AWSALBCORS=y/W5844WgrlpJxcE7coBi7A9g/pb0M6WSz8L/2MEQBE+N7AtzJlMqd1BaRc2ja4PmFQkvkbA7ASuFUqzhrFcF+PSLm+CYTcyf4835vX/6QR2ArwTPaICZABXvsaw; + Expires=Tue, 16 Aug 2022 17:24:49 GMT; Path=/; SameSite=None; Secure + Transfer-Encoding: + - chunked + X-Content-Type-Options: + - nosniff + X-XSS-Protection: + - 1; mode=block + status: + code: 200 + message: '' +- request: + body: '{"uicedf-review": "great health"}' + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Authorization: + - API_TOKEN_bf63c4c2-16af-4e74-9f3a-551c1f35dad2 + Connection: + - keep-alive + Content-Length: + - '33' + Content-Type: + - application/json + Cookie: + - AWSALB=y/W5844WgrlpJxcE7coBi7A9g/pb0M6WSz8L/2MEQBE+N7AtzJlMqd1BaRc2ja4PmFQkvkbA7ASuFUqzhrFcF+PSLm+CYTcyf4835vX/6QR2ArwTPaICZABXvsaw; + AWSALBCORS=y/W5844WgrlpJxcE7coBi7A9g/pb0M6WSz8L/2MEQBE+N7AtzJlMqd1BaRc2ja4PmFQkvkbA7ASuFUqzhrFcF+PSLm+CYTcyf4835vX/6QR2ArwTPaICZABXvsaw + User-Agent: + - python-welkin/0.0.4 + method: PATCH + uri: https://api.live.welkincloud.io/tenant_REDACTED/instance_REDACTED/patients/173a8adf-92e8-4832-8900-027c71b0d768/encounters/d6f4b66e-1be6-403a-ae47-1bbcee264c5e/disposition + response: + body: + string: '{"id": "8cd87974-b1cb-4a6f-8873-71d5d188c4aa", "patientId": "173a8adf-92e8-4832-8900-027c71b0d768", + "cdtId": "c4c7f925-8da1-4e88-93b6-9afd4dda9421", "version": 6, "jsonBody": + {"external_guid": null, "notes": null, "uicedf-treatment": null, "uicedf-review": + "great health", "created_at": "2022-08-09T13:26:18.139Z", "external_id": null, + "source_type": "ENCOUNTER", "created_by_name": "Eddie Cohen", "created_by": + "379298b5-1b4e-48cb-a60f-e6d9cb9a5e65", "updated_by_name": "API_CLIENT:YJTWKVSGOBFE", + "updated_at": "2022-08-09T17:24:49.656Z", "updated_by": "4f576fa5-af07-4473-99ea-6afb4956e243", + "id": "8cd87974-b1cb-4a6f-8873-71d5d188c4aa", "source_id": "d6f4b66e-1be6-403a-ae47-1bbcee264c5e", + "uicedf-next-steps": "take yer pills", "source_name": "__encounter__"}, "cdtName": + "__encounter_disposition__"}' + headers: + Access-Control-Allow-Headers: + - authorization, content-type, xsrf-token, security-role + Access-Control-Allow-Methods: + - GET, POST, PUT, DELETE, PATCH, OPTIONS + Access-Control-Allow-Origin: + - '*' + Access-Control-Expose-Headers: + - xsrf-token + Access-Control-Max-Age: + - '3600' + Cache-Control: + - no-cache, no-store, max-age=0, must-revalidate + Connection: + - keep-alive + Content-Type: + - application/json + Date: + - Tue, 09 Aug 2022 17:24:49 GMT + Expires: + - '0' + Pragma: + - no-cache + Set-Cookie: + - AWSALB=kuD4RYa7pVkuCqiL4LhpqW/jiH6dWXkLShX6Iz+795W2lfAUEnQ7RGzz4wxXZ7GOGrmUYLLL7wJ37KDkMqkBVkyGmFeXrd401iN/TTBhUIcz+69hRTnnN6nAqL+Q; + Expires=Tue, 16 Aug 2022 17:24:49 GMT; Path=/ + - AWSALBCORS=kuD4RYa7pVkuCqiL4LhpqW/jiH6dWXkLShX6Iz+795W2lfAUEnQ7RGzz4wxXZ7GOGrmUYLLL7wJ37KDkMqkBVkyGmFeXrd401iN/TTBhUIcz+69hRTnnN6nAqL+Q; + Expires=Tue, 16 Aug 2022 17:24:49 GMT; Path=/; SameSite=None; Secure + Transfer-Encoding: + - chunked + X-Content-Type-Options: + - nosniff + X-XSS-Protection: + - 1; mode=block + status: + code: 200 + message: '' +version: 1 diff --git a/test/test_authentication.py b/test/test_authentication.py index 422b648..b410c47 100644 --- a/test/test_authentication.py +++ b/test/test_authentication.py @@ -7,6 +7,8 @@ def auth_class(client): auth = client.auth + if auth.tenant != "gh": + auth.tenant = "test_tenant" auth.token_method = lambda: {"token": "API_TOKEN"} return auth diff --git a/test/test_encounters.py b/test/test_encounters.py index bdc8a4e..5f781c7 100644 --- a/test/test_encounters.py +++ b/test/test_encounters.py @@ -3,7 +3,8 @@ import pytest from welkin.exceptions import WelkinHTTPError -from welkin.models.encounter import Assessment, Assessments, Encounter, Encounters +from welkin.models.assessment import Assessment, Assessments +from welkin.models.encounter import Disposition, Encounter, Encounters from welkin.models.user import User UTC = timezone.utc @@ -243,3 +244,52 @@ def test_encounter_assessment_delete(client, vcr_cassette): assert excinfo.value.response.status_code == 404 assert len(vcr_cassette) == 2 + + +@pytest.mark.vcr() +def test_encounter_disposition_get_nested(client, vcr_cassette): + patient = client.Patient(id="173a8adf-92e8-4832-8900-027c71b0d768") + encounter = patient.Encounter(id="d6f4b66e-1be6-403a-ae47-1bbcee264c5e").get( + related_data=True + ) + disposition = encounter.disposition + + assert isinstance(disposition, Disposition) + assert hasattr(disposition, "id") + assert len(vcr_cassette) == 1 + + +@pytest.mark.vcr() +def test_encounter_disposition_get(client, vcr_cassette): + patient = client.Patient(id="173a8adf-92e8-4832-8900-027c71b0d768") + encounter = patient.Encounter(id="d6f4b66e-1be6-403a-ae47-1bbcee264c5e") + disposition = encounter.Disposition().get() + + assert isinstance(disposition, Disposition) + assert disposition.id == "8cd87974-b1cb-4a6f-8873-71d5d188c4aa" + assert len(vcr_cassette) == 1 + + +@pytest.mark.vcr() +def test_encounter_disposition_get_patient_id_encounter_id(client, vcr_cassette): + disposition = client.Disposition().get( + patient_id="173a8adf-92e8-4832-8900-027c71b0d768", + encounter_id="d6f4b66e-1be6-403a-ae47-1bbcee264c5e", + ) + assert isinstance(disposition, Disposition) + assert disposition.id == "8cd87974-b1cb-4a6f-8873-71d5d188c4aa" + assert len(vcr_cassette) == 1 + + +@pytest.mark.vcr() +def test_encounter_disposition_update(client, vcr_cassette): + patient = client.Patient(id="173a8adf-92e8-4832-8900-027c71b0d768") + encounter = patient.Encounter(id="d6f4b66e-1be6-403a-ae47-1bbcee264c5e") + disposition = encounter.Disposition(id="8cd87974-b1cb-4a6f-8873-71d5d188c4aa").get() + + review = disposition.jsonBody["uicedf-review"] + + disposition.update(**{"uicedf-review": "great health"}) + + assert disposition.jsonBody["uicedf-review"] != review + assert len(vcr_cassette) == 2 diff --git a/welkin/models/__init__.py b/welkin/models/__init__.py index 5f49751..8e7f4be 100644 --- a/welkin/models/__init__.py +++ b/welkin/models/__init__.py @@ -7,7 +7,7 @@ ) from welkin.models.calendar import CalendarEvent, CalendarEvents, Schedules from welkin.models.cdt import CDT, CDTs -from welkin.models.encounter import Encounter, Encounters +from welkin.models.encounter import Disposition, Encounter, Encounters from welkin.models.patient import Patient, Patients from welkin.models.user import User, Users @@ -23,6 +23,7 @@ "CalendarEvents", "CDT", "CDTs", + "Disposition", "Encounter", "Encounters", "Patient", diff --git a/welkin/models/assessment.py b/welkin/models/assessment.py index 19f1e2c..0e40750 100644 --- a/welkin/models/assessment.py +++ b/welkin/models/assessment.py @@ -1,10 +1,11 @@ from sys import modules from welkin.models.base import Collection, Resource +from welkin.models.util import EncounterSubResource from welkin.pagination import PageableIterator -class Assessment(Resource): +class Assessment(Resource, EncounterSubResource): def create(self, patient_id: str = None, encounter_id: str = None): patient_id, encounter_id = self.get_patient_encounter_id( patient_id, encounter_id @@ -42,31 +43,10 @@ def delete(self, patient_id: str = None, encounter_id: str = None): f"assessments/{self.id}" ) - @property - def patient_id(self): - if isinstance( - self._parent._parent, getattr(modules["welkin.models"], "Patient") - ): - return self._parent._parent.id - if hasattr(self._parent, "patientId"): - return self._parent.patientId - - # this is the related_data = True case on encounters - return self._parent.encounter.patientId - - def get_patient_encounter_id(self, patient_id, encounter_id): - """Helper to retrieve the necessary patient and encounter Ids""" - if not patient_id: - patient_id = self.patient_id - - if not encounter_id: - encounter_id = self._parent.id - - return patient_id, encounter_id - - -class Assessments(Collection): +class Assessments( + Collection, +): resource = Assessment iterator = PageableIterator diff --git a/welkin/models/encounter.py b/welkin/models/encounter.py index b8d9095..aed47a0 100644 --- a/welkin/models/encounter.py +++ b/welkin/models/encounter.py @@ -2,9 +2,29 @@ from welkin.models.assessment import Assessment, Assessments from welkin.models.base import Collection, Resource +from welkin.models.util import EncounterSubResource, patient_id from welkin.pagination import MetaInfoIterator +class Disposition(Resource, EncounterSubResource): + def get(self, patient_id: str = None, encounter_id: str = None): + patient_id, encounter_id = self.get_patient_encounter_id( + patient_id, encounter_id + ) + return super().get( + f"{self._client.instance}/patients/{patient_id}/encounters/{encounter_id}/disposition" + ) + + def update(self, patient_id: str = None, encounter_id: str = None, **kwargs): + patient_id, encounter_id = self.get_patient_encounter_id( + patient_id, encounter_id + ) + return super().patch( + f"{self._client.instance}/patients/{patient_id}/encounters/{encounter_id}/disposition", + kwargs, + ) + + class EncounterStatus(Enum): OPEN = "OPEN" CANCELLED = "CANCELLED" @@ -13,35 +33,38 @@ class EncounterStatus(Enum): class Encounter(Resource): - subresources = [Assessment, Assessments] + subresources = [Assessment, Assessments, Disposition] nested_objects = { "assessmentLinks": "Assessments", "userRelatedToCalendarEvent": "User", + "disposition": "Disposition", } - def create(self): - return super().post( - f"{self._client.instance}/patients/{self._parent.id}/encounters" - ) + @patient_id + def create(self, patient_id: str = None): + return super().post(f"{self._client.instance}/patients/{patient_id}/encounters") - def get(self, related_data: bool = False): + @patient_id + def get(self, patient_id: str = None, related_data: bool = False): encounters = "encounters" if related_data: encounters = "full-encounters" return super().get( - f"{self._client.instance}/patients/{self._parent.id}/{encounters}/{self.id}" + f"{self._client.instance}/patients/{patient_id}/{encounters}/{self.id}" ) - def update(self, **kwargs): + @patient_id + def update(self, patient_id: str = None, **kwargs): return super().patch( - f"{self._client.instance}/patients/{self._parent.id}/encounters/{self.id}", + f"{self._client.instance}/patients/{patient_id}/encounters/{self.id}", kwargs, ) - def delete(self): + @patient_id + def delete(self, patient_id: str = None): return super().delete( - f"{self._client.instance}/patients/{self._parent.id}/encounters/{self.id}" + f"{self._client.instance}/patients/{patient_id}/encounters/{self.id}" ) diff --git a/welkin/models/util.py b/welkin/models/util.py new file mode 100644 index 0000000..3ba42bb --- /dev/null +++ b/welkin/models/util.py @@ -0,0 +1,47 @@ +from sys import modules + + +class EncounterSubResource: + """Utility class for subresources of Encounters to get patient and encounter ids""" + + @property + def patient_id(self): + if isinstance( + self._parent._parent, + getattr(modules["welkin.models"], "Patient"), + ): + return self._parent._parent.id + + if hasattr(self._parent, "patientId"): + return self._parent.patientId + + # this is the related_data = True case on encounters + return self._parent.encounter.patientId + + def get_patient_encounter_id(self, patient_id, encounter_id): + """Helper to retrieve the necessary patient and encounter Ids""" + if not patient_id: + patient_id = self.patient_id + + if not encounter_id: + encounter_id = self._parent.id + + return patient_id, encounter_id + + +def patient_id(func): + """Wrapper for getting the patient id on patient subresources""" + + def wrapper(cls, *args, **kwargs): + if "patient_id" not in kwargs: + try: + kwargs["patient_id"] = cls._parent.id + except AttributeError: + raise TypeError( + f"{func.__name__} is missing 1 required positional argument: " + "'patient_id" + ) from None + + return func(cls, *args, **kwargs) + + return wrapper