Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: add mixins for CommittableQuerySet and PatientAssetQuerySet #211

Merged
merged 4 commits into from
Jan 28, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 22 additions & 2 deletions canvas_sdk/v1/data/allergy_intolerance.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,26 @@
from typing import cast

from django.db import models

from canvas_sdk.v1.data.base import CommittableModelManager, ValueSetLookupQuerySet
from canvas_sdk.v1.data.base import (
BaseModelManager,
CommittableQuerySetMixin,
ForPatientQuerySetMixin,
ValueSetLookupQuerySet,
)


class AllergyIntoleranceQuerySet(
ValueSetLookupQuerySet,
CommittableQuerySetMixin,
ForPatientQuerySetMixin,
):
"""AllergyIntoleranceQuerySet."""

pass


AllergyIntoleranceManager = BaseModelManager.from_queryset(AllergyIntoleranceQuerySet)


class AllergyIntolerance(models.Model):
Expand All @@ -10,7 +30,7 @@ class Meta:
managed = False
db_table = "canvas_sdk_data_api_allergyintolerance_001"

objects = CommittableModelManager().from_queryset(ValueSetLookupQuerySet)()
objects = cast(AllergyIntoleranceQuerySet, AllergyIntoleranceManager())

id = models.UUIDField()
dbid = models.BigIntegerField(primary_key=True)
Expand Down
57 changes: 35 additions & 22 deletions canvas_sdk/v1/data/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,25 +10,12 @@
from canvas_sdk.value_set.value_set import ValueSet


class CommittableModelManager(models.Manager):
"""A manager for commands that can be committed."""
class BaseModelManager(models.Manager):
"""A base manager for models."""

def get_queryset(self) -> "CommittableQuerySet":
def get_queryset(self) -> models.QuerySet:
"""Return a queryset that filters out deleted objects."""
# TODO: Should we just filter these out at the view level?
return CommittableQuerySet(self.model, using=self._db).filter(deleted=False)


class CommittableQuerySet(models.QuerySet):
"""A queryset for committable objects."""

def committed(self) -> "Self":
"""Return a queryset that filters for objects that have been committed."""
return self.filter(committer_id__isnull=False, entered_in_error_id__isnull=True)

def for_patient(self, patient_id: str) -> "Self":
"""Return a queryset that filters objects for a specific patient."""
return self.filter(patient__id=patient_id)
return super().get_queryset().filter(deleted=False)


class BaseQuerySet(models.QuerySet):
Expand All @@ -40,10 +27,14 @@ class BaseQuerySet(models.QuerySet):
class QuerySetProtocol(Protocol):
"""A typing protocol for use in mixins into models.QuerySet-inherited classes."""

def filter(self, *args: Any, **kwargs: Any) -> models.QuerySet[Any]:
def filter(self, *args: Any, **kwargs: Any) -> Self:
"""Django's models.QuerySet filter method."""
...

def distinct(self) -> Self:
"""Django's models.QuerySet distinct method."""
...


class ValueSetLookupQuerySetProtocol(QuerySetProtocol):
"""A typing protocol for use in mixins using value set lookup methods."""
Expand All @@ -61,10 +52,26 @@ def q_object(system: str, codes: Container[str]) -> Q:
raise NotImplementedError


class CommittableQuerySetMixin(QuerySetProtocol):
"""A queryset for committable objects."""

def committed(self) -> Self:
"""Return a queryset that filters for objects that have been committed."""
return self.filter(committer_id__isnull=False, entered_in_error_id__isnull=True)


class ForPatientQuerySetMixin(QuerySetProtocol):
"""A queryset for patient assets."""

def for_patient(self, patient_id: str) -> Self:
"""Return a queryset that filters objects for a specific patient."""
return self.filter(patient__id=patient_id)


class ValueSetLookupQuerySetMixin(ValueSetLookupQuerySetProtocol):
"""A QuerySet mixin that can filter objects based on a ValueSet."""

