canvas 0.33.0__py3-none-any.whl → 0.33.1__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.

Files changed (254) hide show
  1. {canvas-0.33.0.dist-info → canvas-0.33.1.dist-info}/METADATA +2 -1
  2. canvas-0.33.1.dist-info/RECORD +272 -0
  3. canvas_sdk/__init__.py +3 -0
  4. canvas_sdk/commands/__init__.py +1 -1
  5. canvas_sdk/commands/base.py +3 -0
  6. canvas_sdk/commands/commands/__init__.py +1 -0
  7. canvas_sdk/commands/commands/adjust_prescription.py +3 -0
  8. canvas_sdk/commands/commands/allergy.py +7 -0
  9. canvas_sdk/commands/commands/assess.py +2 -0
  10. canvas_sdk/commands/commands/close_goal.py +3 -0
  11. canvas_sdk/commands/commands/diagnose.py +3 -0
  12. canvas_sdk/commands/commands/exam.py +3 -0
  13. canvas_sdk/commands/commands/family_history.py +3 -0
  14. canvas_sdk/commands/commands/follow_up.py +3 -0
  15. canvas_sdk/commands/commands/goal.py +3 -0
  16. canvas_sdk/commands/commands/history_present_illness.py +3 -0
  17. canvas_sdk/commands/commands/imaging_order.py +3 -0
  18. canvas_sdk/commands/commands/instruct.py +3 -0
  19. canvas_sdk/commands/commands/lab_order.py +3 -0
  20. canvas_sdk/commands/commands/medical_history.py +3 -0
  21. canvas_sdk/commands/commands/medication_statement.py +2 -0
  22. canvas_sdk/commands/commands/past_surgical_history.py +3 -0
  23. canvas_sdk/commands/commands/perform.py +3 -0
  24. canvas_sdk/commands/commands/plan.py +3 -0
  25. canvas_sdk/commands/commands/prescribe.py +8 -0
  26. canvas_sdk/commands/commands/questionnaire/__init__.py +3 -13
  27. canvas_sdk/commands/commands/questionnaire/question.py +10 -0
  28. canvas_sdk/commands/commands/reason_for_visit.py +3 -0
  29. canvas_sdk/commands/commands/refer.py +3 -0
  30. canvas_sdk/commands/commands/refill.py +3 -0
  31. canvas_sdk/commands/commands/remove_allergy.py +3 -0
  32. canvas_sdk/commands/commands/resolve_condition.py +3 -0
  33. canvas_sdk/commands/commands/review_of_systems.py +3 -0
  34. canvas_sdk/commands/commands/stop_medication.py +3 -0
  35. canvas_sdk/commands/commands/structured_assessment.py +3 -0
  36. canvas_sdk/commands/commands/task.py +7 -0
  37. canvas_sdk/commands/commands/update_diagnosis.py +3 -0
  38. canvas_sdk/commands/commands/update_goal.py +3 -0
  39. canvas_sdk/commands/commands/vitals.py +3 -0
  40. canvas_sdk/commands/constants.py +8 -0
  41. canvas_sdk/effects/__init__.py +1 -1
  42. canvas_sdk/effects/banner_alert/__init__.py +1 -1
  43. canvas_sdk/effects/banner_alert/add_banner_alert.py +3 -0
  44. canvas_sdk/effects/banner_alert/remove_banner_alert.py +3 -0
  45. canvas_sdk/effects/base.py +7 -0
  46. canvas_sdk/effects/billing_line_item/__init__.py +5 -1
  47. canvas_sdk/effects/billing_line_item/add_billing_line_item.py +3 -0
  48. canvas_sdk/effects/billing_line_item/remove_billing_line_item.py +3 -0
  49. canvas_sdk/effects/billing_line_item/update_billing_line_item.py +3 -0
  50. canvas_sdk/effects/launch_modal.py +3 -0
  51. canvas_sdk/effects/patient_chart_summary_configuration.py +3 -0
  52. canvas_sdk/effects/patient_portal/__init__.py +1 -0
  53. canvas_sdk/effects/patient_portal/application_configuration.py +3 -0
  54. canvas_sdk/effects/patient_portal/form_result.py +3 -0
  55. canvas_sdk/effects/patient_portal_menu_configuration.py +3 -0
  56. canvas_sdk/effects/patient_profile_configuration.py +5 -1
  57. canvas_sdk/effects/protocol_card/__init__.py +1 -1
  58. canvas_sdk/effects/protocol_card/protocol_card.py +6 -0
  59. canvas_sdk/effects/questionnaire_result.py +3 -0
  60. canvas_sdk/effects/send_invite.py +3 -0
  61. canvas_sdk/effects/show_button.py +3 -0
  62. canvas_sdk/effects/simple_api.py +9 -0
  63. canvas_sdk/effects/surescripts/__init__.py +2 -2
  64. canvas_sdk/effects/surescripts/surescripts_messages.py +7 -0
  65. canvas_sdk/effects/task/__init__.py +6 -1
  66. canvas_sdk/effects/task/task.py +8 -0
  67. canvas_sdk/effects/update_user.py +3 -0
  68. canvas_sdk/effects/widgets/__init__.py +1 -1
  69. canvas_sdk/effects/widgets/portal_widget.py +3 -0
  70. canvas_sdk/events/__init__.py +6 -1
  71. canvas_sdk/events/base.py +3 -0
  72. canvas_sdk/handlers/__init__.py +1 -1
  73. canvas_sdk/handlers/action_button.py +6 -0
  74. canvas_sdk/handlers/application.py +3 -0
  75. canvas_sdk/handlers/base.py +3 -0
  76. canvas_sdk/handlers/cron_task.py +3 -0
  77. canvas_sdk/handlers/simple_api/__init__.py +3 -2
  78. canvas_sdk/handlers/simple_api/api.py +26 -1
  79. canvas_sdk/handlers/simple_api/exceptions.py +10 -0
  80. canvas_sdk/handlers/simple_api/security.py +21 -5
  81. canvas_sdk/handlers/simple_api/tools.py +9 -0
  82. canvas_sdk/protocols/__init__.py +1 -1
  83. canvas_sdk/protocols/base.py +3 -0
  84. canvas_sdk/protocols/clinical_quality_measure.py +6 -1
  85. canvas_sdk/protocols/timeframe.py +3 -0
  86. canvas_sdk/questionnaires/__init__.py +1 -1
  87. canvas_sdk/questionnaires/utils.py +7 -0
  88. canvas_sdk/templates/__init__.py +1 -1
  89. canvas_sdk/templates/utils.py +3 -0
  90. canvas_sdk/utils/__init__.py +1 -1
  91. canvas_sdk/utils/http.py +69 -35
  92. canvas_sdk/utils/plugins.py +4 -0
  93. canvas_sdk/utils/stats.py +11 -0
  94. canvas_sdk/v1/__init__.py +1 -0
  95. canvas_sdk/v1/apps.py +3 -0
  96. canvas_sdk/v1/data/__init__.py +2 -2
  97. canvas_sdk/v1/data/allergy_intolerance.py +3 -0
  98. canvas_sdk/v1/data/appointment.py +7 -0
  99. canvas_sdk/v1/data/assessment.py +3 -0
  100. canvas_sdk/v1/data/banner_alert.py +3 -0
  101. canvas_sdk/v1/data/base.py +3 -0
  102. canvas_sdk/v1/data/billing.py +7 -0
  103. canvas_sdk/v1/data/care_team.py +7 -0
  104. canvas_sdk/v1/data/command.py +3 -0
  105. canvas_sdk/v1/data/common.py +18 -0
  106. canvas_sdk/v1/data/condition.py +7 -0
  107. canvas_sdk/v1/data/coverage.py +14 -0
  108. canvas_sdk/v1/data/detected_issue.py +3 -0
  109. canvas_sdk/v1/data/device.py +3 -0
  110. canvas_sdk/v1/data/imaging.py +7 -0
  111. canvas_sdk/v1/data/lab.py +16 -0
  112. canvas_sdk/v1/data/medication.py +3 -0
  113. canvas_sdk/v1/data/note.py +9 -0
  114. canvas_sdk/v1/data/observation.py +9 -0
  115. canvas_sdk/v1/data/organization.py +3 -0
  116. canvas_sdk/v1/data/patient.py +18 -2
  117. canvas_sdk/v1/data/practicelocation.py +7 -0
  118. canvas_sdk/v1/data/protocol_override.py +7 -0
  119. canvas_sdk/v1/data/questionnaire.py +16 -3
  120. canvas_sdk/v1/data/reason_for_visit.py +3 -0
  121. canvas_sdk/v1/data/staff.py +3 -0
  122. canvas_sdk/v1/data/task.py +12 -0
  123. canvas_sdk/v1/data/team.py +8 -1
  124. canvas_sdk/v1/data/user.py +3 -0
  125. canvas_sdk/v1/models.py +2 -0
  126. canvas_sdk/value_set/__init__.py +1 -0
  127. canvas_sdk/value_set/_utilities.py +16 -0
  128. canvas_sdk/value_set/custom.py +4 -0
  129. canvas_sdk/value_set/hcc2018.py +3 -0
  130. canvas_sdk/value_set/v2022/__init__.py +1 -0
  131. canvas_sdk/value_set/v2022/adverse_event.py +3 -0
  132. canvas_sdk/value_set/v2022/allergy.py +5 -0
  133. canvas_sdk/value_set/v2022/assessment.py +5 -0
  134. canvas_sdk/value_set/v2022/communication.py +5 -0
  135. canvas_sdk/value_set/v2022/condition.py +5 -0
  136. canvas_sdk/value_set/v2022/device.py +5 -0
  137. canvas_sdk/value_set/v2022/diagnostic_study.py +5 -0
  138. canvas_sdk/value_set/v2022/encounter.py +5 -0
  139. canvas_sdk/value_set/v2022/immunization.py +5 -0
  140. canvas_sdk/value_set/v2022/individual_characteristic.py +5 -0
  141. canvas_sdk/value_set/v2022/intervention.py +5 -0
  142. canvas_sdk/value_set/v2022/laboratory_test.py +5 -0
  143. canvas_sdk/value_set/v2022/medication.py +5 -0
  144. canvas_sdk/value_set/v2022/physical_exam.py +5 -0
  145. canvas_sdk/value_set/v2022/procedure.py +5 -0
  146. canvas_sdk/value_set/v2022/symptom.py +3 -0
  147. canvas_sdk/value_set/value_set.py +9 -0
  148. canvas_sdk/views/__init__.py +1 -0
  149. logger/__init__.py +2 -0
  150. logger/logger.py +3 -0
  151. plugin_runner/aws_headers.py +1 -1
  152. plugin_runner/load_all_plugins.py +202 -0
  153. plugin_runner/plugin_runner.py +21 -24
  154. plugin_runner/sandbox.py +497 -115
  155. settings.py +5 -2
  156. canvas-0.33.0.dist-info/RECORD +0 -366
  157. canvas_cli/apps/auth/tests.py +0 -155
  158. canvas_cli/apps/plugin/tests.py +0 -85
  159. canvas_cli/conftest.py +0 -28
  160. canvas_cli/tests.py +0 -217
  161. canvas_cli/utils/context/tests.py +0 -131
  162. canvas_cli/utils/print/tests.py +0 -69
  163. canvas_cli/utils/urls/tests.py +0 -12
  164. canvas_cli/utils/validators/tests.py +0 -37
  165. canvas_sdk/commands/tests/protocol/__init__.py +0 -0
  166. canvas_sdk/commands/tests/protocol/tests.py +0 -83
  167. canvas_sdk/commands/tests/schema/__init__.py +0 -0
  168. canvas_sdk/commands/tests/schema/tests.py +0 -108
  169. canvas_sdk/commands/tests/test_base_command.py +0 -81
  170. canvas_sdk/commands/tests/test_utils.py +0 -375
  171. canvas_sdk/commands/tests/unit/__init__.py +0 -0
  172. canvas_sdk/commands/tests/unit/tests.py +0 -278
  173. canvas_sdk/effects/banner_alert/tests.py +0 -288
  174. canvas_sdk/effects/protocol_card/tests.py +0 -191
  175. canvas_sdk/questionnaires/tests/__init__.py +0 -0
  176. canvas_sdk/questionnaires/tests/test_utils.py +0 -74
  177. canvas_sdk/templates/tests/__init__.py +0 -0
  178. canvas_sdk/templates/tests/test_utils.py +0 -43
  179. canvas_sdk/tests/__init__.py +0 -0
  180. canvas_sdk/tests/handlers/__init__.py +0 -0
  181. canvas_sdk/tests/handlers/test_simple_api.py +0 -1167
  182. canvas_sdk/utils/tests.py +0 -72
  183. canvas_sdk/value_set/tests/test_value_sets.py +0 -72
  184. plugin_runner/tests/__init__.py +0 -0
  185. plugin_runner/tests/fixtures/plugins/example_plugin/CANVAS_MANIFEST.json +0 -29
  186. plugin_runner/tests/fixtures/plugins/example_plugin/README.md +0 -12
  187. plugin_runner/tests/fixtures/plugins/example_plugin/__init__.py +0 -0
  188. plugin_runner/tests/fixtures/plugins/example_plugin/protocols/__init__.py +0 -0
  189. plugin_runner/tests/fixtures/plugins/example_plugin/protocols/my_protocol.py +0 -18
  190. plugin_runner/tests/fixtures/plugins/test_implicit_imports_plugin/CANVAS_MANIFEST.json +0 -38
  191. plugin_runner/tests/fixtures/plugins/test_implicit_imports_plugin/README.md +0 -11
  192. plugin_runner/tests/fixtures/plugins/test_implicit_imports_plugin/protocols/__init__.py +0 -0
  193. plugin_runner/tests/fixtures/plugins/test_implicit_imports_plugin/protocols/my_protocol.py +0 -33
  194. plugin_runner/tests/fixtures/plugins/test_implicit_imports_plugin/templates/__init__.py +0 -3
  195. plugin_runner/tests/fixtures/plugins/test_implicit_imports_plugin/templates/base.py +0 -6
  196. plugin_runner/tests/fixtures/plugins/test_implicit_imports_plugin/utils/__init__.py +0 -5
  197. plugin_runner/tests/fixtures/plugins/test_implicit_imports_plugin/utils/base.py +0 -4
  198. plugin_runner/tests/fixtures/plugins/test_load_questionnaire/CANVAS_MANIFEST.json +0 -52
  199. plugin_runner/tests/fixtures/plugins/test_load_questionnaire/README.md +0 -11
  200. plugin_runner/tests/fixtures/plugins/test_load_questionnaire/protocols/__init__.py +0 -0
  201. plugin_runner/tests/fixtures/plugins/test_load_questionnaire/protocols/my_protocol.py +0 -39
  202. plugin_runner/tests/fixtures/plugins/test_load_questionnaire/questionnaires/example_questionnaire.yml +0 -61
  203. plugin_runner/tests/fixtures/plugins/test_module_forbidden_imports_plugin/CANVAS_MANIFEST.json +0 -29
  204. plugin_runner/tests/fixtures/plugins/test_module_forbidden_imports_plugin/README.md +0 -12
  205. plugin_runner/tests/fixtures/plugins/test_module_forbidden_imports_plugin/other_module/__init__.py +0 -0
  206. plugin_runner/tests/fixtures/plugins/test_module_forbidden_imports_plugin/other_module/base.py +0 -10
  207. plugin_runner/tests/fixtures/plugins/test_module_forbidden_imports_plugin/protocols/__init__.py +0 -0
  208. plugin_runner/tests/fixtures/plugins/test_module_forbidden_imports_plugin/protocols/my_protocol.py +0 -18
  209. plugin_runner/tests/fixtures/plugins/test_module_forbidden_imports_runtime_plugin/CANVAS_MANIFEST.json +0 -29
  210. plugin_runner/tests/fixtures/plugins/test_module_forbidden_imports_runtime_plugin/README.md +0 -12
  211. plugin_runner/tests/fixtures/plugins/test_module_forbidden_imports_runtime_plugin/other_module/__init__.py +0 -0
  212. plugin_runner/tests/fixtures/plugins/test_module_forbidden_imports_runtime_plugin/other_module/base.py +0 -10
  213. plugin_runner/tests/fixtures/plugins/test_module_forbidden_imports_runtime_plugin/protocols/__init__.py +0 -0
  214. plugin_runner/tests/fixtures/plugins/test_module_forbidden_imports_runtime_plugin/protocols/my_protocol.py +0 -18
  215. plugin_runner/tests/fixtures/plugins/test_module_imports_outside_plugin_v1/CANVAS_MANIFEST.json +0 -29
  216. plugin_runner/tests/fixtures/plugins/test_module_imports_outside_plugin_v1/README.md +0 -12
  217. plugin_runner/tests/fixtures/plugins/test_module_imports_outside_plugin_v1/other_module/__init__.py +0 -0
  218. plugin_runner/tests/fixtures/plugins/test_module_imports_outside_plugin_v1/other_module/base.py +0 -3
  219. plugin_runner/tests/fixtures/plugins/test_module_imports_outside_plugin_v1/protocols/__init__.py +0 -0
  220. plugin_runner/tests/fixtures/plugins/test_module_imports_outside_plugin_v1/protocols/my_protocol.py +0 -18
  221. plugin_runner/tests/fixtures/plugins/test_module_imports_outside_plugin_v2/CANVAS_MANIFEST.json +0 -29
  222. plugin_runner/tests/fixtures/plugins/test_module_imports_outside_plugin_v2/README.md +0 -12
  223. plugin_runner/tests/fixtures/plugins/test_module_imports_outside_plugin_v2/other_module/__init__.py +0 -0
  224. plugin_runner/tests/fixtures/plugins/test_module_imports_outside_plugin_v2/other_module/base.py +0 -6
  225. plugin_runner/tests/fixtures/plugins/test_module_imports_outside_plugin_v2/protocols/__init__.py +0 -0
  226. plugin_runner/tests/fixtures/plugins/test_module_imports_outside_plugin_v2/protocols/my_protocol.py +0 -18
  227. plugin_runner/tests/fixtures/plugins/test_module_imports_outside_plugin_v3/CANVAS_MANIFEST.json +0 -29
  228. plugin_runner/tests/fixtures/plugins/test_module_imports_outside_plugin_v3/README.md +0 -12
  229. plugin_runner/tests/fixtures/plugins/test_module_imports_outside_plugin_v3/other_module/__init__.py +0 -0
  230. plugin_runner/tests/fixtures/plugins/test_module_imports_outside_plugin_v3/other_module/base.py +0 -8
  231. plugin_runner/tests/fixtures/plugins/test_module_imports_outside_plugin_v3/protocols/__init__.py +0 -0
  232. plugin_runner/tests/fixtures/plugins/test_module_imports_outside_plugin_v3/protocols/my_protocol.py +0 -18
  233. plugin_runner/tests/fixtures/plugins/test_module_imports_plugin/CANVAS_MANIFEST.json +0 -29
  234. plugin_runner/tests/fixtures/plugins/test_module_imports_plugin/README.md +0 -12
  235. plugin_runner/tests/fixtures/plugins/test_module_imports_plugin/other_module/__init__.py +0 -0
  236. plugin_runner/tests/fixtures/plugins/test_module_imports_plugin/other_module/base.py +0 -3
  237. plugin_runner/tests/fixtures/plugins/test_module_imports_plugin/protocols/__init__.py +0 -0
  238. plugin_runner/tests/fixtures/plugins/test_module_imports_plugin/protocols/my_protocol.py +0 -18
  239. plugin_runner/tests/fixtures/plugins/test_render_template/CANVAS_MANIFEST.json +0 -47
  240. plugin_runner/tests/fixtures/plugins/test_render_template/README.md +0 -11
  241. plugin_runner/tests/fixtures/plugins/test_render_template/protocols/__init__.py +0 -0
  242. plugin_runner/tests/fixtures/plugins/test_render_template/protocols/my_protocol.py +0 -43
  243. plugin_runner/tests/fixtures/plugins/test_render_template/templates/template.html +0 -10
  244. plugin_runner/tests/fixtures/plugins/test_simple_api/CANVAS_MANIFEST.json +0 -47
  245. plugin_runner/tests/fixtures/plugins/test_simple_api/README.md +0 -11
  246. plugin_runner/tests/fixtures/plugins/test_simple_api/__init__.py +0 -0
  247. plugin_runner/tests/fixtures/plugins/test_simple_api/protocols/__init__.py +0 -0
  248. plugin_runner/tests/fixtures/plugins/test_simple_api/protocols/my_protocol.py +0 -43
  249. plugin_runner/tests/test_application.py +0 -65
  250. plugin_runner/tests/test_plugin_installer.py +0 -127
  251. plugin_runner/tests/test_plugin_runner.py +0 -388
  252. plugin_runner/tests/test_sandbox.py +0 -137
  253. {canvas-0.33.0.dist-info → canvas-0.33.1.dist-info}/WHEEL +0 -0
  254. {canvas-0.33.0.dist-info → canvas-0.33.1.dist-info}/entry_points.txt +0 -0
