canvas 0.63.0__py3-none-any.whl → 0.89.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.
Files changed (185) hide show
  1. {canvas-0.63.0.dist-info → canvas-0.89.0.dist-info}/METADATA +4 -1
  2. {canvas-0.63.0.dist-info → canvas-0.89.0.dist-info}/RECORD +184 -98
  3. {canvas-0.63.0.dist-info → canvas-0.89.0.dist-info}/WHEEL +1 -1
  4. canvas_cli/apps/emit/event_fixtures/UNKNOWN.ndjson +1 -0
  5. canvas_cli/apps/logs/logs.py +386 -22
  6. canvas_cli/main.py +3 -1
  7. canvas_cli/templates/plugins/default/{{ cookiecutter.__project_slug }}/tests/test_models.py +46 -4
  8. canvas_cli/utils/context/context.py +13 -13
  9. canvas_cli/utils/validators/manifest_schema.py +26 -1
  10. canvas_generated/messages/effects_pb2.py +5 -5
  11. canvas_generated/messages/effects_pb2.pyi +108 -2
  12. canvas_generated/messages/events_pb2.py +6 -6
  13. canvas_generated/messages/events_pb2.pyi +282 -2
  14. canvas_sdk/clients/__init__.py +1 -0
  15. canvas_sdk/clients/llms/__init__.py +17 -0
  16. canvas_sdk/clients/llms/libraries/__init__.py +11 -0
  17. canvas_sdk/clients/llms/libraries/llm_anthropic.py +87 -0
  18. canvas_sdk/clients/llms/libraries/llm_api.py +143 -0
  19. canvas_sdk/clients/llms/libraries/llm_google.py +92 -0
  20. canvas_sdk/clients/llms/libraries/llm_openai.py +98 -0
  21. canvas_sdk/clients/llms/structures/__init__.py +9 -0
  22. canvas_sdk/clients/llms/structures/llm_response.py +33 -0
  23. canvas_sdk/clients/llms/structures/llm_tokens.py +53 -0
  24. canvas_sdk/clients/llms/structures/llm_turn.py +47 -0
  25. canvas_sdk/clients/llms/structures/settings/__init__.py +13 -0
  26. canvas_sdk/clients/llms/structures/settings/llm_settings.py +27 -0
  27. canvas_sdk/clients/llms/structures/settings/llm_settings_anthropic.py +43 -0
  28. canvas_sdk/clients/llms/structures/settings/llm_settings_gemini.py +40 -0
  29. canvas_sdk/clients/llms/structures/settings/llm_settings_gpt4.py +40 -0
  30. canvas_sdk/clients/llms/structures/settings/llm_settings_gpt5.py +48 -0
  31. canvas_sdk/clients/third_party.py +3 -0
  32. canvas_sdk/commands/__init__.py +12 -0
  33. canvas_sdk/commands/base.py +33 -2
  34. canvas_sdk/commands/commands/adjust_prescription.py +4 -0
  35. canvas_sdk/commands/commands/custom_command.py +86 -0
  36. canvas_sdk/commands/commands/family_history.py +17 -1
  37. canvas_sdk/commands/commands/immunization_statement.py +42 -2
  38. canvas_sdk/commands/commands/medication_statement.py +16 -1
  39. canvas_sdk/commands/commands/past_surgical_history.py +16 -1
  40. canvas_sdk/commands/commands/perform.py +18 -1
  41. canvas_sdk/commands/commands/prescribe.py +8 -9
  42. canvas_sdk/commands/commands/refill.py +5 -5
  43. canvas_sdk/commands/commands/resolve_condition.py +5 -5
  44. canvas_sdk/commands/commands/review/__init__.py +3 -0
  45. canvas_sdk/commands/commands/review/base.py +72 -0
  46. canvas_sdk/commands/commands/review/imaging.py +13 -0
  47. canvas_sdk/commands/commands/review/lab.py +13 -0
  48. canvas_sdk/commands/commands/review/referral.py +13 -0
  49. canvas_sdk/commands/commands/review/uncategorized_document.py +13 -0
  50. canvas_sdk/commands/validation.py +43 -0
  51. canvas_sdk/effects/batch_originate.py +22 -0
  52. canvas_sdk/effects/calendar/__init__.py +13 -3
  53. canvas_sdk/effects/calendar/{create_calendar.py → calendar.py} +19 -5
  54. canvas_sdk/effects/calendar/event.py +172 -0
  55. canvas_sdk/effects/claim_label.py +93 -0
  56. canvas_sdk/effects/claim_line_item.py +47 -0
  57. canvas_sdk/effects/claim_queue.py +49 -0
  58. canvas_sdk/effects/fax/__init__.py +3 -0
  59. canvas_sdk/effects/fax/base.py +77 -0
  60. canvas_sdk/effects/fax/note.py +42 -0
  61. canvas_sdk/effects/metadata.py +15 -1
  62. canvas_sdk/effects/note/__init__.py +8 -1
  63. canvas_sdk/effects/note/appointment.py +135 -7
  64. canvas_sdk/effects/note/base.py +17 -0
  65. canvas_sdk/effects/note/message.py +22 -14
  66. canvas_sdk/effects/note/note.py +150 -1
  67. canvas_sdk/effects/observation/__init__.py +11 -0
  68. canvas_sdk/effects/observation/base.py +206 -0
  69. canvas_sdk/effects/patient/__init__.py +2 -0
  70. canvas_sdk/effects/patient/base.py +8 -0
  71. canvas_sdk/effects/payment/__init__.py +11 -0
  72. canvas_sdk/effects/payment/base.py +355 -0
  73. canvas_sdk/effects/payment/post_claim_payment.py +49 -0
  74. canvas_sdk/effects/send_contact_verification.py +42 -0
  75. canvas_sdk/effects/task/__init__.py +2 -1
  76. canvas_sdk/effects/task/task.py +30 -0
  77. canvas_sdk/effects/validation/__init__.py +3 -0
  78. canvas_sdk/effects/validation/base.py +92 -0
  79. canvas_sdk/events/base.py +15 -0
  80. canvas_sdk/handlers/application.py +7 -7
  81. canvas_sdk/handlers/simple_api/api.py +1 -4
  82. canvas_sdk/handlers/simple_api/websocket.py +1 -4
  83. canvas_sdk/handlers/utils.py +14 -0
  84. canvas_sdk/questionnaires/utils.py +1 -0
  85. canvas_sdk/templates/utils.py +17 -4
  86. canvas_sdk/test_utils/factories/FACTORY_GUIDE.md +362 -0
  87. canvas_sdk/test_utils/factories/__init__.py +115 -0
  88. canvas_sdk/test_utils/factories/calendar.py +24 -0
  89. canvas_sdk/test_utils/factories/claim.py +81 -0
  90. canvas_sdk/test_utils/factories/claim_diagnosis_code.py +16 -0
  91. canvas_sdk/test_utils/factories/coverage.py +17 -0
  92. canvas_sdk/test_utils/factories/imaging.py +74 -0
  93. canvas_sdk/test_utils/factories/lab.py +192 -0
  94. canvas_sdk/test_utils/factories/medication_history.py +75 -0
  95. canvas_sdk/test_utils/factories/note.py +52 -0
  96. canvas_sdk/test_utils/factories/organization.py +50 -0
  97. canvas_sdk/test_utils/factories/practicelocation.py +88 -0
  98. canvas_sdk/test_utils/factories/referral.py +81 -0
  99. canvas_sdk/test_utils/factories/staff.py +111 -0
  100. canvas_sdk/test_utils/factories/task.py +66 -0
  101. canvas_sdk/test_utils/factories/uncategorized_clinical_document.py +48 -0
  102. canvas_sdk/utils/metrics.py +4 -1
  103. canvas_sdk/v1/data/__init__.py +66 -7
  104. canvas_sdk/v1/data/allergy_intolerance.py +5 -11
  105. canvas_sdk/v1/data/appointment.py +18 -4
  106. canvas_sdk/v1/data/assessment.py +2 -12
  107. canvas_sdk/v1/data/banner_alert.py +2 -4
  108. canvas_sdk/v1/data/base.py +53 -14
  109. canvas_sdk/v1/data/billing.py +8 -11
  110. canvas_sdk/v1/data/calendar.py +64 -0
  111. canvas_sdk/v1/data/care_team.py +4 -10
  112. canvas_sdk/v1/data/claim.py +172 -66
  113. canvas_sdk/v1/data/claim_diagnosis_code.py +19 -0
  114. canvas_sdk/v1/data/claim_line_item.py +2 -5
  115. canvas_sdk/v1/data/coding.py +19 -0
  116. canvas_sdk/v1/data/command.py +2 -4
  117. canvas_sdk/v1/data/common.py +10 -0
  118. canvas_sdk/v1/data/compound_medication.py +3 -4
  119. canvas_sdk/v1/data/condition.py +4 -9
  120. canvas_sdk/v1/data/coverage.py +66 -26
  121. canvas_sdk/v1/data/detected_issue.py +20 -20
  122. canvas_sdk/v1/data/device.py +2 -14
  123. canvas_sdk/v1/data/discount.py +2 -5
  124. canvas_sdk/v1/data/encounter.py +44 -0
  125. canvas_sdk/v1/data/facility.py +1 -0
  126. canvas_sdk/v1/data/goal.py +2 -14
  127. canvas_sdk/v1/data/imaging.py +4 -30
  128. canvas_sdk/v1/data/immunization.py +7 -15
  129. canvas_sdk/v1/data/lab.py +12 -65
  130. canvas_sdk/v1/data/line_item_transaction.py +2 -5
  131. canvas_sdk/v1/data/medication.py +3 -8
  132. canvas_sdk/v1/data/medication_history.py +142 -0
  133. canvas_sdk/v1/data/medication_statement.py +41 -0
  134. canvas_sdk/v1/data/message.py +4 -8
  135. canvas_sdk/v1/data/note.py +37 -38
  136. canvas_sdk/v1/data/observation.py +9 -36
  137. canvas_sdk/v1/data/organization.py +70 -9
  138. canvas_sdk/v1/data/patient.py +8 -12
  139. canvas_sdk/v1/data/patient_consent.py +4 -14
  140. canvas_sdk/v1/data/payment_collection.py +2 -5
  141. canvas_sdk/v1/data/posting.py +3 -9
  142. canvas_sdk/v1/data/practicelocation.py +66 -7
  143. canvas_sdk/v1/data/protocol_override.py +3 -4
  144. canvas_sdk/v1/data/protocol_result.py +3 -3
  145. canvas_sdk/v1/data/questionnaire.py +10 -26
  146. canvas_sdk/v1/data/reason_for_visit.py +2 -6
  147. canvas_sdk/v1/data/referral.py +41 -17
  148. canvas_sdk/v1/data/staff.py +34 -26
  149. canvas_sdk/v1/data/stop_medication_event.py +27 -0
  150. canvas_sdk/v1/data/task.py +30 -11
  151. canvas_sdk/v1/data/team.py +2 -4
  152. canvas_sdk/v1/data/uncategorized_clinical_document.py +84 -0
  153. canvas_sdk/v1/data/user.py +14 -0
  154. canvas_sdk/v1/data/utils.py +5 -0
  155. canvas_sdk/value_set/v2026/__init__.py +1 -0
  156. canvas_sdk/value_set/v2026/adverse_event.py +157 -0
  157. canvas_sdk/value_set/v2026/allergy.py +116 -0
  158. canvas_sdk/value_set/v2026/assessment.py +466 -0
  159. canvas_sdk/value_set/v2026/communication.py +496 -0
  160. canvas_sdk/value_set/v2026/condition.py +52934 -0
  161. canvas_sdk/value_set/v2026/device.py +315 -0
  162. canvas_sdk/value_set/v2026/diagnostic_study.py +5243 -0
  163. canvas_sdk/value_set/v2026/encounter.py +2714 -0
  164. canvas_sdk/value_set/v2026/immunization.py +297 -0
  165. canvas_sdk/value_set/v2026/individual_characteristic.py +339 -0
  166. canvas_sdk/value_set/v2026/intervention.py +1703 -0
  167. canvas_sdk/value_set/v2026/laboratory_test.py +1831 -0
  168. canvas_sdk/value_set/v2026/medication.py +8218 -0
  169. canvas_sdk/value_set/v2026/no_qdm_category_assigned.py +26493 -0
  170. canvas_sdk/value_set/v2026/physical_exam.py +342 -0
  171. canvas_sdk/value_set/v2026/procedure.py +27869 -0
  172. canvas_sdk/value_set/v2026/symptom.py +625 -0
  173. logger/logger.py +30 -31
  174. logger/logstash.py +282 -0
  175. logger/pubsub.py +26 -0
  176. plugin_runner/allowed-module-imports.json +940 -9
  177. plugin_runner/generate_allowed_imports.py +1 -0
  178. plugin_runner/installation.py +2 -2
  179. plugin_runner/plugin_runner.py +21 -24
  180. plugin_runner/sandbox.py +34 -0
  181. protobufs/canvas_generated/messages/effects.proto +65 -0
  182. protobufs/canvas_generated/messages/events.proto +150 -51
  183. settings.py +27 -11
  184. canvas_sdk/effects/calendar/create_event.py +0 -43
  185. {canvas-0.63.0.dist-info → canvas-0.89.0.dist-info}/entry_points.txt +0 -0