def find(self, value_set: type["ValueSet"]) -> models.QuerySet[Any]:
def find(self, value_set: type["ValueSet"]) -> Self:
"""
Filters conditions, medications, etc. to those found in the inherited ValueSet class that is passed.

Expand Down Expand Up @@ -146,7 +153,7 @@ def timeframe_filter_field(self) -> str:
"""Returns the field that should be filtered on. Can be overridden for different models."""
return "note__datetime_of_service"

def within(self, timeframe: "Timeframe") -> models.QuerySet:
def within(self, timeframe: "Timeframe") -> Self:
"""A method to filter a queryset for datetimes within a timeframe."""
return self.filter(
**{
Expand All @@ -158,13 +165,19 @@ def within(self, timeframe: "Timeframe") -> models.QuerySet:
)


class ValueSetLookupQuerySet(CommittableQuerySet, ValueSetLookupQuerySetMixin):
class CommittableQuerySet(BaseQuerySet, CommittableQuerySetMixin):
"""A queryset for committable objects."""

pass


class ValueSetLookupQuerySet(BaseQuerySet, ValueSetLookupQuerySetMixin):
jamagalhaes marked this conversation as resolved.
Show resolved Hide resolved
"""A class that includes methods for looking up value sets."""

pass


class ValueSetLookupByNameQuerySet(CommittableQuerySet, ValueSetLookupByNameQuerySetMixin):
class ValueSetLookupByNameQuerySet(BaseQuerySet, ValueSetLookupByNameQuerySetMixin):
"""A class that includes methods for looking up value sets by name."""

pass
Expand Down
4 changes: 2 additions & 2 deletions canvas_sdk/v1/data/billing.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
from typing import TYPE_CHECKING
from typing import TYPE_CHECKING, Self

from django.db import models

Expand All @@ -12,7 +12,7 @@
class BillingLineItemQuerySet(ValueSetTimeframeLookupQuerySet):
"""A class that adds functionality to filter BillingLineItem objects."""

def find(self, value_set: type["ValueSet"]) -> models.QuerySet:
def find(self, value_set: type["ValueSet"]) -> Self:
"""
This method is overridden to use for BillingLineItem CPT codes.
The codes are saved as string values in the BillingLineItem.cpt field,
Expand Down
22 changes: 19 additions & 3 deletions canvas_sdk/v1/data/condition.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,15 @@
from typing import cast

from django.db import models
from django.db.models import TextChoices

from canvas_sdk.v1.data.base import ValueSetLookupQuerySet
from canvas_sdk.v1.data.base import (
BaseModelManager,
BaseQuerySet,
CommittableQuerySetMixin,
ForPatientQuerySetMixin,
ValueSetLookupQuerySetMixin,
)


class ClinicalStatus(TextChoices):
Expand All @@ -14,20 +22,28 @@ class ClinicalStatus(TextChoices):
INVESTIGATIVE = "investigative", "investigative"


class ConditionQuerySet(ValueSetLookupQuerySet):
class ConditionQuerySet(
BaseQuerySet,
ValueSetLookupQuerySetMixin,
CommittableQuerySetMixin,
ForPatientQuerySetMixin,
):
jamagalhaes marked this conversation as resolved.
Show resolved Hide resolved
"""ConditionQuerySet."""

pass


ConditionManager = BaseModelManager.from_queryset(ConditionQuerySet)


class Condition(models.Model):
"""Condition."""

class Meta:
managed = False
db_table = "canvas_sdk_data_api_condition_001"

objects = ConditionQuerySet.as_manager()
objects = cast(ConditionQuerySet, ConditionManager())

id = models.UUIDField()
dbid = models.BigIntegerField(primary_key=True)
Expand Down
29 changes: 26 additions & 3 deletions canvas_sdk/v1/data/lab.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,26 @@
from typing import cast

from django.db import models

from canvas_sdk.v1.data.base import (
CommittableModelManager,
BaseModelManager,
BaseQuerySet,
CommittableQuerySetMixin,
ForPatientQuerySetMixin,
TimeframeLookupQuerySetMixin,
ValueSetLookupQuerySet,
)


class LabReportQuerySet(BaseQuerySet, CommittableQuerySetMixin, ForPatientQuerySetMixin):
"""A queryset for lab reports."""

pass


LabReportManager = BaseModelManager.from_queryset(LabReportQuerySet)


class TransmissionType(models.TextChoices):
"""Choices for transmission types."""

Expand All @@ -22,7 +36,7 @@ class Meta:
managed = False
db_table = "canvas_sdk_data_api_labreport_001"

objects = CommittableModelManager()
objects = cast(LabReportQuerySet, LabReportManager())

id = models.UUIDField()
dbid = models.BigIntegerField(primary_key=True)
Expand Down Expand Up @@ -52,14 +66,23 @@ class Meta:
deleted = models.BooleanField()