@@ -36,3 +36,6 @@ class UpdateGoalCommand(_BaseCommand):
36
36
  achievement_status: AchievementStatus | None = None
37
37
  priority: Priority | None = None
38
38
  progress: str | None = None
39
+
40
+
41
+ __exports__ = ("UpdateGoalCommand",)
@@ -52,3 +52,6 @@ class VitalsCommand(BaseCommand):
52
52
  respiration_rate: conint(ge=6, le=60) | None = None # type: ignore[valid-type]
53
53
  oxygen_saturation: conint(ge=60, le=100) | None = None # type: ignore[valid-type]
54
54
  note: constr(max_length=150) | None = None # type: ignore[valid-type]
55
+
56
+
57
+ __exports__ = ("VitalsCommand",)
@@ -50,3 +50,11 @@ class ServiceProvider(Model):
50
50
  business_phone: str | None = Field(max_length=512, default=None)
51
51
  business_address: str | None = Field(max_length=512, default=None)
52
52
  notes: str | None = Field(max_length=512, default=None)
53
+
54
+
55
+ __exports__ = (
56
+ "CodeSystems",
57
+ "Coding",
58
+ "ClinicalQuantity",
59
+ "ServiceProvider",
60
+ )
@@ -2,4 +2,4 @@ from canvas_generated.messages.effects_pb2 import Effect, EffectType
2
2
 