@@ -1,7 +1,9 @@
1
+ from datetime import date
2
+
1
3
  from django.contrib.postgres.fields import ArrayField
2
4
  from django.db import models
3
5
 
4
- from canvas_sdk.v1.data.base import IdentifiableModel, Model
6
+ from canvas_sdk.v1.data.base import IdentifiableModel, Model, TimestampedModel
5
7
  from canvas_sdk.v1.data.common import (
6
8
  AddressState,
7
9
  AddressType,
@@ -12,6 +14,16 @@ from canvas_sdk.v1.data.common import (
12
14
  )
13
15
 
14
16
 
17
+ class CoverageRank(models.IntegerChoices):
18
+ """CoverageRank."""
19
+
20
+ PRIMARY = 1, "Primary"
21
+ SECONDARY = 2, "Secondary"
22
+ TERTIARY = 3, "Tertiary"
23
+ QUATERNARY = 4, "Quaternary"
24
+ QUINARY = 5, "Quinary"
25
+
26
+
15
27
  class CoverageStack(models.TextChoices):
16
28
  """CoverageStack."""
17
29
 
@@ -145,14 +157,12 @@ class TransactorType(models.TextChoices):
145
157
  BCBS = "bcbs", "Blue Cross Blue Shield"
146
158
 
147
159
 
148
- class Coverage(IdentifiableModel):
160
+ class Coverage(TimestampedModel, IdentifiableModel):
149
161
  """Coverage."""
150
162
 
151
163
  class Meta:
152
164
  db_table = "canvas_sdk_data_api_coverage_001"
153
165
 
154
- created = models.DateTimeField(auto_now_add=True)
155
- modified = models.DateTimeField(auto_now=True)
156
166
  patient = models.ForeignKey(
157
167
  "v1.Patient", on_delete=models.DO_NOTHING, related_name="coverages", null=True
158
168
  )
@@ -163,34 +173,54 @@ class Coverage(IdentifiableModel):
163
173
  "v1.Patient", on_delete=models.DO_NOTHING, related_name="subscribed_coverages", null=True
164
174
  )
