canvas 0.21.0__py3-none-any.whl → 0.22.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of canvas might be problematic. Click here for more details.
- {canvas-0.21.0.dist-info → canvas-0.22.0.dist-info}/METADATA +1 -1
- {canvas-0.21.0.dist-info → canvas-0.22.0.dist-info}/RECORD +26 -20
- canvas_generated/messages/effects_pb2.py +2 -2
- canvas_generated/messages/effects_pb2.pyi +40 -0
- canvas_generated/messages/events_pb2.py +2 -2
- canvas_generated/messages/events_pb2.pyi +108 -0
- canvas_sdk/commands/__init__.py +8 -0
- canvas_sdk/commands/base.py +1 -0
- canvas_sdk/commands/commands/__init__.py +0 -0
- canvas_sdk/commands/commands/adjust_prescription.py +24 -0
- canvas_sdk/commands/commands/imaging_order.py +39 -0
- canvas_sdk/commands/commands/instruct.py +17 -1
- canvas_sdk/commands/commands/lab_order.py +11 -6
- canvas_sdk/commands/commands/prescribe.py +1 -1
- canvas_sdk/commands/commands/questionnaire/__init__.py +102 -0
- canvas_sdk/commands/commands/questionnaire/question.py +134 -0
- canvas_sdk/commands/commands/refer.py +50 -0
- canvas_sdk/commands/commands/refill.py +28 -0
- canvas_sdk/commands/commands/resolve_condition.py +43 -0
- canvas_sdk/commands/constants.py +34 -0
- canvas_sdk/v1/data/condition.py +4 -2
- canvas_sdk/v1/data/medication.py +4 -2
- protobufs/canvas_generated/messages/effects.proto +25 -1
- protobufs/canvas_generated/messages/events.proto +54 -36
- canvas_sdk/commands/commands/questionnaire.py +0 -16
- {canvas-0.21.0.dist-info → canvas-0.22.0.dist-info}/WHEEL +0 -0
- {canvas-0.21.0.dist-info → canvas-0.22.0.dist-info}/entry_points.txt +0 -0
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
from typing import Literal
|
|
2
|
+
from uuid import UUID
|
|
3
|
+
|
|
4
|
+
from django.db.models.expressions import Subquery
|
|
5
|
+
from pydantic import Field
|
|
6
|
+
from pydantic_core import InitErrorDetails
|
|
7
|
+
|
|
8
|
+
from canvas_sdk.commands.base import _BaseCommand as BaseCommand
|
|
9
|
+
from canvas_sdk.v1.data import Condition, Note
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class ResolveConditionCommand(BaseCommand):
|
|
13
|
+
"""A class for managing a ResolveCondition command within a specific note."""
|
|
14
|
+
|
|
15
|
+
class Meta:
|
|
16
|
+
key = "resolveCondition"
|
|
17
|
+
commit_required_fields = ("condition_id",)
|
|
18
|
+
|
|
19
|
+
condition_id: UUID | str | None = None
|
|
20
|
+
show_in_condition_list: bool = False
|
|
21
|
+
rationale: str | None = Field(max_length=1024, default=None)
|
|
22
|
+
|
|
23
|
+
def _get_error_details(
|
|
24
|
+
self, method: Literal["originate", "edit", "delete", "commit", "enter_in_error"]
|
|
25
|
+
) -> list[InitErrorDetails]:
|
|
26
|
+
errors = super()._get_error_details(method)
|
|
27
|
+
|
|
28
|
+
if self.condition_id:
|
|
29
|
+
subquery = Subquery(Note.objects.filter(id=self.note_uuid).values("patient_id")[:1])
|
|
30
|
+
if (
|
|
31
|
+
not Condition.objects.active()
|
|
32
|
+
.filter(id=self.condition_id, patient=subquery)
|
|
33
|
+
.exists()
|
|
34
|
+
):
|
|
35
|
+
errors.append(
|
|
36
|
+
self._create_error_detail(
|
|
37
|
+
"value",
|
|
38
|
+
f"Condition with id {self.condition_id} does not exist.",
|
|
39
|
+
self.condition_id,
|
|
40
|
+
)
|
|
41
|
+
)
|
|
42
|
+
|
|
43
|
+
return errors
|
canvas_sdk/commands/constants.py
CHANGED
|
@@ -1,7 +1,28 @@
|
|
|
1
|
+
from enum import StrEnum
|
|
1
2
|
from typing import NotRequired
|
|
2
3
|
|
|
4
|
+
from pydantic import Field
|
|
3
5
|
from typing_extensions import TypedDict
|
|
4
6
|
|
|
7
|
+
from canvas_sdk.base import Model
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class CodeSystems(StrEnum):
|
|
11
|
+
"""A class representing different code systems and their URLs."""
|
|
12
|
+
|
|
13
|
+
SNOMED = "http://snomed.info/sct"
|
|
14
|
+
RXNORM = "http://www.nlm.nih.gov/research/umls/rxnorm"
|
|
15
|
+
LOINC = "http://loinc.org"
|
|
16
|
+
FDB = "http://www.fdbhealth.com/"
|
|
17
|
+
ICD10 = "ICD-10"
|
|
18
|
+
CVX = "http://hl7.org/fhir/sid/cvx"
|
|
19
|
+
CPT = "http://www.ama-assn.org/go/cpt"
|
|
20
|
+
NUCC = "http://www.nucc.org/"
|
|
21
|
+
NDC = "http://hl7.org/fhir/sid/ndc"
|
|
22
|
+
HCPCS = "http://www.cms.gov/medicare/coding/medhcpcsgeninfo"
|
|
23
|
+
UNITS_OF_MEASURE = "http://unitsofmeasure.org"
|
|
24
|
+
UNSTRUCTURED = "UNSTRUCTURED"
|
|
25
|
+
|
|
5
26
|
|
|
6
27
|
class Coding(TypedDict):
|
|
7
28
|
"""Coding object in Canvas."""
|
|
@@ -16,3 +37,16 @@ class ClinicalQuantity(TypedDict):
|
|
|
16
37
|
|
|
17
38
|
representative_ndc: str
|
|
18
39
|
ncpdp_quantity_qualifier_code: str
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
class ServiceProvider(Model):
|
|
43
|
+
"""ServiceProvider model."""
|
|
44
|
+
|
|
45
|
+
first_name: str = Field(max_length=512)
|
|
46
|
+
last_name: str = Field(max_length=512)
|
|
47
|
+
specialty: str = Field(max_length=512)
|
|
48
|
+
practice_name: str = Field(max_length=512)
|
|
49
|
+
business_fax: str | None = Field(max_length=512, default=None)
|
|
50
|
+
business_phone: str | None = Field(max_length=512, default=None)
|
|
51
|
+
business_address: str | None = Field(max_length=512, default=None)
|
|
52
|
+
notes: str | None = Field(max_length=512, default=None)
|
canvas_sdk/v1/data/condition.py
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
from typing import cast
|
|
1
|
+
from typing import Self, cast
|
|
2
2
|
|
|
3
3
|
from django.db import models
|
|
4
4
|
from django.db.models import TextChoices
|
|
@@ -30,7 +30,9 @@ class ConditionQuerySet(
|
|
|
30
30
|
):
|
|
31
31
|
"""ConditionQuerySet."""
|
|
32
32
|
|
|
33
|
-
|
|
33
|
+
def active(self) -> Self:
|
|
34
|
+
"""Return a queryset that filters for active conditions."""
|
|
35
|
+
return self.committed().filter(clinical_status=ClinicalStatus.ACTIVE)
|
|
34
36
|
|
|
35
37
|
|
|
36
38
|
ConditionManager = BaseModelManager.from_queryset(ConditionQuerySet)
|
canvas_sdk/v1/data/medication.py
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
from typing import cast
|
|
1
|
+
from typing import Self, cast
|
|
2
2
|
|
|
3
3
|
from django.db import models
|
|
4
4
|
from django.db.models import TextChoices
|
|
@@ -21,7 +21,9 @@ class Status(TextChoices):
|
|
|
21
21
|
class MedicationQuerySet(ValueSetLookupQuerySet, CommittableQuerySetMixin, ForPatientQuerySetMixin):
|
|
22
22
|
"""MedicationQuerySet."""
|
|
23
23
|
|
|
24
|
-
|
|
24
|
+
def active(self) -> Self:
|
|
25
|
+
"""Filter by active medications."""
|
|
26
|
+
return self.committed().filter(status=Status.ACTIVE)
|
|
25
27
|
|
|
26
28
|
|
|
27
29
|
MedicationManager = BaseModelManager.from_queryset(MedicationQuerySet)
|
|
@@ -163,6 +163,12 @@ enum EffectType {
|
|
|
163
163
|
COMMIT_CLOSE_GOAL_COMMAND = 131;
|
|
164
164
|
ENTER_IN_ERROR_CLOSE_GOAL_COMMAND = 132;
|
|
165
165
|
|
|
166
|
+
ORIGINATE_REFER_COMMAND = 139;
|
|
167
|
+
EDIT_REFER_COMMAND = 140;
|
|
168
|
+
DELETE_REFER_COMMAND = 141;
|
|
169
|
+
COMMIT_REFER_COMMAND = 142;
|
|
170
|
+
ENTER_IN_ERROR_REFER_COMMAND = 143;
|
|
171
|
+
|
|
166
172
|
CREATE_QUESTIONNAIRE_RESULT = 138;
|
|
167
173
|
|
|
168
174
|
ANNOTATE_PATIENT_CHART_CONDITION_RESULTS = 200;
|
|
@@ -203,6 +209,24 @@ enum EffectType {
|
|
|
203
209
|
COMMIT_FOLLOW_UP_COMMAND = 908;
|
|
204
210
|
ENTER_IN_ERROR_FOLLOW_UP_COMMAND = 909;
|
|
205
211
|
|
|
212
|
+
ORIGINATE_IMAGING_ORDER_COMMAND = 1100;
|
|
213
|
+
EDIT_IMAGING_ORDER_COMMAND = 1101;
|
|
214
|
+
DELETE_IMAGING_ORDER_COMMAND = 1102;
|
|
215
|
+
COMMIT_IMAGING_ORDER_COMMAND = 1103;
|
|
216
|
+
ENTER_IN_ERROR_IMAGING_ORDER_COMMAND = 1104;
|
|
217
|
+
|
|
218
|
+
ORIGINATE_RESOLVE_CONDITION_COMMAND = 1200;
|
|
219
|
+
EDIT_RESOLVE_CONDITION_COMMAND = 1201;
|
|
220
|
+
DELETE_RESOLVE_CONDITION_COMMAND = 1202;
|
|
221
|
+
COMMIT_RESOLVE_CONDITION_COMMAND = 1203;
|
|
222
|
+
ENTER_IN_ERROR_RESOLVE_CONDITION_COMMAND = 1204;
|
|
223
|
+
|
|
224
|
+
ORIGINATE_ADJUST_PRESCRIPTION_COMMAND = 1300;
|
|
225
|
+
EDIT_ADJUST_PRESCRIPTION_COMMAND = 1301;
|
|
226
|
+
DELETE_ADJUST_PRESCRIPTION_COMMAND = 1302;
|
|
227
|
+
COMMIT_ADJUST_PRESCRIPTION_COMMAND = 1303;
|
|
228
|
+
ENTER_IN_ERROR_ADJUST_PRESCRIPTION_COMMAND = 1304;
|
|
229
|
+
|
|
206
230
|
SHOW_ACTION_BUTTON = 1000;
|
|
207
231
|
|
|
208
232
|
PATIENT_PORTAL__INTAKE_FORM_RESULTS = 2000;
|
|
@@ -232,4 +256,4 @@ message Effect {
|
|
|
232
256
|
//Oneof effect_payload {
|
|
233
257
|
// ...
|
|
234
258
|
//}
|
|
235
|
-
}
|
|
259
|
+
}
|
|
@@ -136,18 +136,26 @@ enum EventType {
|
|
|
136
136
|
// ADJUST_DIAGNOSIS_COMMAND__PRE_EXECUTE_ACTION = 1010;
|
|
137
137
|
// ADJUST_DIAGNOSIS_COMMAND__POST_EXECUTE_ACTION = 1011;
|
|
138
138
|
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
139
|
+
ADJUST_PRESCRIPTION_COMMAND__PRE_ORIGINATE = 2000;
|
|
140
|
+
ADJUST_PRESCRIPTION_COMMAND__POST_ORIGINATE = 2001;
|
|
141
|
+
ADJUST_PRESCRIPTION_COMMAND__PRE_UPDATE = 2002;
|
|
142
|
+
ADJUST_PRESCRIPTION_COMMAND__POST_UPDATE = 2003;
|
|
143
|
+
ADJUST_PRESCRIPTION_COMMAND__PRE_COMMIT = 2004;
|
|
144
|
+
ADJUST_PRESCRIPTION_COMMAND__POST_COMMIT = 2005;
|
|
145
|
+
ADJUST_PRESCRIPTION_COMMAND__PRE_DELETE = 2006;
|
|
146
|
+
ADJUST_PRESCRIPTION_COMMAND__POST_DELETE = 2007;
|
|
147
|
+
ADJUST_PRESCRIPTION_COMMAND__PRE_ENTER_IN_ERROR = 2008;
|
|
148
|
+
ADJUST_PRESCRIPTION_COMMAND__POST_ENTER_IN_ERROR = 2009;
|
|
149
|
+
ADJUST_PRESCRIPTION_COMMAND__PRE_EXECUTE_ACTION = 2010;
|
|
150
|
+
ADJUST_PRESCRIPTION_COMMAND__POST_EXECUTE_ACTION = 2011;
|
|
151
|
+
ADJUST_PRESCRIPTION__PRESCRIBE__POST_SEARCH = 2012;
|
|
152
|
+
ADJUST_PRESCRIPTION__PRESCRIBE__PRE_SEARCH = 2013;
|
|
153
|
+
ADJUST_PRESCRIPTION__INDICATIONS__PRE_SEARCH = 2014;
|
|
154
|
+
ADJUST_PRESCRIPTION__INDICATIONS__POST_SEARCH = 2015;
|
|
155
|
+
ADJUST_PRESCRIPTION__PHARMACY__PRE_SEARCH = 2016;
|
|
156
|
+
ADJUST_PRESCRIPTION__PHARMACY__POST_SEARCH = 2017;
|
|
157
|
+
ADJUST_PRESCRIPTION__CHANGE_MEDICATION_TO__PRE_SEARCH = 2018;
|
|
158
|
+
ADJUST_PRESCRIPTION__CHANGE_MEDICATION_TO__POST_SEARCH = 2019;
|
|
151
159
|
|
|
152
160
|
// ADJUST_PROTOCOL_COMMAND__PRE_ORIGINATE = 3000;
|
|
153
161
|
// ADJUST_PROTOCOL_COMMAND__POST_ORIGINATE = 3001;
|
|
@@ -683,18 +691,26 @@ enum EventType {
|
|
|
683
691
|
REASON_FOR_VISIT__CODING__POST_SEARCH = 35012;
|
|
684
692
|
REASON_FOR_VISIT__CODING__PRE_SEARCH = 35013;
|
|
685
693
|
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
694
|
+
REFER_COMMAND__PRE_ORIGINATE = 36000;
|
|
695
|
+
REFER_COMMAND__POST_ORIGINATE = 36001;
|
|
696
|
+
REFER_COMMAND__PRE_UPDATE = 36002;
|
|
697
|
+
REFER_COMMAND__POST_UPDATE = 36003;
|
|
698
|
+
REFER_COMMAND__PRE_COMMIT = 36004;
|
|
699
|
+
REFER_COMMAND__POST_COMMIT = 36005;
|
|
700
|
+
REFER_COMMAND__PRE_DELETE = 36006;
|
|
701
|
+
REFER_COMMAND__POST_DELETE = 36007;
|
|
702
|
+
REFER_COMMAND__PRE_ENTER_IN_ERROR = 36008;
|
|
703
|
+
REFER_COMMAND__POST_ENTER_IN_ERROR = 36009;
|
|
704
|
+
REFER_COMMAND__PRE_EXECUTE_ACTION = 36010;
|
|
705
|
+
REFER_COMMAND__POST_EXECUTE_ACTION = 36011;
|
|
706
|
+
REFER_COMMAND__REFER_TO__POST_SEARCH = 36012;
|
|
707
|
+
REFER_COMMAND__REFER_TO__PRE_SEARCH = 36013;
|
|
708
|
+
REFER_COMMAND__INDICATIONS__POST_SEARCH = 36014;
|
|
709
|
+
REFER_COMMAND__INDICATIONS__PRE_SEARCH = 36015;
|
|
710
|
+
REFER_COMMAND__DOCUMENTS_TO_INCLUDE__POST_SEARCH = 36016;
|
|
711
|
+
REFER_COMMAND__DOCUMENTS_TO_INCLUDE__PRE_SEARCH = 36017;
|
|
712
|
+
REFER_COMMAND__LINKED_ITEMS__POST_SEARCH = 36018;
|
|
713
|
+
REFER_COMMAND__LINKED_ITEMS_INCLUDE__PRE_SEARCH = 36019;
|
|
698
714
|
|
|
699
715
|
// REFERENCE_COMMAND__PRE_ORIGINATE = 37000;
|
|
700
716
|
// REFERENCE_COMMAND__POST_ORIGINATE = 37001;
|
|
@@ -758,18 +774,20 @@ enum EventType {
|
|
|
758
774
|
REMOVE_ALLERGY__ALLERGY__PRE_SEARCH = 40012;
|
|
759
775
|
REMOVE_ALLERGY__ALLERGY__POST_SEARCH = 40013;
|
|
760
776
|
|
|
761
|
-
|
|
762
|
-
|
|
763
|
-
|
|
764
|
-
|
|
765
|
-
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
|
|
769
|
-
|
|
770
|
-
|
|
771
|
-
|
|
772
|
-
|
|
777
|
+
RESOLVE_CONDITION_COMMAND__PRE_ORIGINATE = 41000;
|
|
778
|
+
RESOLVE_CONDITION_COMMAND__POST_ORIGINATE = 41001;
|
|
779
|
+
RESOLVE_CONDITION_COMMAND__PRE_UPDATE = 41002;
|
|
780
|
+
RESOLVE_CONDITION_COMMAND__POST_UPDATE = 41003;
|
|
781
|
+
RESOLVE_CONDITION_COMMAND__PRE_COMMIT = 41004;
|
|
782
|
+
RESOLVE_CONDITION_COMMAND__POST_COMMIT = 41005;
|
|
783
|
+
RESOLVE_CONDITION_COMMAND__PRE_DELETE = 41006;
|
|
784
|
+
RESOLVE_CONDITION_COMMAND__POST_DELETE = 41007;
|
|
785
|
+
RESOLVE_CONDITION_COMMAND__PRE_ENTER_IN_ERROR = 41008;
|
|
786
|
+
RESOLVE_CONDITION_COMMAND__POST_ENTER_IN_ERROR = 41009;
|
|
787
|
+
RESOLVE_CONDITION_COMMAND__PRE_EXECUTE_ACTION = 41010;
|
|
788
|
+
RESOLVE_CONDITION_COMMAND__POST_EXECUTE_ACTION = 41011;
|
|
789
|
+
RESOLVE_CONDITION__CONDITION__PRE_SEARCH = 41012;
|
|
790
|
+
RESOLVE_CONDITION__CONDITION__POST_SEARCH = 41013;
|
|
773
791
|
|
|
774
792
|
ROS_COMMAND__PRE_ORIGINATE = 42000;
|
|
775
793
|
ROS_COMMAND__POST_ORIGINATE = 42001;
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
from pydantic import Field
|
|
2
|
-
|
|
3
|
-
from canvas_sdk.commands.base import _BaseCommand
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
class QuestionnaireCommand(_BaseCommand):
|
|
7
|
-
"""A class for managing a Questionnaire command within a specific note."""
|
|
8
|
-
|
|
9
|
-
class Meta:
|
|
10
|
-
key = "questionnaire"
|
|
11
|
-
commit_required_fields = ("questionnaire_id",)
|
|
12
|
-
|
|
13
|
-
questionnaire_id: str | None = Field(
|
|
14
|
-
default=None, json_schema_extra={"commands_api_name": "questionnaire"}
|
|
15
|
-
)
|
|
16
|
-
result: str | None = None
|
|
File without changes
|
|
File without changes
|