3
3
  from .base import _BaseEffect
4
4
 
5
- __all__ = ("Effect", "EffectType", "_BaseEffect")
5
+ __all__ = __exports__ = ("Effect", "EffectType", "_BaseEffect")
@@ -1,4 +1,4 @@
1
1
  from canvas_sdk.effects.banner_alert.add_banner_alert import AddBannerAlert
2
2
  from canvas_sdk.effects.banner_alert.remove_banner_alert import RemoveBannerAlert
3
3
 
4
- __all__ = ("AddBannerAlert", "RemoveBannerAlert")
4
+ __all__ = __exports__ = ("AddBannerAlert", "RemoveBannerAlert")
@@ -59,3 +59,6 @@ class AddBannerAlert(_BaseEffect):
59
59
  "key": self.key,
60
60
  "data": self.values,
61
61
  }
62
+
63
+
64
+ __exports__ = ("AddBannerAlert",)
@@ -19,3 +19,6 @@ class RemoveBannerAlert(_BaseEffect):
19
19
  def effect_payload(self) -> dict[str, Any]:
20
20
  """The payload of the effect."""
21
21
  return {"patient": self.patient_id, "patient_filter": self.patient_filter, "key": self.key}
22
+
23
+
24
+ __exports__ = ("RemoveBannerAlert",)
@@ -26,3 +26,10 @@ class _BaseEffect(Model):
26
26
  def apply(self) -> Effect:
27
27
  self._validate_before_effect("apply")
28
28
  return Effect(type=self.Meta.effect_type, payload=json.dumps(self.effect_payload))
29
+
30
+
31
+ __exports__ = (
32
+ "_BaseEffect",
33
+ # Not defined here but used in a current plugin
34
+ "EffectType",
35
+ )
@@ -8,4 +8,8 @@ from canvas_sdk.effects.billing_line_item.update_billing_line_item import (
8
8
  UpdateBillingLineItem,
9
9
  )
10
10
 
11
- __all__ = ("AddBillingLineItem", "UpdateBillingLineItem", "RemoveBillingLineItem")
11
+ __all__ = __exports__ = (
12
+ "AddBillingLineItem",
13
+ "UpdateBillingLineItem",
14
+ "RemoveBillingLineItem",
15
+ )
@@ -36,3 +36,6 @@ class AddBillingLineItem(_BaseEffect):
36
36
  "note_id": self.note_id,
37
37
  "data": self.values,
38
38
  }
39
+
40
+
41
+ __exports__ = ("AddBillingLineItem",)
@@ -20,3 +20,6 @@ class RemoveBillingLineItem(_BaseEffect):
20
20
  return {
21
21
  "billing_line_item_id": self.billing_line_item_id,
22
22
  }
