Skip to main content

Simple blood result data collection format model classes for clinicedc/edc projects

Project description

pypi actions codecov downloads

edc-lab-results

Simple blood result data collection format for django models

In this design
  • a specimen requisition for a panel is completed first (SubjectRequisition)

  • result is received and entered into a result form

  • if a result is admnormal or gradable, an ActionItem is created.

Building the Model

Below we create a model class with BloodResultsModelMixin. On the class we specify the lab_panel and limit the FK the requisitions of this panel using limit_choices_to.

# models.py

from edc_lab.model_mixins import CrfWithRequisitionModelMixin, requisition_fk_options
from edc_lab_panels.panels import chemistry_panel

class BloodResultsFbc(
    CrfWithRequisitionModelMixin,
    BloodResultsModelMixin,
    BaseUuidModel,
):

    lab_panel = fbc_panel

    requisition = models.ForeignKey(
        limit_choices_to={"panel__name": fbc_panel.name}, **requisition_fk_options
    )

    class Meta(CrfWithActionModelMixin.Meta, BaseUuidModel.Meta):
        verbose_name = "Blood Result: FBC"
        verbose_name_plural = "Blood Results: FBC"

The above example has no fields for results, so let’s add some model mixins, one for each result item.

# models.py

class BloodResultsFbc(
    CrfWithRequisitionModelMixin,
    HaemoglobinModelMixin,
    HctModelMixin,
    RbcModelMixin,
    WbcModelMixin,
    PlateletsModelMixin,
    MchModelMixin,
    MchcModelMixin,
    McvModelMixin,
    BloodResultsModelMixin,
    CrfStatusModelMixin,
    BaseUuidModel,
):

    lab_panel = fbc_panel

    requisition = models.ForeignKey(
        limit_choices_to={"panel__name": fbc_panel.name}, **requisition_fk_options
    )

    class Meta(CrfWithActionModelMixin.Meta, BaseUuidModel.Meta):
        verbose_name = "Blood Result: FBC"
        verbose_name_plural = "Blood Results: FBC"

If an ActionItem is to be created because of an abnormal or reportable result item, add the ActionItem.

# models.py

class BloodResultsFbc(
    CrfWithActionModelMixin,
    CrfWithRequisitionModelMixin,
    HaemoglobinModelMixin,
    HctModelMixin,
    RbcModelMixin,
    WbcModelMixin,
    PlateletsModelMixin,
    MchModelMixin,
    MchcModelMixin,
    McvModelMixin,
    BloodResultsModelMixin,
    CrfStatusModelMixin,
    BaseUuidModel,
):
    action_name = BLOOD_RESULTS_FBC_ACTION

    lab_panel = fbc_panel

    requisition = models.ForeignKey(
        limit_choices_to={"panel__name": fbc_panel.name}, **requisition_fk_options
    )

    class Meta(CrfWithActionModelMixin.Meta, BaseUuidModel.Meta):
        verbose_name = "Blood Result: FBC"
        verbose_name_plural = "Blood Results: FBC"

Building the ModeForm class

The ModelForm class just needs the Model class and the panel. In this case BloodResultsFbc and fbc_panel.

# forms.py

class BloodResultsFbcFormValidator(BloodResultsFormValidatorMixin, CrfFormValidator):
    panel = fbc_panel


class BloodResultsFbcForm(ActionItemCrfFormMixin, CrfModelFormMixin, forms.ModelForm):
    form_validator_cls = BloodResultsFbcFormValidator

    class Meta(ActionItemCrfFormMixin.Meta):
        model = BloodResultsFbc
        fields = "__all__"

Building the ModelAdmin class

The ModelAdmin class needs the Model class, ModelForm class and the panel.

# admin.py

@admin.register(BloodResultsFbc, site=intecomm_subject_admin)
class BloodResultsFbcAdmin(BloodResultsModelAdminMixin, CrfModelAdmin):
    form = BloodResultsFbcForm
    fieldsets = BloodResultFieldset(
        BloodResultsFbc.lab_panel,
        model_cls=BloodResultsFbc,
        extra_fieldsets=[(-1, action_fieldset_tuple)],
    ).fieldsets

The SubjectRequistion ModelAdmin class

When using autocomplete for the subject requsition FK on the result form ModelAdmin class, the subject requsition model admin class needs to filter the search results passed to the autocomplete control.

If all result models are prefixed with “bloodresult”, you can filter on the path name like this:

# admin.py

@admin.register(SubjectRequisition, site=intecomm_subject_admin)
class SubjectRequisitionAdmin(RequisitionAdminMixin, CrfModelAdmin):
    form = SubjectRequisitionForm

    # ...

    def get_search_results(self, request, queryset, search_term):
        queryset, use_distinct = super().get_search_results(request, queryset, search_term)
        path = urlsplit(request.META.get("HTTP_REFERER")).path
        query = urlsplit(request.META.get("HTTP_REFERER")).query
        if "bloodresult" in str(path):
            attrs = parse_qs(str(query))
            try:
                subject_visit = attrs.get("subject_visit")[0]
            except (TypeError, IndexError):
                pass
            else:
                queryset = queryset.filter(subject_visit=subject_visit, is_drawn=YES)
        return queryset, use_distinct

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

edc_lab_results-1.0.2.tar.gz (41.4 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

edc_lab_results-1.0.2-py3-none-any.whl (48.2 kB view details)

Uploaded Python 3

File details

Details for the file edc_lab_results-1.0.2.tar.gz.

File metadata

  • Download URL: edc_lab_results-1.0.2.tar.gz
  • Upload date:
  • Size: 41.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.12.11

File hashes

Hashes for edc_lab_results-1.0.2.tar.gz
Algorithm Hash digest
SHA256 3e5ae8cce136e7cf7a8efa17eb8bf5f9470a07218e7bf8e2b10e201d0cbadfc1
MD5 e5b0aacafa9d9ee6eef04d78aec908d1
BLAKE2b-256 79d075278605d821a55a815d8e0ac3f87e9e8b34a6a8864296cb34a9770bace8

See more details on using hashes here.

File details

Details for the file edc_lab_results-1.0.2-py3-none-any.whl.

File metadata

File hashes

Hashes for edc_lab_results-1.0.2-py3-none-any.whl
Algorithm Hash digest
SHA256 1a0d099afd50ad1c1ac1791308eba23e7f10b2db68536cd2e6eb01540c413f94
MD5 2d108268e3afcd9f1c33dd3aceefab0f
BLAKE2b-256 2b5352c80f6890eef52f4dd337e762950ce2cfcd991bfc7a2a01c413eec8214e

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page