canvas 0.45.0__py3-none-any.whl → 0.46.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.

Files changed (62) hide show
  1. {canvas-0.45.0.dist-info → canvas-0.46.0.dist-info}/METADATA +3 -2
  2. {canvas-0.45.0.dist-info → canvas-0.46.0.dist-info}/RECORD +62 -57
  3. canvas_generated/messages/effects_pb2.py +2 -2
  4. canvas_generated/messages/effects_pb2.pyi +10 -0
  5. canvas_generated/messages/events_pb2.py +2 -2
  6. canvas_generated/messages/events_pb2.pyi +18 -0
  7. canvas_sdk/commands/commands/exam.py +2 -1
  8. canvas_sdk/commands/commands/immunization_statement.py +32 -0
  9. canvas_sdk/commands/commands/questionnaire/__init__.py +18 -3
  10. canvas_sdk/commands/commands/questionnaire/question.py +3 -2
  11. canvas_sdk/commands/commands/questionnaire/toggle_questions.py +68 -0
  12. canvas_sdk/commands/commands/review_of_systems.py +2 -1
  13. canvas_sdk/v1/data/__init__.py +17 -3
  14. canvas_sdk/v1/data/allergy_intolerance.py +16 -19
  15. canvas_sdk/v1/data/appointment.py +10 -14
  16. canvas_sdk/v1/data/assessment.py +9 -10
  17. canvas_sdk/v1/data/banner_alert.py +12 -12
  18. canvas_sdk/v1/data/base.py +45 -1
  19. canvas_sdk/v1/data/billing.py +13 -18
  20. canvas_sdk/v1/data/business_line.py +7 -8
  21. canvas_sdk/v1/data/care_team.py +14 -17
  22. canvas_sdk/v1/data/charge_description_master.py +29 -0
  23. canvas_sdk/v1/data/claim.py +87 -95
  24. canvas_sdk/v1/data/claim_line_item.py +17 -18
  25. canvas_sdk/v1/data/command.py +8 -9
  26. canvas_sdk/v1/data/condition.py +9 -12
  27. canvas_sdk/v1/data/coverage.py +47 -53
  28. canvas_sdk/v1/data/detected_issue.py +16 -20
  29. canvas_sdk/v1/data/device.py +20 -21
  30. canvas_sdk/v1/data/discount.py +8 -8
  31. canvas_sdk/v1/data/imaging.py +24 -30
  32. canvas_sdk/v1/data/invoice.py +3 -3
  33. canvas_sdk/v1/data/lab.py +65 -84
  34. canvas_sdk/v1/data/line_item_transaction.py +7 -9
  35. canvas_sdk/v1/data/medication.py +14 -17
  36. canvas_sdk/v1/data/message.py +10 -17
  37. canvas_sdk/v1/data/note.py +27 -36
  38. canvas_sdk/v1/data/observation.py +24 -33
  39. canvas_sdk/v1/data/organization.py +14 -15
  40. canvas_sdk/v1/data/patient.py +57 -68
  41. canvas_sdk/v1/data/patient_consent.py +14 -19
  42. canvas_sdk/v1/data/payment_collection.py +7 -8
  43. canvas_sdk/v1/data/payor_specific_charge.py +10 -12
  44. canvas_sdk/v1/data/posting.py +10 -18
  45. canvas_sdk/v1/data/practicelocation.py +17 -21
  46. canvas_sdk/v1/data/protocol_override.py +8 -10
  47. canvas_sdk/v1/data/questionnaire.py +56 -73
  48. canvas_sdk/v1/data/reason_for_visit.py +7 -9
  49. canvas_sdk/v1/data/staff.py +61 -57
  50. canvas_sdk/v1/data/task.py +21 -31
  51. canvas_sdk/v1/data/team.py +15 -18
  52. canvas_sdk/v1/data/user.py +3 -3
  53. canvas_sdk/v1/data/utils.py +6 -0
  54. plugin_runner/allowed-module-imports.json +1340 -0
  55. plugin_runner/generate_allowed_imports.py +97 -0
  56. plugin_runner/plugin_runner.py +9 -0
  57. plugin_runner/sandbox.py +50 -60
  58. protobufs/canvas_generated/messages/effects.proto +6 -0
  59. protobufs/canvas_generated/messages/events.proto +12 -1
  60. settings.py +56 -22
  61. {canvas-0.45.0.dist-info → canvas-0.46.0.dist-info}/WHEEL +0 -0
  62. {canvas-0.45.0.dist-info → canvas-0.46.0.dist-info}/entry_points.txt +0 -0