165
175
  patient_relationship_to_subscriber = models.CharField(
166
- choices=CoverageRelationshipCode.choices, max_length=2
176
+ choices=CoverageRelationshipCode.choices,
177
+ max_length=2,
178
+ default=CoverageRelationshipCode.SELF,
167
179
  )
168
180
  issuer = models.ForeignKey(
169
181
  "v1.Transactor", on_delete=models.DO_NOTHING, related_name="coverages", null=True
170
182
  )
171
- id_number = models.CharField(max_length=100)
172
- plan = models.CharField(max_length=255)
173
- sub_plan = models.CharField(max_length=255)
174
- group = models.CharField(max_length=255)
175
- sub_group = models.CharField(max_length=255)
176
- employer = models.CharField(max_length=255)
177
- coverage_start_date = models.DateField()
178
- coverage_end_date = models.DateField()
179
- coverage_rank = models.IntegerField()
180
- state = models.CharField(choices=CoverageState.choices, max_length=20)
181
- plan_type = models.CharField(choices=CoverageType.choices, max_length=20)
182
- coverage_type = models.CharField(choices=TransactorCoverageType.choices, max_length=64)
183
+ id_number = models.CharField(max_length=100, blank=True, default="")
184
+ plan = models.CharField(max_length=255, blank=True, default="")
185
+ sub_plan = models.CharField(max_length=255, blank=True, default="")
186
+ group = models.CharField(max_length=255, default="", blank=True)
187
+ sub_group = models.CharField(max_length=255, default="", blank=True)
188
+ employer = models.CharField(max_length=255, default="", blank=True)
189
+ coverage_start_date = models.DateField(default=date.today)
190
+ coverage_end_date = models.DateField(null=True)
191
+ coverage_rank = models.IntegerField(choices=CoverageRank.choices, default=CoverageRank.PRIMARY)
192
+ state = models.CharField(
193
+ choices=CoverageState.choices, max_length=20, default=CoverageState.ACTIVE
194
+ )
195
+ plan_type = models.CharField(
196
+ choices=CoverageType.choices, max_length=20, default=CoverageType.COMMERCIAL
197
+ )
198
+ coverage_type = models.CharField(
199
+ choices=TransactorCoverageType.choices, max_length=64, null=True, blank=True
200
+ )
183
201
  issuer_address = models.ForeignKey(
184
202
  "v1.TransactorAddress",
185
203
  on_delete=models.DO_NOTHING,
186
204
  related_name="coverages",
187
205
  null=True,
206
+ blank=True,
188
207
  )