23
+
24
+
25
+ __exports__ = ("RemoveBillingLineItem",)
@@ -42,3 +42,6 @@ class UpdateBillingLineItem(_BaseEffect):
42
42
  "billing_line_item_id": self.billing_line_item_id,
43
43
  "data": self.values,
44
44
  }
45
+
46
+
47
+ __exports__ = ("UpdateBillingLineItem",)
@@ -34,3 +34,6 @@ class LaunchModalEffect(_BaseEffect):
34
34
  raise ValueError("'url' and 'content' are mutually exclusive")
35
35
 
36
36
  return self
37
+
38
+
39
+ __exports__ = ("LaunchModalEffect",)
@@ -38,3 +38,6 @@ class PatientChartSummaryConfiguration(_BaseEffect):
38
38
  def effect_payload(self) -> dict[str, Any]:
39
39
  """The payload of the effect."""
40
40
  return {"data": self.values}
41
+
42
+
43
+ __exports__ = ("PatientChartSummaryConfiguration",)
@@ -0,0 +1 @@
1
+ __exports__ = ()
@@ -20,3 +20,6 @@ class PatientPortalApplicationConfiguration(_BaseEffect):
20
20
  def effect_payload(self) -> dict[str, Any]:
21
21
  """The payload of the effect."""
22
22
  return {"data": self.values}
23
+
24
+
25
+ __exports__ = ("PatientPortalApplicationConfiguration",)
@@ -29,3 +29,6 @@ class FormResult(_BaseEffect):
29
29
  def effect_payload(self) -> dict[str, Any]:
30
30
  """The payload of the effect."""
31
31
  return {"data": self.values}
32
+
33
+
34
+ __exports__ = ("FormResult",)
@@ -34,3 +34,6 @@ class PatientPortalMenuConfiguration(_BaseEffect):
34
34
  def effect_payload(self) -> dict[str, Any]:
35
35
  """The payload of the effect."""
36
36
  return {"data": self.values}
37
+
38
+
39
+ __exports__ = ("PatientPortalMenuConfiguration",)
@@ -9,7 +9,8 @@ from canvas_sdk.effects.base import EffectType, _BaseEffect
9
9
 
10
10
  class PatientProfileConfiguration(_BaseEffect):
11
11
  """
12
- An Effect that will decide which sections appear, and if they start expanded, on the patient's profile in Canvas.
12
+ An Effect that will decide which sections appear, and if they start expanded,
13
+ on the patient's profile in Canvas.
13
14
  """
14
15
 
15
16
  class Meta:
@@ -42,3 +43,6 @@ class PatientProfileConfiguration(_BaseEffect):
42
43
  def effect_payload(self) -> dict[str, Any]:
43
44
  """The payload of the effect."""
44
45
  return {"data": self.values}
46
+
47
+
48
+ __exports__ = ("PatientProfileConfiguration",)
@@ -1,3 +1,3 @@
1
1
  from canvas_sdk.effects.protocol_card.protocol_card import ProtocolCard, Recommendation
2
2
 
3
- __all__ = ("ProtocolCard", "Recommendation")
3
+ __all__ = __exports__ = ("ProtocolCard", "Recommendation")
@@ -93,3 +93,9 @@ class ProtocolCard(_BaseEffect):
93
93
  title=title, button=button, href=href, command=command, context=context
94
94
  )
95
95
  self.recommendations.append(recommendation)
96
+
97
+
98
+ __exports__ = (
99
+ "Recommendation",
100
+ "ProtocolCard",
101
+ )
@@ -27,3 +27,6 @@ class CreateQuestionnaireResult(_BaseEffect):
27
27
  "code_system": self.code_system,
28
28
  "code": self.code,
29
29
  }
30
+
31
+
32
+ __exports__ = ("CreateQuestionnaireResult",)
@@ -41,3 +41,6 @@ class SendInviteEffect(_BaseEffect):
41
41
  )
42
42
 
43
43
  return errors
44
+
45
+
46
+ __exports__ = ("SendInviteEffect",)
@@ -27,3 +27,6 @@ class ShowButtonEffect(_BaseEffect):
27
27
  def effect_payload(self) -> dict[str, Any]:
28
28
  """The payload of the effect."""
29
29
  return {"data": self.values}
30
+
31
+
32
+ __exports__ = ("ShowButtonEffect",)
@@ -81,3 +81,12 @@ class HTMLResponse(Response):
81
81
  headers: Mapping[str, Any] | None = None,
82
82
  ):
83
83
  super().__init__(content.encode(), status_code, headers, content_type="text/html")
84
+
85
+
86
+ __exports__ = (
87
+ "JSON",
88
+ "Response",
89
+ "JSONResponse",
90
+ "PlainTextResponse",
91
+ "HTMLResponse",
92
+ )
@@ -4,8 +4,8 @@ from .surescripts_messages import (
4
4
  SendSurescriptsMedicationHistoryRequestEffect,
5
5
  )
6
6
 
7
- __all__ = [
7
+ __all__ = __exports__ = (
8
8
  "SendSurescriptsBenefitsRequestEffect",
9
9
  "SendSurescriptsEligibilityRequestEffect",
10
10
  "SendSurescriptsMedicationHistoryRequestEffect",
11
- ]
11
+ )
@@ -91,3 +91,10 @@ class SendSurescriptsBenefitsRequestEffect(_BaseEffect):
91
91
  def effect_payload(self) -> dict[str, Any]:
92
92
  """Benefits Request effect payload."""
93
93
  return self.values
94
+
95
+
96
+ __exports__ = (
97
+ "SendSurescriptsBenefitsRequestEffect",
98
+ "SendSurescriptsEligibilityRequestEffect",
99
+ "SendSurescriptsMedicationHistoryRequestEffect",
100
+ )
@@ -1,3 +1,8 @@
1
1
  from .task import AddTask, AddTaskComment, TaskStatus, UpdateTask
2
2
 
3
- __all__ = ["AddTask", "AddTaskComment", "TaskStatus", "UpdateTask"]
3
+ __all__ = __exports__ = (
4
+ "AddTask",
5
+ "AddTaskComment",
6
+ "TaskStatus",
7
+ "UpdateTask",
8
+ )
@@ -100,3 +100,11 @@ class UpdateTask(_BaseEffect):
100
100
  else:
101
101
  value_dict[field] = getattr(self, field)
102
102
  return value_dict
103
+
104
+
105
+ __exports__ = (
106
+ "AddTask",
107
+ "AddTaskComment",
108
+ "TaskStatus",
109
+ "UpdateTask",
110
+ )
@@ -76,3 +76,6 @@ class UpdateUserEffect(_BaseEffect):
76
76
  )
77
77
 
78
78
  return errors
79
+
80
+
81
+ __exports__ = ("UpdateUserEffect",)
@@ -1,3 +1,3 @@
1
1
  from .portal_widget import PortalWidget
2
2
 
3
- __all__ = ["PortalWidget"]
3
+ __all__ = __exports__ = ("PortalWidget",)
@@ -74,3 +74,6 @@ class PortalWidget(_BaseEffect):
74
74
  )
75
75
 
76
76
  return errors