@@ -2,6 +2,7 @@ from django.contrib.postgres.fields import ArrayField
2
2
  from django.db import models
3
3
  from timezone_utils.fields import TimeZoneField
4
4
 
5
+ from canvas_sdk.v1.data.base import IdentifiableModel, Model
5
6
  from canvas_sdk.v1.data.common import (
6
7
  AddressState,
7
8
  AddressType,
@@ -12,53 +13,58 @@ from canvas_sdk.v1.data.common import (
12
13
  PersonSex,
13
14
  TaxIDType,
14
15
  )
16
+ from canvas_sdk.v1.data.utils import create_key
15
17
 
16
18
 
17
- class Staff(models.Model):
19
+ class Staff(Model):
18
20
  """Staff."""
19
21
 
20
22
  class Meta:
21
- managed = False
22
23
  db_table = "canvas_sdk_data_api_staff_001"
23
24
 
24
25
  def __str__(self) -> str:
25
26
  return f"{self.first_name} {self.last_name}"
26
27
 
27
- id = models.CharField(max_length=32, db_column="key")
28
- dbid = models.BigIntegerField(db_column="dbid", primary_key=True)
29
- created = models.DateTimeField()
30
- modified = models.DateTimeField()
31
- prefix = models.CharField()
32
- suffix = models.CharField()
33
- first_name = models.CharField()
34
- middle_name = models.CharField()
35
- last_name = models.CharField()
36
- maiden_name = models.CharField()
37
- nickname = models.CharField()
28
+ id = models.CharField(
29
+ max_length=32,
30
+ db_column="key",
31
+ unique=True,
32
+ editable=False,
33
+ default=create_key,
34
+ )
35
+ created = models.DateTimeField(auto_now_add=True)
36
+ modified = models.DateTimeField(auto_now=True)
37
+ prefix = models.CharField(max_length=100)
38
+ suffix = models.CharField(max_length=100)
39
+ first_name = models.CharField(max_length=255)
40
+ middle_name = models.CharField(max_length=255)
41
+ last_name = models.CharField(max_length=255)
42
+ maiden_name = models.CharField(max_length=255)
43
+ nickname = models.CharField(max_length=255)
38
44
  previous_names = models.JSONField()
39
45
  birth_date = models.DateField(null=True)
40
- sex_at_birth = models.CharField(choices=PersonSex.choices)
41
- sexual_orientation_term = models.CharField()
42
- sexual_orientation_code = models.CharField()
43
- gender_identity_term = models.CharField()
44
- gender_identity_code = models.CharField()
45
- preferred_pronouns = models.CharField()
46
- biological_race_codes = ArrayField(models.CharField())
47
- biological_race_terms = ArrayField(models.CharField())
48
- cultural_ethnicity_codes = ArrayField(models.CharField())
49
- cultural_ethnicity_terms = ArrayField(models.CharField())
46
+ sex_at_birth = models.CharField(choices=PersonSex.choices, max_length=3)
47
+ sexual_orientation_term = models.CharField(max_length=255)
48
+ sexual_orientation_code = models.CharField(max_length=255)
49
+ gender_identity_term = models.CharField(max_length=255)
50
+ gender_identity_code = models.CharField(max_length=255)
51
+ preferred_pronouns = models.CharField(max_length=255)
52
+ biological_race_codes = ArrayField(models.CharField(max_length=100))
53
+ biological_race_terms = ArrayField(models.CharField(max_length=255))
54
+ cultural_ethnicity_codes = ArrayField(models.CharField(max_length=100))
55
+ cultural_ethnicity_terms = ArrayField(models.CharField(max_length=255))
50
56
  last_known_timezone = TimeZoneField(null=True)
51
57
  active = models.BooleanField()
52
58
  primary_practice_location = models.ForeignKey(
53
59
  "v1.PracticeLocation", on_delete=models.DO_NOTHING, null=True
54
60
  )
55
- npi_number = models.CharField()
56
- nadean_number = models.CharField()
57
- group_npi_number = models.CharField()
61
+ npi_number = models.CharField(max_length=10)
62
+ nadean_number = models.CharField(max_length=20)
63
+ group_npi_number = models.CharField(max_length=10)
58
64
  bill_through_organization = models.BooleanField()
59
- tax_id = models.CharField()
60
- tax_id_type = models.CharField(choices=TaxIDType.choices)
61
- spi_number = models.CharField()
65
+ tax_id = models.CharField(max_length=25)
66
+ tax_id_type = models.CharField(choices=TaxIDType.choices, max_length=1)
67
+ spi_number = models.CharField(max_length=50)
62
68
  # TODO - uncomment when Language is developed
63
69
  # language = models.ForeignKey('v1.Language', on_delete=models.DO_NOTHING, related_name="staff_speakers", null=True)
64
70
  # language_secondary = models.ForeignKey('v1.Language', on_delete=models.DO_NOTHING, related_name="staff_secondary_speakers", null=True)
@@ -70,61 +76,59 @@ class Staff(models.Model):
70
76
  "v1.Staff", on_delete=models.DO_NOTHING, related_name="supervising_team", null=True
71
77
  )