class LabReviewQuerySet(BaseQuerySet, CommittableQuerySetMixin, ForPatientQuerySetMixin):
"""A queryset for lab reviews."""

pass


LabReviewManager = BaseModelManager.from_queryset(LabReviewQuerySet)


class LabReview(models.Model):
"""A class representing a lab review."""

class Meta:
managed = False
db_table = "canvas_sdk_data_api_labreview_001"

objects = CommittableModelManager()
objects = cast(LabReviewQuerySet, LabReviewManager())

id = models.UUIDField()
dbid = models.BigIntegerField(primary_key=True)
Expand Down
16 changes: 13 additions & 3 deletions canvas_sdk/v1/data/medication.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,14 @@
from typing import cast

from django.db import models
from django.db.models import TextChoices

from canvas_sdk.v1.data.base import CommittableModelManager, ValueSetLookupQuerySet
from canvas_sdk.v1.data.base import (
BaseModelManager,
CommittableQuerySetMixin,
ForPatientQuerySetMixin,
ValueSetLookupQuerySet,
)


class Status(TextChoices):
Expand All @@ -11,20 +18,23 @@ class Status(TextChoices):
INACTIVE = "inactive", "inactive"


class MedicationQuerySet(ValueSetLookupQuerySet):
class MedicationQuerySet(ValueSetLookupQuerySet, CommittableQuerySetMixin, ForPatientQuerySetMixin):
"""MedicationQuerySet."""

pass


MedicationManager = BaseModelManager.from_queryset(MedicationQuerySet)


class Medication(models.Model):
"""Medication."""

class Meta:
managed = False
db_table = "canvas_sdk_data_api_medication_001"

objects = CommittableModelManager.from_queryset(MedicationQuerySet)()
objects = cast(MedicationQuerySet, MedicationManager())

id = models.UUIDField()
dbid = models.BigIntegerField(primary_key=True)
Expand Down
18 changes: 15 additions & 3 deletions canvas_sdk/v1/data/observation.py
Original file line number Diff line number Diff line change
@@ -1,22 +1,34 @@
from typing import cast

from django.db import models

from canvas_sdk.v1.data.base import CommittableModelManager, ValueSetLookupQuerySet
from canvas_sdk.v1.data.base import (
BaseModelManager,
CommittableQuerySetMixin,
ForPatientQuerySetMixin,
ValueSetLookupQuerySet,
)


class ObservationQuerySet(ValueSetLookupQuerySet):
class ObservationQuerySet(
ValueSetLookupQuerySet, CommittableQuerySetMixin, ForPatientQuerySetMixin
):
"""ObservationQuerySet."""

pass


ObservationManager = BaseModelManager.from_queryset(ObservationQuerySet)


class Observation(models.Model):
"""Observation."""

class Meta:
managed = False
db_table = "canvas_sdk_data_api_observation_001"

objects = CommittableModelManager.from_queryset(ObservationQuerySet)()
objects = cast(ObservationQuerySet, ObservationManager())

id = models.UUIDField()
dbid = models.BigIntegerField(primary_key=True)
Expand Down
20 changes: 18 additions & 2 deletions canvas_sdk/v1/data/protocol_override.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,13 @@
from typing import cast

from django.db import models

from canvas_sdk.v1.data.base import CommittableModelManager
from canvas_sdk.v1.data.base import (
BaseModelManager,
BaseQuerySet,
CommittableQuerySetMixin,
ForPatientQuerySetMixin,
)


class IntervalUnit(models.TextChoices):
Expand All @@ -18,14 +25,23 @@ class Status(models.TextChoices):
INACTIVE = "inactive", "inactive"


class ProtocolOverrideQuerySet(BaseQuerySet, ForPatientQuerySetMixin, CommittableQuerySetMixin):
"""ProtocolOverrideQuerySet."""

pass


ProtocolOverrideManager = BaseModelManager.from_queryset(ProtocolOverrideQuerySet)


class ProtocolOverride(models.Model):
"""ProtocolOverride."""

class Meta:
managed = False
db_table = "canvas_sdk_data_api_protocoloverride_001"

objects = CommittableModelManager()
objects = cast(ProtocolOverrideQuerySet, ProtocolOverrideManager())

id = models.UUIDField()
dbid = models.BigIntegerField(primary_key=True)
Expand Down
Loading
Loading