77
+
78
+
79
+ __exports__ = ("PortalWidget",)
@@ -3,4 +3,9 @@ from canvas_generated.messages.events_pb2 import EventResponse, EventType
3
3
 
4
4
  from .base import Event
5
5
 
6
- __all__ = ("EventRequest", "EventResponse", "EventType", "Event")
6
+ __all__ = __exports__ = (
7
+ "EventRequest",
8
+ "EventResponse",
9
+ "EventType",
10
+ "Event",
11
+ )
canvas_sdk/events/base.py CHANGED
@@ -46,3 +46,6 @@ class Event:
46
46
  self.name = EventType.Name(self.type)
47
47
  self.context = context
48
48
  self.target = TargetType(id=event_request.target, type=target_model)
49
+
50
+
51
+ __exports__ = ("TargetType", "Event")
@@ -1,3 +1,3 @@
1
1
  from canvas_sdk.handlers.base import BaseHandler
2
2
 
3
- __all__ = ("BaseHandler",)
3
+ __all__ = __exports__ = ("BaseHandler",)
@@ -78,3 +78,9 @@ class ActionButton(BaseHandler):
78
78
  return self.handle()
79
79
 
80
80
  return []
81
+
82
+
83
+ __exports__ = (
84
+ "SHOW_BUTTON_REGEX",
85
+ "ActionButton",
86
+ )
@@ -27,3 +27,6 @@ class Application(BaseHandler, ABC):
27
27
  def identifier(self) -> str:
28
28
  """The application identifier."""
29
29
  return f"{self.__class__.__module__}:{self.__class__.__qualname__}"
30
+
31
+
32
+ __exports__ = ("Application",)
@@ -57,3 +57,6 @@ class BaseHandler(ABC):
57
57
  def accept_event(self) -> bool:
58
58
  """Determine whether an event should be accepted and handled by the handler."""
59
59
  return True
60
+
61
+
62
+ __exports__ = ("BaseHandler",)
@@ -33,3 +33,6 @@ class CronTask(BaseHandler):
33
33
  if datetime in Cron(self.SCHEDULE):
34
34
  return self.execute()
35
35
  return []
36
+
37
+
38
+ __exports__ = ("CronTask",)
@@ -12,7 +12,8 @@ from .security import (
12
12
  StaffSessionAuthMixin,
13
13
  )
14
14
 