72
78
 
79
+ @property
80
+ def photo_url(self) -> str:
81
+ """Return the URL of the staff's first photo."""
82
+ photo = self.photos.first()
83
+ return photo.url if photo else "https://d3hn0m4rbsz438.cloudfront.net/avatar1.png"
84
+
73
85
 
74
- class StaffContactPoint(models.Model):
86
+ class StaffContactPoint(IdentifiableModel):
75
87
  """StaffContactPoint."""
76
88
 
77
89
  class Meta:
78
- managed = False
79
90
  db_table = "canvas_sdk_data_api_staffcontactpoint_001"
80
91
 
81
- id = models.UUIDField()
82
- dbid = models.BigIntegerField(primary_key=True)
83
- system = models.CharField(choices=ContactPointSystem.choices)
84
- value = models.CharField()
85
- use = models.CharField(choices=ContactPointUse.choices)
86
- use_notes = models.CharField()
92
+ system = models.CharField(choices=ContactPointSystem.choices, max_length=20)
93
+ value = models.CharField(max_length=100)
94
+ use = models.CharField(choices=ContactPointUse.choices, max_length=20)
95
+ use_notes = models.CharField(max_length=255)
87
96
  rank = models.IntegerField()
88
- state = models.CharField(choices=ContactPointState.choices)
97
+ state = models.CharField(choices=ContactPointState.choices, max_length=20)
89
98
  staff = models.ForeignKey(Staff, on_delete=models.DO_NOTHING, related_name="telecom")
90
99
 
91
100
 
92
- class StaffAddress(models.Model):
101
+ class StaffAddress(IdentifiableModel):
93
102
  """StaffAddress."""
94
103
 
95
104
  class Meta:
96
- managed = False
97
105
  db_table = "canvas_sdk_data_api_staffaddress_001"
98
106
 