189
208
  issuer_phone = models.ForeignKey(
190
- "v1.TransactorPhone", on_delete=models.DO_NOTHING, related_name="coverages", null=True
209
+ "v1.TransactorPhone",
210
+ on_delete=models.DO_NOTHING,
211
+ related_name="coverages",
212
+ null=True,
213
+ blank=True,
214
+ )
215
+ comments = models.TextField(default="", blank=True)
216
+ stack = models.CharField(
217
+ choices=CoverageStack.choices,
218
+ default=CoverageStack.IN_USE,
219
+ max_length=8,
220
+ db_index=True,
191
221
  )
192
- comments = models.TextField()
193
- stack = models.CharField(choices=CoverageStack.choices, max_length=8)
222
+ comments = models.TextField(default="", blank=True)
223
+ subscriber_identifier = models.CharField(max_length=100, blank=True, default="")
194
224
 
195
225
  def __str__(self) -> str:
196
226
  return f"id={self.id}"
@@ -236,14 +266,12 @@ class Transactor(Model):
236
266
  )
237
267
 
238
268
 
239
- class TransactorAddress(IdentifiableModel):
269
+ class TransactorAddress(TimestampedModel, IdentifiableModel):
240
270
  """TransactorAddress."""
241
271
 
242
272
  class Meta:
243
273
  db_table = "canvas_sdk_data_quality_and_revenue_transactoraddress_001"
244
274
 
245
- created = models.DateTimeField(auto_now_add=True)
246
- modified = models.DateTimeField(auto_now=True)
247
275
  line1 = models.CharField(max_length=255)
248
276
  line2 = models.CharField(max_length=255)
249
277
  city = models.CharField(max_length=255)
@@ -266,14 +294,12 @@ class TransactorAddress(IdentifiableModel):
266
294
  return f"id={self.id}"
267
295
 
268
296
 
269
- class TransactorPhone(IdentifiableModel):
297
+ class TransactorPhone(TimestampedModel, IdentifiableModel):
270
298
  """TransactorPhone."""
271
299
 
272
300
  class Meta:
273
301
  db_table = "canvas_sdk_data_quality_and_revenue_transactorphone_001"
274
302
 
275
- created = models.DateTimeField(auto_now_add=True)
276
- modified = models.DateTimeField(auto_now=True)
277
303
  system = models.CharField(choices=ContactPointSystem.choices, max_length=20)
278
304
  value = models.CharField(max_length=100)
279
305
  use = models.CharField(choices=ContactPointUse.choices, max_length=20)
@@ -288,11 +314,25 @@ class TransactorPhone(IdentifiableModel):
288
314
  return f"id={self.id}"
289
315
 
290
316
 