15
- __all__ = [
15
+ __all__ = __exports__ = (
16
+ "api",
16
17
  "APIKeyAuthMixin",
17
18
  "APIKeyCredentials",
18
19
  "AuthSchemeMixin",
@@ -25,4 +26,4 @@ __all__ = [
25
26
  "SimpleAPI",
26
27
  "SimpleAPIRoute",
27
28
  "StaffSessionAuthMixin",
28
- ]
29
+ )
@@ -1,3 +1,4 @@
1
+ import inspect
1
2
  import json
2
3
  import re
3
4
  import traceback
@@ -334,7 +335,10 @@ class SimpleAPIBase(BaseHandler, ABC):
334
335
  """Authenticate the request."""
335
336
  try:
336
337
  # Create the credentials object
337
- credentials_cls = self.authenticate.__annotations__.get("credentials")
338
+ credentials_cls = inspect.get_annotations(self.authenticate, eval_str=True).get(
339
+ "credentials"
340
+ )
341
+
338
342
  if not credentials_cls or not issubclass(credentials_cls, Credentials):
339
343
  raise PluginError(
340
344
  f"Cannot determine authentication scheme for {self.request.path}; "
@@ -512,3 +516,24 @@ class SimpleAPIRoute(SimpleAPIBase, ABC):
512
516
  def patch(self) -> list[Response | Effect]:
513
517
  """Stub method for PATCH handler."""
514
518
  return []
519
+
520
+
521
+ __exports__ = (
522
+ "FormPart",
523
+ "StringFormPart",
524
+ "FileFormPart",
525
+ "parse_multipart_form",
526
+ "Request",
527
+ "SimpleAPIType",
528
+ "RouteHandler",
529
+ "get",
530
+ "post",
531
+ "put",
532
+ "delete",
533
+ "patch",
534
+ "SimpleAPIBase",
535
+ "SimpleAPI",
536
+ "SimpleAPIRoute",
537
+ # Not defined here but used in an existing plugin
538
+ "Credentials",
539
+ )
@@ -37,3 +37,13 @@ class InvalidCredentialsError(AuthenticationError):
37
37
 
38
38
  def __init__(self) -> None:
39
39
  super().__init__("Provided credentials are invalid")
40
+
41
+
42
+ __exports__ = (
43
+ "SimpleAPIException",
44
+ "AuthenticationError",
45
+ "NoAuthorizationHeaderError",
46
+ "AuthenticationSchemeError",
47
+ "InvalidCredentialsFormatError",
48
+ "InvalidCredentialsError",
49
+ )
@@ -1,3 +1,5 @@
1
+ from __future__ import annotations
2
+
1
3
  from base64 import b64decode
2
4
  from secrets import compare_digest
3
5
  from typing import TYPE_CHECKING, Any, Protocol
@@ -24,7 +26,7 @@ class Credentials:
24
26
  class if they wish to just access the request directly in their authentication method.
25
27
  """
26
28
 
27
- def __init__(self, request: "Request") -> None:
29
+ def __init__(self, request: Request) -> None:
28
30
  pass
29
31
 
30
32
 
@@ -36,7 +38,7 @@ class BasicCredentials(Credentials):
36
38
  them as attributes.
37
39
  """
38
40
 
39
- def __init__(self, request: "Request") -> None:
41
+ def __init__(self, request: Request) -> None:
40
42
  super().__init__(request)
41
43
 
42
44
  authorization = request.headers.get("Authorization")
@@ -71,7 +73,7 @@ class BearerCredentials(Credentials):
71
73
  Parses the token from the request Authorization header and saves it as an attribute.
72
74
  """
73
75
 
74
- def __init__(self, request: "Request") -> None:
76
+ def __init__(self, request: Request) -> None:
75
77
  super().__init__(request)
76
78
 
77
79
  authorization = request.headers.get("Authorization")
@@ -101,7 +103,7 @@ class APIKeyCredentials(Credentials):
101
103
 
102
104
  HEADER_NAME = "Authorization"
103
105
 
104
- def __init__(self, request: "Request") -> None:
106
+ def __init__(self, request: Request) -> None:
105
107
  super().__init__(request)
106
108
 
107
109
  if self.HEADER_NAME not in request.headers:
@@ -132,7 +134,7 @@ class SessionCredentials(Credentials):
132
134
  authenticate method.
133
135
  """
134
136
 
135
- def __init__(self, request: "Request") -> None:
137
+ def __init__(self, request: Request) -> None:
136
138
  super().__init__(request)
137
139
 
138
140
  if (
@@ -247,3 +249,17 @@ class PatientSessionAuthMixin(AuthSchemeMixin):
247
249
  if credentials.logged_in_user["type"] != "Patient":
248
250
  raise InvalidCredentialsError
249
251
  return True
252
+
253
+
254
+ __exports__ = (
255
+ "Credentials",
256
+ "BasicCredentials",
257
+ "BearerCredentials",
258
+ "APIKeyCredentials",
259
+ "AuthSchemeMixin",
260
+ "BasicAuthMixin",
261
+ "APIKeyAuthMixin",
262
+ "SessionCredentials",
263
+ "StaffSessionAuthMixin",
264
+ "PatientSessionAuthMixin",
265
+ )
@@ -113,3 +113,12 @@ def separate_headers(headers: Mapping[str, str]) -> list[tuple[str, str]]:
113
113
  headers_list.append((key, value.strip()))
114
114
 
115
115
  return headers_list
116
+
117
+
118
+ __exports__ = (
119
+ "KeyType",
120
+ "ValueType",
121
+ "MultiDict",
122
+ "CaseInsensitiveMultiDict",
123
+ "separate_headers",
124
+ )
@@ -1,4 +1,4 @@
1
1
  from canvas_sdk.protocols.base import BaseProtocol
2
2
  from canvas_sdk.protocols.clinical_quality_measure import ClinicalQualityMeasure
3
3
 
4
- __all__ = ("BaseProtocol", "ClinicalQualityMeasure")
4
+ __all__ = __exports__ = ("BaseProtocol", "ClinicalQualityMeasure")
@@ -9,3 +9,6 @@ class BaseProtocol(BaseHandler, ABC):
9
9
  """
10
10
 
11
11
  pass
12
+
13
+
14
+ __exports__ = ("BaseProtocol",)
@@ -1,3 +1,5 @@
1
+ from __future__ import annotations
2
+
1
3
  from typing import TYPE_CHECKING, Any, cast
2
4
 
3
5
  import arrow
@@ -92,7 +94,7 @@ class ClinicalQualityMeasure(BaseProtocol):
92
94
  incurring more SQL queries.
93
95
  """
94
96
 
95
- def patient_id(model: "type[Model]") -> str:
97
+ def patient_id(model: type[Model]) -> str:
96
98
  if model == Patient:
97
99
  return self.event.target.id
98
100
  else:
@@ -130,3 +132,6 @@ class ClinicalQualityMeasure(BaseProtocol):
130
132
  ) from error
131
133
 
132
134
  return self._patient_id
135
+
136
+
137
+ __exports__ = ("ClinicalQualityMeasure",)
@@ -37,3 +37,6 @@ class Timeframe:
37
37
  start = start.shift(days=days)
38
38
 
39
39
  return Timeframe(start=start, end=end)
40
+
41
+
42
+ __exports__ = ("Timeframe",)
@@ -1,3 +1,3 @@
1
1
  from .utils import from_yaml as questionnaire_from_yaml
2
2
 
3
- __all__ = ("questionnaire_from_yaml",)
3
+ __all__ = __exports__ = ("questionnaire_from_yaml",)
@@ -115,3 +115,10 @@ def json_schema() -> dict[str, Any]:
115
115
  )
116
116
 
117
117
  return schema
118
+
119
+
120
+ __exports__ = (
121
+ "Draft7Validator",
122
+ "ExtendedDraft7Validator",
123
+ "from_yaml",
124
+ )
@@ -1,3 +1,3 @@
1
1
  from .utils import render_to_string
2
2
 
3
- __all__ = ("render_to_string",)
3
+ __all__ = __exports__ = ("render_to_string",)
@@ -37,3 +37,6 @@ def render_to_string(
37
37
  template = Template(template_path.read_text())
38
38
 
39
39
  return template.render(Context(context))
40
+
41
+
42
+ __exports__ = ("render_to_string",)
@@ -1,6 +1,6 @@
1
1
  from canvas_sdk.utils.http import Http, batch_get, batch_patch, batch_post, batch_put
2
2
 
3
- __all__ = (
3
+ __all__ = __exports__ = (
4
4
  "Http",
5
5
  "batch_get",
6
6
  "batch_patch",