99
- id = models.UUIDField()
100
- dbid = models.BigIntegerField(primary_key=True)
101
- line1 = models.CharField()
102
- line2 = models.CharField()
103
- city = models.CharField()
104
- district = models.CharField()
105
- state_code = models.CharField()
106
- postal_code = models.CharField()
107
- use = models.CharField(choices=AddressUse.choices)
108
- type = models.CharField(choices=AddressType.choices)
107
+ line1 = models.CharField(max_length=255)
108
+ line2 = models.CharField(max_length=255)
109
+ city = models.CharField(max_length=255)
110
+ district = models.CharField(max_length=255)
111
+ state_code = models.CharField(max_length=2)
112
+ postal_code = models.CharField(max_length=255)
113
+ use = models.CharField(choices=AddressUse.choices, max_length=10)
114
+ type = models.CharField(choices=AddressType.choices, max_length=10)
109
115
  longitude = models.FloatField()
110
116
  latitude = models.FloatField()
111
117
  start = models.DateField()
112
118
  end = models.DateField()
113
- country = models.CharField()
114
- state = models.CharField(choices=AddressState.choices)
119
+ country = models.CharField(max_length=255)
120
+ state = models.CharField(choices=AddressState.choices, max_length=20)
115
121
  staff = models.ForeignKey(Staff, on_delete=models.DO_NOTHING, related_name="addresses")
116
122
 
117
123
 
118
- class StaffPhoto(models.Model):
124
+ class StaffPhoto(Model):
119
125
  """StaffPhoto."""
120
126
 
121
127
  class Meta:
122
- managed = False
123
128
  db_table = "canvas_sdk_data_api_staffphoto_001"
124
129
 
125
- dbid = models.BigIntegerField(primary_key=True)
126
- created = models.DateTimeField()
127
- modified = models.DateTimeField()
130
+ created = models.DateTimeField(auto_now_add=True)
131
+ modified = models.DateTimeField(auto_now=True)
128
132
  staff = models.ForeignKey(Staff, on_delete=models.CASCADE, related_name="photos")