317
+ class EligibilitySummary(TimestampedModel, IdentifiableModel):
318
+ """EligibilitySummary."""
319
+
320
+ class Meta:
321
+ db_table = "canvas_sdk_data_quality_and_revenue_eligibilitysummary_001"
322
+
323
+ coverage = models.OneToOneField(
324
+ "v1.Coverage", on_delete=models.CASCADE, related_name="eligibility_summary"
325
+ )
326
+ copay_cents = models.IntegerField(null=True)
327
+ coinsurance = models.IntegerField(null=True)
328
+
329
+
291
330
  __exports__ = (
292
331
  "CoverageStack",
293
332
  "CoverageState",
294
333
  "CoverageType",
295
334
  "CoverageRelationshipCode",
335
+ "EligibilitySummary",
296
336
  "TransactorCoverageType",
297
337
  "TransactorType",
298
338
  "Coverage",
@@ -1,50 +1,50 @@
1
1
  from django.db import models
2
2
 
3
- from canvas_sdk.v1.data.base import IdentifiableModel
3
+ from canvas_sdk.v1.data.base import AuditedModel, IdentifiableModel
4
+ from canvas_sdk.v1.data.coding import Coding
4
5
 
5
6
 
6
- class DetectedIssue(IdentifiableModel):
7
+ class DetectedIssue(AuditedModel, IdentifiableModel):
7
8
  """DetectedIssue."""
8
9
 
9
10
  class Meta:
10
11
  db_table = "canvas_sdk_data_api_detectedissue_001"
11
12
 
13
+ class Status(models.TextChoices):
14
+ REGISTERED = "registered", "Registered"
15
+ PRELIMINARY = "preliminary", "Preliminary"
16
+ CANCELLED = "cancelled", "Cancelled"
17
+ AMENDED = "amended", "Amended"
18
+ FINAL = "final", "Final"
19
+ CORRECTED = "corrected", "Corrected"
20
+ ENTERED_IN_ERROR = "entered-in-error", "Entered in Error"
21
+
22
+ class Severity(models.TextChoices):
23
+ HIGH = "high", "High"
24
+ MODERATE = "moderate", "Moderate"
25
+ LOW = "low", "Low"
26
+
12
27
  created = models.DateTimeField(auto_now_add=True)
13
28
  modified = models.DateTimeField(auto_now=True)
14
29
  identified = models.DateTimeField()
15
- deleted = models.BooleanField()
16
- originator = models.ForeignKey(
17
- "v1.CanvasUser", on_delete=models.DO_NOTHING, null=True, related_name="+"
18
- )
19
- committer = models.ForeignKey(
20
- "v1.CanvasUser", on_delete=models.DO_NOTHING, null=True, related_name="+"
21
- )
22
- entered_in_error = models.ForeignKey(
23
- "v1.CanvasUser", on_delete=models.DO_NOTHING, null=True, related_name="+"
24
- )
25
30
  patient = models.ForeignKey(
26
31
  "v1.Patient", on_delete=models.DO_NOTHING, related_name="detected_issues", null=True
27
32
  )
28
33
  code = models.CharField(max_length=20)
29
- status = models.CharField(max_length=16)
30
- severity = models.CharField(max_length=10)
34
+ status = models.CharField(max_length=16, choices=Status.choices)
35
+ severity = models.CharField(max_length=10, choices=Severity.choices, blank=True, default="")
31
36
  reference = models.CharField(max_length=200)
32
37
  issue_identifier = models.CharField(max_length=255)
33
38
  issue_identifier_system = models.CharField(max_length=255)
34
39
  detail = models.TextField()
35
40
 
36
41
 
37
- class DetectedIssueEvidence(IdentifiableModel):
42
+ class DetectedIssueEvidence(IdentifiableModel, Coding):
38
43
  """DetectedIssueEvidence."""
39
44
 
40
45
  class Meta:
41
46
  db_table = "canvas_sdk_data_api_detectedissueevidence_001"
42
47
 
43
- system = models.CharField(max_length=255)
44
- version = models.CharField(max_length=255)
45
- code = models.CharField(max_length=255)
46
- display = models.CharField(max_length=1000)
47
- user_selected = models.BooleanField()
48
48
  detected_issue = models.ForeignKey(
49
49
  DetectedIssue,
50
50
  on_delete=models.DO_NOTHING,
@@ -1,30 +1,18 @@
1
1
  from django.db import models
2
2
 
3
- from canvas_sdk.v1.data.base import IdentifiableModel
3
+ from canvas_sdk.v1.data.base import AuditedModel, IdentifiableModel
4
4
 
5
5
 
6
- class Device(IdentifiableModel):
6
+ class Device(AuditedModel, IdentifiableModel):
7
7
  """Device."""
8
8
 
9
9
  class Meta:
10
10
  db_table = "canvas_sdk_data_api_device_001"
11
11
 
12
- created = models.DateTimeField(auto_now_add=True)
13
- modified = models.DateTimeField(auto_now=True)
14
- originator = models.ForeignKey(
15
- "v1.CanvasUser", on_delete=models.DO_NOTHING, null=True, related_name="+"
16
- )
17
- committer = models.ForeignKey(
18
- "v1.CanvasUser", on_delete=models.DO_NOTHING, null=True, related_name="+"
19
- )
20
- entered_in_error = models.ForeignKey(
21
- "v1.CanvasUser", on_delete=models.DO_NOTHING, null=True, related_name="+"
22
- )
23
12
  patient = models.ForeignKey(
24
13
  "v1.Patient", on_delete=models.DO_NOTHING, related_name="devices", null=True
25
14
  )
26
15
  note_id = models.BigIntegerField()
27
- deleted = models.BooleanField()
28
16
  labeled_contains_NRL = models.BooleanField()
29
17
  assigning_authority = models.CharField(max_length=255)
30
18
  scoping_entity = models.CharField(max_length=255)
@@ -1,9 +1,9 @@
1
1
  from django.db import models
2
2
 
3
- from canvas_sdk.v1.data.base import Model
3
+ from canvas_sdk.v1.data.base import TimestampedModel
4
4
 
5
5
 
6
- class Discount(Model):
6
+ class Discount(TimestampedModel):
7
7
  """Model to represent a discount applied to a claim or patient posting."""
8
8
 
9
9
  class Meta:
@@ -14,8 +14,5 @@ class Discount(Model):
14
14
  adjustment_code = models.CharField(max_length=3)
15
15
  discount = models.DecimalField(max_digits=8, decimal_places=2)
16
16
 
17
- created = models.DateTimeField(auto_now_add=True)
18
- modified = models.DateTimeField(auto_now=True)
19
-
20
17
 
21
18
  __exports__ = ("Discount",)
@@ -0,0 +1,44 @@
1
+ from django.db import models
2
+ from django.utils import timezone
3
+
4
+ from canvas_sdk.v1.data.base import IdentifiableModel, TimestampedModel
5
+
6
+
7
+ class EncounterMedium(models.TextChoices):
8
+ """Encounter medium."""
9
+
10
+ VOICE = "voice", "Telephone visit"
11
+ VIDEO = "video", "Video visit"
12
+ OFFICE = "office", "Office visit"
13
+ HOME = "home", "Home visit"
14
+ OFFSITE = "offsite", "Other offsite visit"
15
+ LAB = "lab", "Lab visit"
16
+
17
+
18
+ class EncounterState(models.TextChoices):
19
+ """Encounter state."""
20
+
21
+ STARTED = "STA", "Started"
22
+ PLANNED = "PLA", "Planned"
23
+ CONCLUDED = "CON", "Concluded"
24
+ CANCELLED = "CAN", "Cancelled"
25
+
26
+
27
+ class Encounter(TimestampedModel, IdentifiableModel):
28
+ """Encounter."""
29
+
30
+ class Meta:
31
+ db_table = "canvas_sdk_data_api_encounter_001"
32
+
33
+ note = models.OneToOneField("v1.Note", on_delete=models.CASCADE, related_name="encounter")
34
+ medium = models.CharField(choices=EncounterMedium.choices, max_length=20)
35
+ state = models.CharField(max_length=3, choices=EncounterState.choices)
36
+ start_time = models.DateTimeField(default=timezone.now, null=True)
37
+ end_time = models.DateTimeField(default=None, null=True)
38
+
39
+
40
+ __exports__ = (
41
+ "Encounter",
42
+ "EncounterMedium",
43
+ "EncounterState",
44
+ )
@@ -12,6 +12,7 @@ class Facility(IdentifiableModel):
12
12
  name = models.CharField(max_length=255)
13
13
  npi_number = models.CharField(verbose_name="NPI number", max_length=10, blank=True)
14
14
  phone_number = models.CharField(max_length=10, blank=True, default="")
15
+ fax_number = models.CharField(max_length=10, blank=True, default="")
15
16
  active = models.BooleanField(default=True)
16
17
  line1 = models.CharField(max_length=255, default="", blank=True)
17
18
  line2 = models.CharField(max_length=255, default="", blank=True)
@@ -1,6 +1,6 @@
1
1
  from django.db import models
2
2
 
3
- from canvas_sdk.v1.data.base import IdentifiableModel
3
+ from canvas_sdk.v1.data.base import AuditedModel, IdentifiableModel
4
4
 
5
5
 
6
6
  class GoalLifecycleStatus(models.TextChoices):
@@ -38,24 +38,12 @@ class GoalPriority(models.TextChoices):
38
38
  LOW = "low-priority", "Low Priority"
39
39
 
40
40
 
41
- class Goal(IdentifiableModel):
41
+ class Goal(AuditedModel, IdentifiableModel):
42
42
  """Goal."""
43
43
 
44
44
  class Meta:
45
45
  db_table = "canvas_sdk_data_api_goal_001"
46
46
 
47
- created = models.DateTimeField(auto_now_add=True)
48
- modified = models.DateTimeField(auto_now=True)
49
- originator = models.ForeignKey(
50
- "v1.CanvasUser", on_delete=models.DO_NOTHING, null=True, related_name="+"
51
- )
52
- committer = models.ForeignKey(
53
- "v1.CanvasUser", on_delete=models.DO_NOTHING, null=True, related_name="+"
54
- )
55
- entered_in_error = models.ForeignKey(
56
- "v1.CanvasUser", on_delete=models.DO_NOTHING, null=True, related_name="+"
57
- )
58
-
59
47
  patient = models.ForeignKey("v1.Patient", on_delete=models.DO_NOTHING, related_name="goals")
60
48
  note = models.ForeignKey("v1.Note", on_delete=models.DO_NOTHING, related_name="goals")
61
49
  lifecycle_status = models.CharField(max_length=20, choices=GoalLifecycleStatus.choices)
@@ -2,7 +2,7 @@ import json
2
2
 
3
3
  from django.db import models
4
4
 
5
- from canvas_sdk.v1.data.base import IdentifiableModel
5
+ from canvas_sdk.v1.data.base import AuditedModel, IdentifiableModel, TimestampedModel
6
6
  from canvas_sdk.v1.data.common import (
7
7
  DocumentReviewMode,
8
8
  OrderStatus,
@@ -12,24 +12,12 @@ from canvas_sdk.v1.data.common import (
12
12
  from canvas_sdk.v1.data.task import Task
13
13
 
14
14
 
15
- class ImagingOrder(IdentifiableModel):
15
+ class ImagingOrder(AuditedModel, IdentifiableModel):
16
16
  """Model to read ImagingOrder data."""
17
17
 
18
18
  class Meta:
19
19
  db_table = "canvas_sdk_data_api_imagingorder_001"
20
20
 
21
- created = models.DateTimeField(auto_now_add=True)
22
- modified = models.DateTimeField(auto_now=True)
23
- originator = models.ForeignKey(
24
- "v1.CanvasUser", on_delete=models.DO_NOTHING, null=True, related_name="+"
25
- )
26
- deleted = models.BooleanField()
27
- committer = models.ForeignKey(
28
- "v1.CanvasUser", on_delete=models.DO_NOTHING, null=True, related_name="+"
29
- )
30
- entered_in_error = models.ForeignKey(
31
- "v1.CanvasUser", on_delete=models.DO_NOTHING, related_name="+"
32
- )
33
21
  patient = models.ForeignKey(
34
22
  "v1.Patient", on_delete=models.DO_NOTHING, related_name="imaging_orders", null=True
35
23
  )
@@ -67,24 +55,12 @@ class ImagingOrder(IdentifiableModel):
67
55
  return list(self.get_task_objects())
68
56
 
69
57
 
70
- class ImagingReview(IdentifiableModel):
58
+ class ImagingReview(AuditedModel, IdentifiableModel):
71
59
  """Model to read ImagingReview data."""
72
60
 
73
61
  class Meta:
74
62
  db_table = "canvas_sdk_data_api_imagingreview_001"
75
63
 
76
- created = models.DateTimeField(auto_now_add=True)
77
- modified = models.DateTimeField(auto_now=True)
78
- originator = models.ForeignKey(
79
- "v1.CanvasUser", on_delete=models.DO_NOTHING, null=True, related_name="+"
80
- )
81
- deleted = models.BooleanField()
82
- committer = models.ForeignKey(
83
- "v1.CanvasUser", on_delete=models.DO_NOTHING, null=True, related_name="+"
84
- )
85
- entered_in_error = models.ForeignKey(
86
- "v1.CanvasUser", on_delete=models.DO_NOTHING, null=True, related_name="+"
87
- )
88
64
  patient_communication_method = models.CharField(
89
65
  choices=ReviewPatientCommunicationMethod.choices, max_length=30
90
66
  )
@@ -99,7 +75,7 @@ class ImagingReview(IdentifiableModel):
99
75
  )
100
76
 
101
77
 
102
- class ImagingReport(IdentifiableModel):
78
+ class ImagingReport(TimestampedModel, IdentifiableModel):
103
79
  """Model to read ImagingReport data."""
104
80
 
105
81
  class ImagingReportSource(models.TextChoices):
@@ -110,8 +86,6 @@ class ImagingReport(IdentifiableModel):
110
86
  class Meta:
111
87
  db_table = "canvas_sdk_data_api_imagingreport_001"
112
88
 
113
- created = models.DateTimeField(auto_now_add=True)
114
- modified = models.DateTimeField(auto_now=True)
115
89
  review_mode = models.CharField(choices=DocumentReviewMode.choices, max_length=2)
116
90
  junked = models.BooleanField()
117
91
  requires_signature = models.BooleanField()
@@ -7,9 +7,9 @@ from canvas_sdk.v1.data.base import (
7
7
  CommittableQuerySetMixin,
8
8
  ForPatientQuerySetMixin,
9
9
  IdentifiableModel,
10
- Model,
11
10
  ValueSetLookupQuerySet,
12
11
  )
12
+ from canvas_sdk.v1.data.coding import Coding
13
13
 
14
14
 
15
15
  class ImmunizationStatus(models.TextChoices):
@@ -32,7 +32,9 @@ class ImmunizationReasonsNotGiven(models.TextChoices):
32
32
 
33
33
 
34
34
  class ImmunizationQuerySet(
35
- ValueSetLookupQuerySet, CommittableQuerySetMixin, ForPatientQuerySetMixin
35
+ CommittableQuerySetMixin,
36
+ ForPatientQuerySetMixin,
37
+ ValueSetLookupQuerySet,
36
38
  ):
37
39
  """ImmunizationQuerySet."""
38
40
 
@@ -78,24 +80,19 @@ class Immunization(IdentifiableModel):
78
80
  deleted = models.BooleanField()
79
81
 
80
82
 
81
- class ImmunizationCoding(Model):
83
+ class ImmunizationCoding(Coding):
82
84
  """ImmunizationCoding."""
83
85
 
84
86
  class Meta:
85
87
  db_table = "canvas_sdk_data_api_immunizationcoding_001"
86
88
 
87
- system = models.CharField(max_length=255)
88
- version = models.CharField(max_length=255)
89
- code = models.CharField(max_length=255)
90
- display = models.CharField(max_length=1000)
91
- user_selected = models.BooleanField()
92
89
  immunization = models.ForeignKey(
93
90
  Immunization, on_delete=models.DO_NOTHING, related_name="codings", null=True
94
91
  )
95
92
 
96
93
 
97
94
  class ImmunizationStatementQuerySet(
98
- ValueSetLookupQuerySet, CommittableQuerySetMixin, ForPatientQuerySetMixin
95
+ CommittableQuerySetMixin, ForPatientQuerySetMixin, ValueSetLookupQuerySet
99
96
  ):
100
97
  """ImmunizationStatementQuerySet."""
101
98
 
@@ -133,17 +130,12 @@ class ImmunizationStatement(IdentifiableModel):
133
130
  deleted = models.BooleanField()
134
131
 
135
132
 
136
- class ImmunizationStatementCoding(Model):
133
+ class ImmunizationStatementCoding(Coding):
137
134
  """ImmunizationStatementCoding."""
138
135
 
139
136
  class Meta:
140
137
  db_table = "canvas_sdk_data_api_immunizationstatementcoding_001"
141
138
 
142
- system = models.CharField(max_length=255)
143
- version = models.CharField(max_length=255)
144
- code = models.CharField(max_length=255)
145
- display = models.CharField(max_length=1000)
146
- user_selected = models.BooleanField()
147
139
  immunization_statement = models.ForeignKey(
148
140
  ImmunizationStatement, on_delete=models.CASCADE, related_name="coding"
149
141
  )