129
133
  url = models.CharField(
130
134
  default="https://d3hn0m4rbsz438.cloudfront.net/avatar1.png", max_length=512
@@ -1,20 +1,21 @@
1
1
  from django.contrib.postgres.fields import ArrayField
2
2
  from django.db import models
3
3
 
4
+ from canvas_sdk.v1.data.base import IdentifiableModel, Model
4
5
  from canvas_sdk.v1.data.common import ColorEnum, Origin
5
6
 
6
7
 
7
8
  class TaskType(models.TextChoices):
8
9
  """Choices for task types."""
9
10
 
10
- TASK = "Task", "Task"
11
- REMINDER = "Reminder", "Reminder"
11
+ TASK = "T", "Task"
12
+ REMINDER = "R", "Reminder"
12
13
 
13
14
 
14
15
  class EventType(models.TextChoices):
15
16
  """Choices for event types."""
16
17
 
17
- EVENT_CHART_OPEN = "Chart Open", "Chart Open"
18
+ EVENT_CHART_OPEN = "CHART_OPEN", "Chart Open"
18
19
 
19
20
 
20
21
  class TaskStatus(models.TextChoices):
@@ -32,17 +33,14 @@ class TaskLabelModule(models.TextChoices):
32
33
  TASKS = "tasks", "Tasks"
33
34
 
34
35
 
35
- class Task(models.Model):
36
+ class Task(IdentifiableModel):
36
37
  """Task."""
37
38
 
38
39
  class Meta:
39
- managed = False
40
40
  db_table = "canvas_sdk_data_api_task_001"
41
41
 
42
- id = models.UUIDField()
43
- dbid = models.BigIntegerField(primary_key=True)
44
- created = models.DateTimeField()
45
- modified = models.DateTimeField()
42
+ created = models.DateTimeField(auto_now_add=True)
43
+ modified = models.DateTimeField(auto_now=True)
46
44
  creator = models.ForeignKey(
47
45
  "v1.Staff", on_delete=models.DO_NOTHING, related_name="creator_tasks", null=True
48
46
  )
@@ -54,25 +52,22 @@ class Task(models.Model):
54
52
  patient = models.ForeignKey(
55
53
  "v1.Patient", on_delete=models.DO_NOTHING, blank=True, related_name="tasks", null=True
56
54
  )
57
- task_type = models.CharField(choices=TaskType.choices)
58
- tag = models.CharField()
59
- title = models.CharField()
55
+ task_type = models.CharField(choices=TaskType.choices, max_length=1)
56
+ tag = models.CharField(max_length=64)
57
+ title = models.TextField()
60
58
  due = models.DateTimeField(null=True)
61
- due_event = models.CharField(choices=EventType.choices, blank=True)
62
- status = models.CharField(choices=TaskStatus.choices)
59
+ due_event = models.CharField(choices=EventType.choices, blank=True, max_length=16)
60
+ status = models.CharField(choices=TaskStatus.choices, max_length=9)
63
61
 
64
62
 
65
- class TaskComment(models.Model):
63
+ class TaskComment(IdentifiableModel):
66
64
  """TaskComment."""
67
65
 
68
66
  class Meta:
69
- managed = False
70
67
  db_table = "canvas_sdk_data_api_taskcomment_001"
71
68
 
72
- id = models.UUIDField()
73
- dbid = models.BigIntegerField(primary_key=True)
74
- created = models.DateTimeField()
75
- modified = models.DateTimeField()
69
+ created = models.DateTimeField(auto_now_add=True)
70
+ modified = models.DateTimeField(auto_now=True)
76
71
  creator = models.ForeignKey(
77
72
  "v1.Staff", on_delete=models.DO_NOTHING, related_name="comments", null=True
78
73
  )
@@ -80,32 +75,27 @@ class TaskComment(models.Model):
80
75
  body = models.TextField()
81
76
 
82
77
 
83
- class TaskLabel(models.Model):
78
+ class TaskLabel(IdentifiableModel):
84
79
  """TaskLabel."""
85
80
 
86
81
  class Meta:
87
- managed = False
88
82
  db_table = "canvas_sdk_data_api_tasklabel_001"
89
83
 
90
- id = models.UUIDField()
91
- dbid = models.BigIntegerField(primary_key=True)
92
84
  tasks = models.ManyToManyField(Task, related_name="labels", through="TaskTaskLabel") # type: ignore[var-annotated]
93
85
  position = models.IntegerField()
94
- color = models.CharField(choices=ColorEnum.choices)
95
- task_association = ArrayField(models.CharField(choices=Origin.choices))
96
- name = models.CharField()
86
+ color = models.CharField(choices=ColorEnum.choices, max_length=50)
87
+ task_association = ArrayField(models.CharField(choices=Origin.choices, max_length=32))
88
+ name = models.CharField(max_length=255)
97
89
  active = models.BooleanField()
98
- modules = ArrayField(models.CharField(choices=TaskLabelModule.choices))
90
+ modules = ArrayField(models.CharField(choices=TaskLabelModule.choices, max_length=32))
99
91
 
100
92
 
101
- class TaskTaskLabel(models.Model):
93
+ class TaskTaskLabel(Model):
102
94
  """M2M for Task -> TaskLabels."""
103
95
 
104
96
  class Meta:
105
- managed = False
106
97
  db_table = "canvas_sdk_data_api_tasktasklabel_001"
107
98
 
108
- dbid = models.BigIntegerField(primary_key=True)
109
99
  task_label = models.ForeignKey(TaskLabel, on_delete=models.DO_NOTHING, null=True)
110
100
  task = models.ForeignKey(Task, on_delete=models.DO_NOTHING, null=True)
111
101
 
@@ -1,6 +1,7 @@
1
1
  from django.contrib.postgres.fields import ArrayField
2
2
  from django.db import models
3
3
 
4
+ from canvas_sdk.v1.data.base import IdentifiableModel
4
5
  from canvas_sdk.v1.data.common import ContactPointState, ContactPointSystem, ContactPointUse
5
6
 
6
7
 
@@ -38,41 +39,37 @@ class TeamResponsibility(models.TextChoices):
38
39
  REVIEW_COVERAGES = "REVIEW_COVERAGES", "Review incomplete patient coverages"
39
40
 
40
41
 
41
- class Team(models.Model):
42
+ class Team(IdentifiableModel):
42
43
  """Team."""
43
44
 
44
45
  class Meta:
45
- managed = False
46
46
  db_table = "canvas_sdk_data_api_team_001"
47
47
 
48
- id = models.UUIDField()
49
- dbid = models.BigIntegerField(primary_key=True)
50
- created = models.DateTimeField()
51
- modified = models.DateTimeField()
52
- name = models.CharField()
53
- responsibilities = ArrayField(models.CharField(choices=TeamResponsibility.choices))
54
- members = models.ManyToManyField( # type: ignore[var-annotated]
48
+ created = models.DateTimeField(auto_now_add=True)
49
+ modified = models.DateTimeField(auto_now=True)
50
+ name = models.CharField(max_length=200)
51
+ responsibilities = ArrayField(
52
+ models.CharField(choices=TeamResponsibility.choices, max_length=64)
53
+ )
54
+ members = models.ManyToManyField(
55
55
  "v1.Staff",
56
56
  related_name="teams",
57
57
  db_table="canvas_sdk_data_api_team_members_001",
58
58
  )
59
59
 
60
60
 
61
- class TeamContactPoint(models.Model):
61
+ class TeamContactPoint(IdentifiableModel):
62
62
  """TeamContactPoint."""
63
63
 
64
64
  class Meta:
65
- managed = False
66
65
  db_table = "canvas_sdk_data_api_teamcontactpoint_001"
67
66
 
68
- id = models.UUIDField()
69
- dbid = models.BigIntegerField(primary_key=True)
70
- system = models.CharField(choices=ContactPointSystem.choices)
71
- value = models.CharField()
72
- use = models.CharField(choices=ContactPointUse.choices)
73
- use_notes = models.CharField()
67
+ system = models.CharField(choices=ContactPointSystem.choices, max_length=20)
68
+ value = models.CharField(max_length=100)
69
+ use = models.CharField(choices=ContactPointUse.choices, max_length=20)
70
+ use_notes = models.CharField(max_length=255)
74
71
  rank = models.IntegerField()
75
- state = models.CharField(choices=ContactPointState.choices)
72
+ state = models.CharField(choices=ContactPointState.choices, max_length=20)
76
73
  team = models.ForeignKey(Team, on_delete=models.DO_NOTHING, related_name="telecom")
77
74
 
78
75
 
@@ -1,14 +1,14 @@
1
1
  from django.db import models
2
2
 
3
+ from canvas_sdk.v1.data.base import Model
3
4
 
4
- class CanvasUser(models.Model):
5
+
6
+ class CanvasUser(Model):
5
7
  """A class representing a Canvas User."""
6
8
 
7
9
  class Meta:
8
- managed = False
9
10
  db_table = "canvas_sdk_data_api_auth_user_001"
10
11
 
11
- dbid = models.BigIntegerField(db_column="dbid", primary_key=True)
12
12
  email = models.EmailField(db_column="email")
13
13
  phone_number = models.CharField(db_column="phone_number", max_length=255)
14
14
  last_invite_date_time = models.DateTimeField()
@@ -1,3 +1,4 @@
1
+ import uuid
1
2
  from collections.abc import Sequence
2
3
  from decimal import Decimal
3
4
 
@@ -7,4 +8,9 @@ def quantize(deci: Decimal | float | str | tuple[int, Sequence[int], int]) -> De
7
8
  return Decimal(deci).quantize(Decimal(".01"))
8
9
 
9
10
 
11
+ def create_key() -> str:
12
+ """Generates a unique key using UUID4."""
13
+ return uuid.uuid4().hex
14
+
15
+
10
16
  __exports__ = ()