From b7b03cc1e1ab83f04c146dab0baeaa8dbe050e2a Mon Sep 17 00:00:00 2001 From: erikvw Date: Tue, 10 Sep 2024 09:26:09 -0500 Subject: [PATCH 1/6] update settings.STORAGES --- effect_edc/settings/defaults.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/effect_edc/settings/defaults.py b/effect_edc/settings/defaults.py index 489486e..792f1ca 100644 --- a/effect_edc/settings/defaults.py +++ b/effect_edc/settings/defaults.py @@ -482,7 +482,7 @@ AWS_S3_OBJECT_PARAMETERS = {"CacheControl": "max-age=86400"} AWS_LOCATION = env.str("AWS_LOCATION") AWS_IS_GZIPPED = True - STATICFILES_STORAGE = "storages.backends.s3boto3.S3Boto3Storage" + STORAGES = {"staticfiles": {"BACKEND": "storages.backends.s3boto3.S3Boto3Storage"}} STATIC_URL = f"{os.path.join(AWS_S3_CUSTOM_DOMAIN, AWS_LOCATION)}/" STATIC_ROOT = "" else: From a47ce899f6ce5aaac73c6b7f3013c2b331ef93ef Mon Sep 17 00:00:00 2001 From: erikvw Date: Tue, 10 Sep 2024 10:33:51 -0500 Subject: [PATCH 2/6] add on study lab QA report --- effect_reports/admin/__init__.py | 1 + effect_reports/admin/dbviews/__init__.py | 1 + .../__init__.py | 1 + .../unmanaged_model_admin.py | 13 ++++++ effect_reports/models/__init__.py | 1 + effect_reports/models/dbviews/__init__.py | 1 + .../on_study_missing_lab_values/__init__.py | 1 + .../on_study_missing_lab_values/qa_cases.py | 46 +++++++++++++++++++ .../unmanged_model.py | 20 ++++++++ .../view_definition.py | 17 +++++++ 10 files changed, 102 insertions(+) create mode 100644 effect_reports/admin/dbviews/__init__.py create mode 100644 effect_reports/admin/dbviews/on_study_missing_lab_values_admin/__init__.py create mode 100644 effect_reports/admin/dbviews/on_study_missing_lab_values_admin/unmanaged_model_admin.py create mode 100644 effect_reports/models/dbviews/__init__.py create mode 100644 effect_reports/models/dbviews/on_study_missing_lab_values/__init__.py create mode 100644 effect_reports/models/dbviews/on_study_missing_lab_values/qa_cases.py create mode 100644 effect_reports/models/dbviews/on_study_missing_lab_values/unmanged_model.py create mode 100644 effect_reports/models/dbviews/on_study_missing_lab_values/view_definition.py diff --git a/effect_reports/admin/__init__.py b/effect_reports/admin/__init__.py index 3d0a334..dfc614f 100644 --- a/effect_reports/admin/__init__.py +++ b/effect_reports/admin/__init__.py @@ -1,3 +1,4 @@ +from .dbviews import OnStudyMissingLabValuesAdmin from .serum_crag_date_admin import SerumCragDateAdmin, SerumCragDateNoteAdmin from .unmanaged import ( Rm792KwInCurrentSxGteG3OtherAdmin, diff --git a/effect_reports/admin/dbviews/__init__.py b/effect_reports/admin/dbviews/__init__.py new file mode 100644 index 0000000..86969a9 --- /dev/null +++ b/effect_reports/admin/dbviews/__init__.py @@ -0,0 +1 @@ +from .on_study_missing_lab_values_admin import OnStudyMissingLabValuesAdmin diff --git a/effect_reports/admin/dbviews/on_study_missing_lab_values_admin/__init__.py b/effect_reports/admin/dbviews/on_study_missing_lab_values_admin/__init__.py new file mode 100644 index 0000000..fe1833e --- /dev/null +++ b/effect_reports/admin/dbviews/on_study_missing_lab_values_admin/__init__.py @@ -0,0 +1 @@ +from .unmanaged_model_admin import OnStudyMissingLabValuesAdmin diff --git a/effect_reports/admin/dbviews/on_study_missing_lab_values_admin/unmanaged_model_admin.py b/effect_reports/admin/dbviews/on_study_missing_lab_values_admin/unmanaged_model_admin.py new file mode 100644 index 0000000..7bcbe50 --- /dev/null +++ b/effect_reports/admin/dbviews/on_study_missing_lab_values_admin/unmanaged_model_admin.py @@ -0,0 +1,13 @@ +from django.contrib import admin +from edc_qareports.modeladmin_mixins import OnStudyMissingValuesModelAdminMixin + +from ....admin_site import effect_reports_admin +from ....models import OnStudyMissingLabValues + + +@admin.register(OnStudyMissingLabValues, site=effect_reports_admin) +class OnStudyMissingLabValuesAdmin(OnStudyMissingValuesModelAdminMixin, admin.ModelAdmin): + + include_note_column: bool = True + + instructions = ["ello"] diff --git a/effect_reports/models/__init__.py b/effect_reports/models/__init__.py index bceb325..26c02f6 100644 --- a/effect_reports/models/__init__.py +++ b/effect_reports/models/__init__.py @@ -1,3 +1,4 @@ +from .dbviews import OnStudyMissingLabValues from .serum_crag_date import SerumCragDate, SerumCragDateNote from .unmanaged import ( Rm792KwInCurrentSxGteG3Other, diff --git a/effect_reports/models/dbviews/__init__.py b/effect_reports/models/dbviews/__init__.py new file mode 100644 index 0000000..6f73b63 --- /dev/null +++ b/effect_reports/models/dbviews/__init__.py @@ -0,0 +1 @@ +from .on_study_missing_lab_values import OnStudyMissingLabValues diff --git a/effect_reports/models/dbviews/on_study_missing_lab_values/__init__.py b/effect_reports/models/dbviews/on_study_missing_lab_values/__init__.py new file mode 100644 index 0000000..04933f0 --- /dev/null +++ b/effect_reports/models/dbviews/on_study_missing_lab_values/__init__.py @@ -0,0 +1 @@ +from .unmanged_model import OnStudyMissingLabValues diff --git a/effect_reports/models/dbviews/on_study_missing_lab_values/qa_cases.py b/effect_reports/models/dbviews/on_study_missing_lab_values/qa_cases.py new file mode 100644 index 0000000..906aadc --- /dev/null +++ b/effect_reports/models/dbviews/on_study_missing_lab_values/qa_cases.py @@ -0,0 +1,46 @@ +from edc_lab_panel.constants import FBC, LFT, LIPIDS, RFT +from edc_lab_panel.panels import fbc_panel, lft_panel, lipids_panel, rft_panel +from edc_qareports.sql_generator import CrfCase, RequisitionCase + +qa_cases = [ + RequisitionCase( + label="FBC requisitioned but not entered", + dbtable="meta_subject_bloodresultsfbc", + label_lower="meta_subject.bloodresultsfbc", + panel=FBC, + ), + RequisitionCase( + label="RFT requisitioned but not entered", + dbtable="meta_subject_bloodresultsrft", + label_lower="meta_subject.bloodresultsrft", + panel=RFT, + ), + RequisitionCase( + label="LFT requisitioned but not entered", + dbtable="meta_subject_bloodresultslft", + label_lower="meta_subject.bloodresultslft", + panel=LFT, + ), + RequisitionCase( + label="LIPIDS requisitioned but not entered", + dbtable="meta_subject_bloodresultslipids", + label_lower="meta_subject.bloodresultslipids", + panel=LIPIDS, + ), +] + +panels = {FBC: fbc_panel, RFT: rft_panel, LFT: lft_panel, LIPIDS: lipids_panel} +for abbrev, panel in panels.items(): + for utest_id in panel.utest_ids: + try: + utest_id, _ = utest_id + except ValueError: + pass + qa_cases.append( + CrfCase( + label=f"{abbrev.upper()}: missing {utest_id} value/units", + dbtable=f"meta_subject_bloodresults{abbrev.lower()}", + label_lower=f"meta_subject.bloodresults{abbrev.lower()}", + where=f"crf.{utest_id}_value is null or crf.{utest_id}_units is null", + ) + ) diff --git a/effect_reports/models/dbviews/on_study_missing_lab_values/unmanged_model.py b/effect_reports/models/dbviews/on_study_missing_lab_values/unmanged_model.py new file mode 100644 index 0000000..1dbaa52 --- /dev/null +++ b/effect_reports/models/dbviews/on_study_missing_lab_values/unmanged_model.py @@ -0,0 +1,20 @@ +from django_db_views.db_view import DBView +from edc_qareports.model_mixins import ( + OnStudyMissingValuesModelMixin, + QaReportModelMixin, + qa_reports_permissions, +) + +from .view_definition import get_view_definition + + +class OnStudyMissingLabValues(OnStudyMissingValuesModelMixin, QaReportModelMixin, DBView): + + view_definition = get_view_definition() + + class Meta: + managed = False + db_table = "onstudy_missing_lab_values_view" + verbose_name = "Missing Lab values for on-study patient" + verbose_name_plural = "Missing Lab values for on-study patients" + default_permissions = qa_reports_permissions diff --git a/effect_reports/models/dbviews/on_study_missing_lab_values/view_definition.py b/effect_reports/models/dbviews/on_study_missing_lab_values/view_definition.py new file mode 100644 index 0000000..a11d1b4 --- /dev/null +++ b/effect_reports/models/dbviews/on_study_missing_lab_values/view_definition.py @@ -0,0 +1,17 @@ +from edc_qareports.sql_generator import SqlViewGenerator + +from .qa_cases import qa_cases + + +def get_view_definition() -> dict: + subquery = " UNION ".join([qa_case.sql for qa_case in qa_cases]) + sql_view = SqlViewGenerator( + report_model="onstudy_missing_lab_values_view", + ordering=["subject_identifier", "site_id"], + ) + + return { + "django.db.backends.mysql": sql_view.as_mysql(subquery), + "django.db.backends.postgresql": sql_view.as_postgres(subquery), + "django.db.backends.sqlite3": sql_view.as_sqlite(subquery), + } From ca8580cfbe03ec1b15c5ef1ae30fa344c5ce0666 Mon Sep 17 00:00:00 2001 From: Jonathan Willitts Date: Thu, 12 Sep 2024 11:34:56 +0100 Subject: [PATCH 3/6] Configure missing lab values qa_cases --- effect_edc/settings/defaults.py | 3 +- effect_labs/constants.py | 3 + effect_labs/panels.py | 10 ++-- .../0004_onstudymissinglabvalues_and_more.py | 50 ++++++++++++++++ .../migrations/0005_auto_20240912_1156.py | 48 +++++++++++++++ .../on_study_missing_lab_values/qa_cases.py | 59 ++++++++----------- .../unmanged_model.py | 4 +- 7 files changed, 137 insertions(+), 40 deletions(-) create mode 100644 effect_labs/constants.py create mode 100644 effect_reports/migrations/0004_onstudymissinglabvalues_and_more.py create mode 100644 effect_reports/migrations/0005_auto_20240912_1156.py diff --git a/effect_edc/settings/defaults.py b/effect_edc/settings/defaults.py index 792f1ca..1be0b65 100644 --- a/effect_edc/settings/defaults.py +++ b/effect_edc/settings/defaults.py @@ -82,8 +82,9 @@ "multisite", "fontawesomefree", "django_crypto_fields.apps.AppConfig", - "django_revision.apps.AppConfig", + "django_db_views", "django_extensions", + "django_revision.apps.AppConfig", "logentry_admin", "simple_history", "storages", diff --git a/effect_labs/constants.py b/effect_labs/constants.py new file mode 100644 index 0000000..61432c3 --- /dev/null +++ b/effect_labs/constants.py @@ -0,0 +1,3 @@ +BLOOD_CULTURE = "blood_culture" +CHEMISTRY = "chemistry" +CSF_CULTURE = "csf_culture" diff --git a/effect_labs/panels.py b/effect_labs/panels.py index 9e8676c..12ec453 100644 --- a/effect_labs/panels.py +++ b/effect_labs/panels.py @@ -1,5 +1,7 @@ from edc_lab import RequisitionPanel +from edc_lab_panel.constants import FBC +from .constants import BLOOD_CULTURE, CHEMISTRY, CSF_CULTURE from .processing_profiles import ( blood_culture_processing, chemistry_processing, @@ -10,7 +12,7 @@ ) chemistry_panel = RequisitionPanel( - name="chemistry", + name=CHEMISTRY, verbose_name="Chemistry: RFT, LFT, Electrolytes", abbreviation="CHEM", processing_profile=chemistry_processing, @@ -40,7 +42,7 @@ ], ) csf_culture_panel = RequisitionPanel( - name="csf_culture", + name=CSF_CULTURE, verbose_name="CSF culture", abbreviation="CSFC", processing_profile=csf_culture_processing, @@ -64,7 +66,7 @@ ) blood_culture_panel = RequisitionPanel( - name="blood_culture", + name=BLOOD_CULTURE, verbose_name="Blood culture", abbreviation="BLE", processing_profile=blood_culture_processing, @@ -73,7 +75,7 @@ # TODO: update fbc_panel fbc_panel = RequisitionPanel( - name="fbc", + name=FBC, verbose_name="Full Blood Count", processing_profile=fbc_processing, abbreviation="FBC", diff --git a/effect_reports/migrations/0004_onstudymissinglabvalues_and_more.py b/effect_reports/migrations/0004_onstudymissinglabvalues_and_more.py new file mode 100644 index 0000000..1bcc23d --- /dev/null +++ b/effect_reports/migrations/0004_onstudymissinglabvalues_and_more.py @@ -0,0 +1,50 @@ +# Generated by Django 5.1.1 on 2024-09-12 09:55 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("effect_reports", "0003_serumcragdate_historicalserumcragdatenote_and_more"), + ("sites", "0002_alter_domain_unique"), + ] + + operations = [ + migrations.CreateModel( + name="OnStudyMissingLabValues", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, primary_key=True, serialize=False, verbose_name="ID" + ), + ), + ("original_id", models.UUIDField(null=True)), + ("label_lower", models.CharField(max_length=150, null=True)), + ("subject_visit_id", models.UUIDField(null=True)), + ("report_datetime", models.DateTimeField(null=True)), + ("label", models.CharField(max_length=50, null=True)), + ("visit_code", models.CharField(max_length=25, null=True)), + ("visit_code_sequence", models.IntegerField(null=True)), + ("schedule_name", models.CharField(max_length=25, null=True)), + ("modified", models.DateTimeField(null=True)), + ("report_model", models.CharField(max_length=50)), + ("subject_identifier", models.CharField(max_length=25)), + ("created", models.DateTimeField()), + ], + options={ + "verbose_name": "Missing lab values for on-study patient", + "verbose_name_plural": "Missing lab values for on-study patients", + "db_table": "onstudy_missing_lab_values_view", + "managed": False, + "default_permissions": ("view", "export", "viewallsites"), + }, + ), + migrations.AddIndex( + model_name="serumcragdate", + index=models.Index( + fields=["subject_identifier", "site"], name="effect_repo_subject_24c4b3_idx" + ), + ), + ] diff --git a/effect_reports/migrations/0005_auto_20240912_1156.py b/effect_reports/migrations/0005_auto_20240912_1156.py new file mode 100644 index 0000000..4797a63 --- /dev/null +++ b/effect_reports/migrations/0005_auto_20240912_1156.py @@ -0,0 +1,48 @@ +# Generated by Django 5.1.1 on 2024-09-12 09:56 + +import django_db_views.migration_functions +import django_db_views.operations +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ("effect_reports", "0004_onstudymissinglabvalues_and_more"), + ] + + operations = [ + django_db_views.operations.ViewRunPython( + code=django_db_views.migration_functions.ForwardViewMigration( + "select *, uuid() as id, now() as `created`, 'onstudy_missing_lab_values_view' as `report_model` from (SELECT req.subject_identifier, req.id AS original_id, req.subject_visit_id, req.report_datetime, req.site_id, v.visit_code, v.visit_code_sequence, v.schedule_name, req.modified, 'effect_subject.bloodresultschem' AS label_lower, 'CHEM requisitioned but not entered' AS label, COUNT(*) AS records FROM effect_subject_subjectrequisition AS req LEFT JOIN effect_subject_bloodresultschem AS crf ON req.id = crf.requisition_id LEFT JOIN effect_subject_subjectvisit AS v ON v.id = req.subject_visit_id LEFT JOIN edc_lab_panel AS panel ON req.panel_id = panel.id WHERE panel.name = 'chemistry' AND req.is_drawn = 'Yes' AND crf.id IS NULL GROUP BY req.id, req.subject_identifier, req.subject_visit_id, req.report_datetime, req.site_id, v.visit_code, v.visit_code_sequence, v.schedule_name, req.modified UNION SELECT req.subject_identifier, req.id AS original_id, req.subject_visit_id, req.report_datetime, req.site_id, v.visit_code, v.visit_code_sequence, v.schedule_name, req.modified, 'effect_subject.lpcsf' AS label_lower, 'CSFC requisitioned but not entered' AS label, COUNT(*) AS records FROM effect_subject_subjectrequisition AS req LEFT JOIN effect_subject_lpcsf AS crf ON req.id = crf.csf_requisition_id LEFT JOIN effect_subject_subjectvisit AS v ON v.id = req.subject_visit_id LEFT JOIN edc_lab_panel AS panel ON req.panel_id = panel.id WHERE panel.name = 'csf_culture' AND req.is_drawn = 'Yes' AND crf.id IS NULL GROUP BY req.id, req.subject_identifier, req.subject_visit_id, req.report_datetime, req.site_id, v.visit_code, v.visit_code_sequence, v.schedule_name, req.modified UNION SELECT req.subject_identifier, req.id AS original_id, req.subject_visit_id, req.report_datetime, req.site_id, v.visit_code, v.visit_code_sequence, v.schedule_name, req.modified, 'effect_subject.bloodresultsfbc' AS label_lower, 'FBC requisitioned but not entered' AS label, COUNT(*) AS records FROM effect_subject_subjectrequisition AS req LEFT JOIN effect_subject_bloodresultsfbc AS crf ON req.id = crf.requisition_id LEFT JOIN effect_subject_subjectvisit AS v ON v.id = req.subject_visit_id LEFT JOIN edc_lab_panel AS panel ON req.panel_id = panel.id WHERE panel.name = 'fbc' AND req.is_drawn = 'Yes' AND crf.id IS NULL GROUP BY req.id, req.subject_identifier, req.subject_visit_id, req.report_datetime, req.site_id, v.visit_code, v.visit_code_sequence, v.schedule_name, req.modified UNION SELECT req.subject_identifier, req.id AS original_id, req.subject_visit_id, req.report_datetime, req.site_id, v.visit_code, v.visit_code_sequence, v.schedule_name, req.modified, 'effect_subject.tbdiagnostics' AS label_lower, 'SPM requisitioned but not entered' AS label, COUNT(*) AS records FROM effect_subject_subjectrequisition AS req LEFT JOIN effect_subject_tbdiagnostics AS crf ON req.id = crf.sputum_requisition_id LEFT JOIN effect_subject_subjectvisit AS v ON v.id = req.subject_visit_id LEFT JOIN edc_lab_panel AS panel ON req.panel_id = panel.id WHERE panel.name = 'sputum' AND req.is_drawn = 'Yes' AND crf.id IS NULL GROUP BY req.id, req.subject_identifier, req.subject_visit_id, req.report_datetime, req.site_id, v.visit_code, v.visit_code_sequence, v.schedule_name, req.modified UNION SELECT v.subject_identifier, crf.id AS original_id, crf.subject_visit_id, crf.report_datetime, crf.site_id, v.visit_code, v.visit_code_sequence, v.schedule_name, crf.modified, 'effect_subject.bloodresultschem' AS label_lower, 'CHEM: missing alt value/units' AS label, COUNT(*) AS records FROM effect_subject_bloodresultschem AS crf LEFT JOIN effect_subject_subjectvisit AS v ON v.id = crf.subject_visit_id WHERE crf.alt_value IS NULL OR crf.alt_units IS NULL GROUP BY v.subject_identifier, crf.subject_visit_id, crf.report_datetime, crf.site_id, v.visit_code, v.visit_code_sequence, v.schedule_name, crf.modified UNION SELECT v.subject_identifier, crf.id AS original_id, crf.subject_visit_id, crf.report_datetime, crf.site_id, v.visit_code, v.visit_code_sequence, v.schedule_name, crf.modified, 'effect_subject.bloodresultschem' AS label_lower, 'CHEM: missing creatinine value/units' AS label, COUNT(*) AS records FROM effect_subject_bloodresultschem AS crf LEFT JOIN effect_subject_subjectvisit AS v ON v.id = crf.subject_visit_id WHERE crf.creatinine_value IS NULL OR crf.creatinine_units IS NULL GROUP BY v.subject_identifier, crf.subject_visit_id, crf.report_datetime, crf.site_id, v.visit_code, v.visit_code_sequence, v.schedule_name, crf.modified UNION SELECT v.subject_identifier, crf.id AS original_id, crf.subject_visit_id, crf.report_datetime, crf.site_id, v.visit_code, v.visit_code_sequence, v.schedule_name, crf.modified, 'effect_subject.bloodresultschem' AS label_lower, 'CHEM: missing albumin value/units' AS label, COUNT(*) AS records FROM effect_subject_bloodresultschem AS crf LEFT JOIN effect_subject_subjectvisit AS v ON v.id = crf.subject_visit_id WHERE crf.albumin_value IS NULL OR crf.albumin_units IS NULL GROUP BY v.subject_identifier, crf.subject_visit_id, crf.report_datetime, crf.site_id, v.visit_code, v.visit_code_sequence, v.schedule_name, crf.modified UNION SELECT v.subject_identifier, crf.id AS original_id, crf.subject_visit_id, crf.report_datetime, crf.site_id, v.visit_code, v.visit_code_sequence, v.schedule_name, crf.modified, 'effect_subject.bloodresultschem' AS label_lower, 'CHEM: missing alp value/units' AS label, COUNT(*) AS records FROM effect_subject_bloodresultschem AS crf LEFT JOIN effect_subject_subjectvisit AS v ON v.id = crf.subject_visit_id WHERE crf.alp_value IS NULL OR crf.alp_units IS NULL GROUP BY v.subject_identifier, crf.subject_visit_id, crf.report_datetime, crf.site_id, v.visit_code, v.visit_code_sequence, v.schedule_name, crf.modified UNION SELECT v.subject_identifier, crf.id AS original_id, crf.subject_visit_id, crf.report_datetime, crf.site_id, v.visit_code, v.visit_code_sequence, v.schedule_name, crf.modified, 'effect_subject.bloodresultschem' AS label_lower, 'CHEM: missing ast value/units' AS label, COUNT(*) AS records FROM effect_subject_bloodresultschem AS crf LEFT JOIN effect_subject_subjectvisit AS v ON v.id = crf.subject_visit_id WHERE crf.ast_value IS NULL OR crf.ast_units IS NULL GROUP BY v.subject_identifier, crf.subject_visit_id, crf.report_datetime, crf.site_id, v.visit_code, v.visit_code_sequence, v.schedule_name, crf.modified UNION SELECT v.subject_identifier, crf.id AS original_id, crf.subject_visit_id, crf.report_datetime, crf.site_id, v.visit_code, v.visit_code_sequence, v.schedule_name, crf.modified, 'effect_subject.bloodresultschem' AS label_lower, 'CHEM: missing crp value/units' AS label, COUNT(*) AS records FROM effect_subject_bloodresultschem AS crf LEFT JOIN effect_subject_subjectvisit AS v ON v.id = crf.subject_visit_id WHERE crf.crp_value IS NULL OR crf.crp_units IS NULL GROUP BY v.subject_identifier, crf.subject_visit_id, crf.report_datetime, crf.site_id, v.visit_code, v.visit_code_sequence, v.schedule_name, crf.modified UNION SELECT v.subject_identifier, crf.id AS original_id, crf.subject_visit_id, crf.report_datetime, crf.site_id, v.visit_code, v.visit_code_sequence, v.schedule_name, crf.modified, 'effect_subject.bloodresultschem' AS label_lower, 'CHEM: missing egfr value/units' AS label, COUNT(*) AS records FROM effect_subject_bloodresultschem AS crf LEFT JOIN effect_subject_subjectvisit AS v ON v.id = crf.subject_visit_id WHERE crf.egfr_value IS NULL OR crf.egfr_units IS NULL GROUP BY v.subject_identifier, crf.subject_visit_id, crf.report_datetime, crf.site_id, v.visit_code, v.visit_code_sequence, v.schedule_name, crf.modified UNION SELECT v.subject_identifier, crf.id AS original_id, crf.subject_visit_id, crf.report_datetime, crf.site_id, v.visit_code, v.visit_code_sequence, v.schedule_name, crf.modified, 'effect_subject.bloodresultschem' AS label_lower, 'CHEM: missing magnesium value/units' AS label, COUNT(*) AS records FROM effect_subject_bloodresultschem AS crf LEFT JOIN effect_subject_subjectvisit AS v ON v.id = crf.subject_visit_id WHERE crf.magnesium_value IS NULL OR crf.magnesium_units IS NULL GROUP BY v.subject_identifier, crf.subject_visit_id, crf.report_datetime, crf.site_id, v.visit_code, v.visit_code_sequence, v.schedule_name, crf.modified UNION SELECT v.subject_identifier, crf.id AS original_id, crf.subject_visit_id, crf.report_datetime, crf.site_id, v.visit_code, v.visit_code_sequence, v.schedule_name, crf.modified, 'effect_subject.bloodresultschem' AS label_lower, 'CHEM: missing potassium value/units' AS label, COUNT(*) AS records FROM effect_subject_bloodresultschem AS crf LEFT JOIN effect_subject_subjectvisit AS v ON v.id = crf.subject_visit_id WHERE crf.potassium_value IS NULL OR crf.potassium_units IS NULL GROUP BY v.subject_identifier, crf.subject_visit_id, crf.report_datetime, crf.site_id, v.visit_code, v.visit_code_sequence, v.schedule_name, crf.modified UNION SELECT v.subject_identifier, crf.id AS original_id, crf.subject_visit_id, crf.report_datetime, crf.site_id, v.visit_code, v.visit_code_sequence, v.schedule_name, crf.modified, 'effect_subject.bloodresultschem' AS label_lower, 'CHEM: missing ggt value/units' AS label, COUNT(*) AS records FROM effect_subject_bloodresultschem AS crf LEFT JOIN effect_subject_subjectvisit AS v ON v.id = crf.subject_visit_id WHERE crf.ggt_value IS NULL OR crf.ggt_units IS NULL GROUP BY v.subject_identifier, crf.subject_visit_id, crf.report_datetime, crf.site_id, v.visit_code, v.visit_code_sequence, v.schedule_name, crf.modified UNION SELECT v.subject_identifier, crf.id AS original_id, crf.subject_visit_id, crf.report_datetime, crf.site_id, v.visit_code, v.visit_code_sequence, v.schedule_name, crf.modified, 'effect_subject.bloodresultschem' AS label_lower, 'CHEM: missing urea value/units' AS label, COUNT(*) AS records FROM effect_subject_bloodresultschem AS crf LEFT JOIN effect_subject_subjectvisit AS v ON v.id = crf.subject_visit_id WHERE crf.urea_value IS NULL OR crf.urea_units IS NULL GROUP BY v.subject_identifier, crf.subject_visit_id, crf.report_datetime, crf.site_id, v.visit_code, v.visit_code_sequence, v.schedule_name, crf.modified UNION SELECT v.subject_identifier, crf.id AS original_id, crf.subject_visit_id, crf.report_datetime, crf.site_id, v.visit_code, v.visit_code_sequence, v.schedule_name, crf.modified, 'effect_subject.bloodresultschem' AS label_lower, 'CHEM: missing tbil value/units' AS label, COUNT(*) AS records FROM effect_subject_bloodresultschem AS crf LEFT JOIN effect_subject_subjectvisit AS v ON v.id = crf.subject_visit_id WHERE crf.tbil_value IS NULL OR crf.tbil_units IS NULL GROUP BY v.subject_identifier, crf.subject_visit_id, crf.report_datetime, crf.site_id, v.visit_code, v.visit_code_sequence, v.schedule_name, crf.modified UNION SELECT v.subject_identifier, crf.id AS original_id, crf.subject_visit_id, crf.report_datetime, crf.site_id, v.visit_code, v.visit_code_sequence, v.schedule_name, crf.modified, 'effect_subject.bloodresultsfbc' AS label_lower, 'FBC: missing haemoglobin value/units' AS label, COUNT(*) AS records FROM effect_subject_bloodresultsfbc AS crf LEFT JOIN effect_subject_subjectvisit AS v ON v.id = crf.subject_visit_id WHERE crf.haemoglobin_value IS NULL OR crf.haemoglobin_units IS NULL GROUP BY v.subject_identifier, crf.subject_visit_id, crf.report_datetime, crf.site_id, v.visit_code, v.visit_code_sequence, v.schedule_name, crf.modified UNION SELECT v.subject_identifier, crf.id AS original_id, crf.subject_visit_id, crf.report_datetime, crf.site_id, v.visit_code, v.visit_code_sequence, v.schedule_name, crf.modified, 'effect_subject.bloodresultsfbc' AS label_lower, 'FBC: missing wbc value/units' AS label, COUNT(*) AS records FROM effect_subject_bloodresultsfbc AS crf LEFT JOIN effect_subject_subjectvisit AS v ON v.id = crf.subject_visit_id WHERE crf.wbc_value IS NULL OR crf.wbc_units IS NULL GROUP BY v.subject_identifier, crf.subject_visit_id, crf.report_datetime, crf.site_id, v.visit_code, v.visit_code_sequence, v.schedule_name, crf.modified UNION SELECT v.subject_identifier, crf.id AS original_id, crf.subject_visit_id, crf.report_datetime, crf.site_id, v.visit_code, v.visit_code_sequence, v.schedule_name, crf.modified, 'effect_subject.bloodresultsfbc' AS label_lower, 'FBC: missing platelets value/units' AS label, COUNT(*) AS records FROM effect_subject_bloodresultsfbc AS crf LEFT JOIN effect_subject_subjectvisit AS v ON v.id = crf.subject_visit_id WHERE crf.platelets_value IS NULL OR crf.platelets_units IS NULL GROUP BY v.subject_identifier, crf.subject_visit_id, crf.report_datetime, crf.site_id, v.visit_code, v.visit_code_sequence, v.schedule_name, crf.modified UNION SELECT v.subject_identifier, crf.id AS original_id, crf.subject_visit_id, crf.report_datetime, crf.site_id, v.visit_code, v.visit_code_sequence, v.schedule_name, crf.modified, 'effect_subject.bloodresultsfbc' AS label_lower, 'FBC: missing neutrophil value/units' AS label, COUNT(*) AS records FROM effect_subject_bloodresultsfbc AS crf LEFT JOIN effect_subject_subjectvisit AS v ON v.id = crf.subject_visit_id WHERE crf.neutrophil_value IS NULL OR crf.neutrophil_units IS NULL GROUP BY v.subject_identifier, crf.subject_visit_id, crf.report_datetime, crf.site_id, v.visit_code, v.visit_code_sequence, v.schedule_name, crf.modified UNION SELECT v.subject_identifier, crf.id AS original_id, crf.subject_visit_id, crf.report_datetime, crf.site_id, v.visit_code, v.visit_code_sequence, v.schedule_name, crf.modified, 'effect_subject.bloodresultsfbc' AS label_lower, 'FBC: missing neutrophil_diff value/units' AS label, COUNT(*) AS records FROM effect_subject_bloodresultsfbc AS crf LEFT JOIN effect_subject_subjectvisit AS v ON v.id = crf.subject_visit_id WHERE crf.neutrophil_diff_value IS NULL OR crf.neutrophil_diff_units IS NULL GROUP BY v.subject_identifier, crf.subject_visit_id, crf.report_datetime, crf.site_id, v.visit_code, v.visit_code_sequence, v.schedule_name, crf.modified UNION SELECT v.subject_identifier, crf.id AS original_id, crf.subject_visit_id, crf.report_datetime, crf.site_id, v.visit_code, v.visit_code_sequence, v.schedule_name, crf.modified, 'effect_subject.bloodresultsfbc' AS label_lower, 'FBC: missing lymphocyte value/units' AS label, COUNT(*) AS records FROM effect_subject_bloodresultsfbc AS crf LEFT JOIN effect_subject_subjectvisit AS v ON v.id = crf.subject_visit_id WHERE crf.lymphocyte_value IS NULL OR crf.lymphocyte_units IS NULL GROUP BY v.subject_identifier, crf.subject_visit_id, crf.report_datetime, crf.site_id, v.visit_code, v.visit_code_sequence, v.schedule_name, crf.modified UNION SELECT v.subject_identifier, crf.id AS original_id, crf.subject_visit_id, crf.report_datetime, crf.site_id, v.visit_code, v.visit_code_sequence, v.schedule_name, crf.modified, 'effect_subject.bloodresultsfbc' AS label_lower, 'FBC: missing lymphocyte_diff value/units' AS label, COUNT(*) AS records FROM effect_subject_bloodresultsfbc AS crf LEFT JOIN effect_subject_subjectvisit AS v ON v.id = crf.subject_visit_id WHERE crf.lymphocyte_diff_value IS NULL OR crf.lymphocyte_diff_units IS NULL GROUP BY v.subject_identifier, crf.subject_visit_id, crf.report_datetime, crf.site_id, v.visit_code, v.visit_code_sequence, v.schedule_name, crf.modified) as A ORDER BY subject_identifier, site_id", + "onstudy_missing_lab_values_view", + engine="django.db.backends.mysql", + ), + reverse_code=django_db_views.migration_functions.BackwardViewMigration( + "", "onstudy_missing_lab_values_view", engine="django.db.backends.mysql" + ), + atomic=False, + ), + django_db_views.operations.ViewRunPython( + code=django_db_views.migration_functions.ForwardViewMigration( + "select *, get_random_uuid() as id, now() as created, 'onstudy_missing_lab_values_view' as report_model from (SELECT req.subject_identifier, req.id AS original_id, req.subject_visit_id, req.report_datetime, req.site_id, v.visit_code, v.visit_code_sequence, v.schedule_name, req.modified, 'effect_subject.bloodresultschem' AS label_lower, 'CHEM requisitioned but not entered' AS label, COUNT(*) AS records FROM effect_subject_subjectrequisition AS req LEFT JOIN effect_subject_bloodresultschem AS crf ON req.id = crf.requisition_id LEFT JOIN effect_subject_subjectvisit AS v ON v.id = req.subject_visit_id LEFT JOIN edc_lab_panel AS panel ON req.panel_id = panel.id WHERE panel.name = 'chemistry' AND req.is_drawn = 'Yes' AND crf.id IS NULL GROUP BY req.id, req.subject_identifier, req.subject_visit_id, req.report_datetime, req.site_id, v.visit_code, v.visit_code_sequence, v.schedule_name, req.modified UNION SELECT req.subject_identifier, req.id AS original_id, req.subject_visit_id, req.report_datetime, req.site_id, v.visit_code, v.visit_code_sequence, v.schedule_name, req.modified, 'effect_subject.lpcsf' AS label_lower, 'CSFC requisitioned but not entered' AS label, COUNT(*) AS records FROM effect_subject_subjectrequisition AS req LEFT JOIN effect_subject_lpcsf AS crf ON req.id = crf.csf_requisition_id LEFT JOIN effect_subject_subjectvisit AS v ON v.id = req.subject_visit_id LEFT JOIN edc_lab_panel AS panel ON req.panel_id = panel.id WHERE panel.name = 'csf_culture' AND req.is_drawn = 'Yes' AND crf.id IS NULL GROUP BY req.id, req.subject_identifier, req.subject_visit_id, req.report_datetime, req.site_id, v.visit_code, v.visit_code_sequence, v.schedule_name, req.modified UNION SELECT req.subject_identifier, req.id AS original_id, req.subject_visit_id, req.report_datetime, req.site_id, v.visit_code, v.visit_code_sequence, v.schedule_name, req.modified, 'effect_subject.bloodresultsfbc' AS label_lower, 'FBC requisitioned but not entered' AS label, COUNT(*) AS records FROM effect_subject_subjectrequisition AS req LEFT JOIN effect_subject_bloodresultsfbc AS crf ON req.id = crf.requisition_id LEFT JOIN effect_subject_subjectvisit AS v ON v.id = req.subject_visit_id LEFT JOIN edc_lab_panel AS panel ON req.panel_id = panel.id WHERE panel.name = 'fbc' AND req.is_drawn = 'Yes' AND crf.id IS NULL GROUP BY req.id, req.subject_identifier, req.subject_visit_id, req.report_datetime, req.site_id, v.visit_code, v.visit_code_sequence, v.schedule_name, req.modified UNION SELECT req.subject_identifier, req.id AS original_id, req.subject_visit_id, req.report_datetime, req.site_id, v.visit_code, v.visit_code_sequence, v.schedule_name, req.modified, 'effect_subject.tbdiagnostics' AS label_lower, 'SPM requisitioned but not entered' AS label, COUNT(*) AS records FROM effect_subject_subjectrequisition AS req LEFT JOIN effect_subject_tbdiagnostics AS crf ON req.id = crf.sputum_requisition_id LEFT JOIN effect_subject_subjectvisit AS v ON v.id = req.subject_visit_id LEFT JOIN edc_lab_panel AS panel ON req.panel_id = panel.id WHERE panel.name = 'sputum' AND req.is_drawn = 'Yes' AND crf.id IS NULL GROUP BY req.id, req.subject_identifier, req.subject_visit_id, req.report_datetime, req.site_id, v.visit_code, v.visit_code_sequence, v.schedule_name, req.modified UNION SELECT v.subject_identifier, crf.id AS original_id, crf.subject_visit_id, crf.report_datetime, crf.site_id, v.visit_code, v.visit_code_sequence, v.schedule_name, crf.modified, 'effect_subject.bloodresultschem' AS label_lower, 'CHEM: missing alt value/units' AS label, COUNT(*) AS records FROM effect_subject_bloodresultschem AS crf LEFT JOIN effect_subject_subjectvisit AS v ON v.id = crf.subject_visit_id WHERE crf.alt_value IS NULL OR crf.alt_units IS NULL GROUP BY v.subject_identifier, crf.subject_visit_id, crf.report_datetime, crf.site_id, v.visit_code, v.visit_code_sequence, v.schedule_name, crf.modified UNION SELECT v.subject_identifier, crf.id AS original_id, crf.subject_visit_id, crf.report_datetime, crf.site_id, v.visit_code, v.visit_code_sequence, v.schedule_name, crf.modified, 'effect_subject.bloodresultschem' AS label_lower, 'CHEM: missing creatinine value/units' AS label, COUNT(*) AS records FROM effect_subject_bloodresultschem AS crf LEFT JOIN effect_subject_subjectvisit AS v ON v.id = crf.subject_visit_id WHERE crf.creatinine_value IS NULL OR crf.creatinine_units IS NULL GROUP BY v.subject_identifier, crf.subject_visit_id, crf.report_datetime, crf.site_id, v.visit_code, v.visit_code_sequence, v.schedule_name, crf.modified UNION SELECT v.subject_identifier, crf.id AS original_id, crf.subject_visit_id, crf.report_datetime, crf.site_id, v.visit_code, v.visit_code_sequence, v.schedule_name, crf.modified, 'effect_subject.bloodresultschem' AS label_lower, 'CHEM: missing albumin value/units' AS label, COUNT(*) AS records FROM effect_subject_bloodresultschem AS crf LEFT JOIN effect_subject_subjectvisit AS v ON v.id = crf.subject_visit_id WHERE crf.albumin_value IS NULL OR crf.albumin_units IS NULL GROUP BY v.subject_identifier, crf.subject_visit_id, crf.report_datetime, crf.site_id, v.visit_code, v.visit_code_sequence, v.schedule_name, crf.modified UNION SELECT v.subject_identifier, crf.id AS original_id, crf.subject_visit_id, crf.report_datetime, crf.site_id, v.visit_code, v.visit_code_sequence, v.schedule_name, crf.modified, 'effect_subject.bloodresultschem' AS label_lower, 'CHEM: missing alp value/units' AS label, COUNT(*) AS records FROM effect_subject_bloodresultschem AS crf LEFT JOIN effect_subject_subjectvisit AS v ON v.id = crf.subject_visit_id WHERE crf.alp_value IS NULL OR crf.alp_units IS NULL GROUP BY v.subject_identifier, crf.subject_visit_id, crf.report_datetime, crf.site_id, v.visit_code, v.visit_code_sequence, v.schedule_name, crf.modified UNION SELECT v.subject_identifier, crf.id AS original_id, crf.subject_visit_id, crf.report_datetime, crf.site_id, v.visit_code, v.visit_code_sequence, v.schedule_name, crf.modified, 'effect_subject.bloodresultschem' AS label_lower, 'CHEM: missing ast value/units' AS label, COUNT(*) AS records FROM effect_subject_bloodresultschem AS crf LEFT JOIN effect_subject_subjectvisit AS v ON v.id = crf.subject_visit_id WHERE crf.ast_value IS NULL OR crf.ast_units IS NULL GROUP BY v.subject_identifier, crf.subject_visit_id, crf.report_datetime, crf.site_id, v.visit_code, v.visit_code_sequence, v.schedule_name, crf.modified UNION SELECT v.subject_identifier, crf.id AS original_id, crf.subject_visit_id, crf.report_datetime, crf.site_id, v.visit_code, v.visit_code_sequence, v.schedule_name, crf.modified, 'effect_subject.bloodresultschem' AS label_lower, 'CHEM: missing crp value/units' AS label, COUNT(*) AS records FROM effect_subject_bloodresultschem AS crf LEFT JOIN effect_subject_subjectvisit AS v ON v.id = crf.subject_visit_id WHERE crf.crp_value IS NULL OR crf.crp_units IS NULL GROUP BY v.subject_identifier, crf.subject_visit_id, crf.report_datetime, crf.site_id, v.visit_code, v.visit_code_sequence, v.schedule_name, crf.modified UNION SELECT v.subject_identifier, crf.id AS original_id, crf.subject_visit_id, crf.report_datetime, crf.site_id, v.visit_code, v.visit_code_sequence, v.schedule_name, crf.modified, 'effect_subject.bloodresultschem' AS label_lower, 'CHEM: missing egfr value/units' AS label, COUNT(*) AS records FROM effect_subject_bloodresultschem AS crf LEFT JOIN effect_subject_subjectvisit AS v ON v.id = crf.subject_visit_id WHERE crf.egfr_value IS NULL OR crf.egfr_units IS NULL GROUP BY v.subject_identifier, crf.subject_visit_id, crf.report_datetime, crf.site_id, v.visit_code, v.visit_code_sequence, v.schedule_name, crf.modified UNION SELECT v.subject_identifier, crf.id AS original_id, crf.subject_visit_id, crf.report_datetime, crf.site_id, v.visit_code, v.visit_code_sequence, v.schedule_name, crf.modified, 'effect_subject.bloodresultschem' AS label_lower, 'CHEM: missing magnesium value/units' AS label, COUNT(*) AS records FROM effect_subject_bloodresultschem AS crf LEFT JOIN effect_subject_subjectvisit AS v ON v.id = crf.subject_visit_id WHERE crf.magnesium_value IS NULL OR crf.magnesium_units IS NULL GROUP BY v.subject_identifier, crf.subject_visit_id, crf.report_datetime, crf.site_id, v.visit_code, v.visit_code_sequence, v.schedule_name, crf.modified UNION SELECT v.subject_identifier, crf.id AS original_id, crf.subject_visit_id, crf.report_datetime, crf.site_id, v.visit_code, v.visit_code_sequence, v.schedule_name, crf.modified, 'effect_subject.bloodresultschem' AS label_lower, 'CHEM: missing potassium value/units' AS label, COUNT(*) AS records FROM effect_subject_bloodresultschem AS crf LEFT JOIN effect_subject_subjectvisit AS v ON v.id = crf.subject_visit_id WHERE crf.potassium_value IS NULL OR crf.potassium_units IS NULL GROUP BY v.subject_identifier, crf.subject_visit_id, crf.report_datetime, crf.site_id, v.visit_code, v.visit_code_sequence, v.schedule_name, crf.modified UNION SELECT v.subject_identifier, crf.id AS original_id, crf.subject_visit_id, crf.report_datetime, crf.site_id, v.visit_code, v.visit_code_sequence, v.schedule_name, crf.modified, 'effect_subject.bloodresultschem' AS label_lower, 'CHEM: missing ggt value/units' AS label, COUNT(*) AS records FROM effect_subject_bloodresultschem AS crf LEFT JOIN effect_subject_subjectvisit AS v ON v.id = crf.subject_visit_id WHERE crf.ggt_value IS NULL OR crf.ggt_units IS NULL GROUP BY v.subject_identifier, crf.subject_visit_id, crf.report_datetime, crf.site_id, v.visit_code, v.visit_code_sequence, v.schedule_name, crf.modified UNION SELECT v.subject_identifier, crf.id AS original_id, crf.subject_visit_id, crf.report_datetime, crf.site_id, v.visit_code, v.visit_code_sequence, v.schedule_name, crf.modified, 'effect_subject.bloodresultschem' AS label_lower, 'CHEM: missing urea value/units' AS label, COUNT(*) AS records FROM effect_subject_bloodresultschem AS crf LEFT JOIN effect_subject_subjectvisit AS v ON v.id = crf.subject_visit_id WHERE crf.urea_value IS NULL OR crf.urea_units IS NULL GROUP BY v.subject_identifier, crf.subject_visit_id, crf.report_datetime, crf.site_id, v.visit_code, v.visit_code_sequence, v.schedule_name, crf.modified UNION SELECT v.subject_identifier, crf.id AS original_id, crf.subject_visit_id, crf.report_datetime, crf.site_id, v.visit_code, v.visit_code_sequence, v.schedule_name, crf.modified, 'effect_subject.bloodresultschem' AS label_lower, 'CHEM: missing tbil value/units' AS label, COUNT(*) AS records FROM effect_subject_bloodresultschem AS crf LEFT JOIN effect_subject_subjectvisit AS v ON v.id = crf.subject_visit_id WHERE crf.tbil_value IS NULL OR crf.tbil_units IS NULL GROUP BY v.subject_identifier, crf.subject_visit_id, crf.report_datetime, crf.site_id, v.visit_code, v.visit_code_sequence, v.schedule_name, crf.modified UNION SELECT v.subject_identifier, crf.id AS original_id, crf.subject_visit_id, crf.report_datetime, crf.site_id, v.visit_code, v.visit_code_sequence, v.schedule_name, crf.modified, 'effect_subject.bloodresultsfbc' AS label_lower, 'FBC: missing haemoglobin value/units' AS label, COUNT(*) AS records FROM effect_subject_bloodresultsfbc AS crf LEFT JOIN effect_subject_subjectvisit AS v ON v.id = crf.subject_visit_id WHERE crf.haemoglobin_value IS NULL OR crf.haemoglobin_units IS NULL GROUP BY v.subject_identifier, crf.subject_visit_id, crf.report_datetime, crf.site_id, v.visit_code, v.visit_code_sequence, v.schedule_name, crf.modified UNION SELECT v.subject_identifier, crf.id AS original_id, crf.subject_visit_id, crf.report_datetime, crf.site_id, v.visit_code, v.visit_code_sequence, v.schedule_name, crf.modified, 'effect_subject.bloodresultsfbc' AS label_lower, 'FBC: missing wbc value/units' AS label, COUNT(*) AS records FROM effect_subject_bloodresultsfbc AS crf LEFT JOIN effect_subject_subjectvisit AS v ON v.id = crf.subject_visit_id WHERE crf.wbc_value IS NULL OR crf.wbc_units IS NULL GROUP BY v.subject_identifier, crf.subject_visit_id, crf.report_datetime, crf.site_id, v.visit_code, v.visit_code_sequence, v.schedule_name, crf.modified UNION SELECT v.subject_identifier, crf.id AS original_id, crf.subject_visit_id, crf.report_datetime, crf.site_id, v.visit_code, v.visit_code_sequence, v.schedule_name, crf.modified, 'effect_subject.bloodresultsfbc' AS label_lower, 'FBC: missing platelets value/units' AS label, COUNT(*) AS records FROM effect_subject_bloodresultsfbc AS crf LEFT JOIN effect_subject_subjectvisit AS v ON v.id = crf.subject_visit_id WHERE crf.platelets_value IS NULL OR crf.platelets_units IS NULL GROUP BY v.subject_identifier, crf.subject_visit_id, crf.report_datetime, crf.site_id, v.visit_code, v.visit_code_sequence, v.schedule_name, crf.modified UNION SELECT v.subject_identifier, crf.id AS original_id, crf.subject_visit_id, crf.report_datetime, crf.site_id, v.visit_code, v.visit_code_sequence, v.schedule_name, crf.modified, 'effect_subject.bloodresultsfbc' AS label_lower, 'FBC: missing neutrophil value/units' AS label, COUNT(*) AS records FROM effect_subject_bloodresultsfbc AS crf LEFT JOIN effect_subject_subjectvisit AS v ON v.id = crf.subject_visit_id WHERE crf.neutrophil_value IS NULL OR crf.neutrophil_units IS NULL GROUP BY v.subject_identifier, crf.subject_visit_id, crf.report_datetime, crf.site_id, v.visit_code, v.visit_code_sequence, v.schedule_name, crf.modified UNION SELECT v.subject_identifier, crf.id AS original_id, crf.subject_visit_id, crf.report_datetime, crf.site_id, v.visit_code, v.visit_code_sequence, v.schedule_name, crf.modified, 'effect_subject.bloodresultsfbc' AS label_lower, 'FBC: missing neutrophil_diff value/units' AS label, COUNT(*) AS records FROM effect_subject_bloodresultsfbc AS crf LEFT JOIN effect_subject_subjectvisit AS v ON v.id = crf.subject_visit_id WHERE crf.neutrophil_diff_value IS NULL OR crf.neutrophil_diff_units IS NULL GROUP BY v.subject_identifier, crf.subject_visit_id, crf.report_datetime, crf.site_id, v.visit_code, v.visit_code_sequence, v.schedule_name, crf.modified UNION SELECT v.subject_identifier, crf.id AS original_id, crf.subject_visit_id, crf.report_datetime, crf.site_id, v.visit_code, v.visit_code_sequence, v.schedule_name, crf.modified, 'effect_subject.bloodresultsfbc' AS label_lower, 'FBC: missing lymphocyte value/units' AS label, COUNT(*) AS records FROM effect_subject_bloodresultsfbc AS crf LEFT JOIN effect_subject_subjectvisit AS v ON v.id = crf.subject_visit_id WHERE crf.lymphocyte_value IS NULL OR crf.lymphocyte_units IS NULL GROUP BY v.subject_identifier, crf.subject_visit_id, crf.report_datetime, crf.site_id, v.visit_code, v.visit_code_sequence, v.schedule_name, crf.modified UNION SELECT v.subject_identifier, crf.id AS original_id, crf.subject_visit_id, crf.report_datetime, crf.site_id, v.visit_code, v.visit_code_sequence, v.schedule_name, crf.modified, 'effect_subject.bloodresultsfbc' AS label_lower, 'FBC: missing lymphocyte_diff value/units' AS label, COUNT(*) AS records FROM effect_subject_bloodresultsfbc AS crf LEFT JOIN effect_subject_subjectvisit AS v ON v.id = crf.subject_visit_id WHERE crf.lymphocyte_diff_value IS NULL OR crf.lymphocyte_diff_units IS NULL GROUP BY v.subject_identifier, crf.subject_visit_id, crf.report_datetime, crf.site_id, v.visit_code, v.visit_code_sequence, v.schedule_name, crf.modified) as A ORDER BY subject_identifier, site_id", + "onstudy_missing_lab_values_view", + engine="django.db.backends.postgresql", + ), + reverse_code=django_db_views.migration_functions.BackwardViewMigration( + "", "onstudy_missing_lab_values_view", engine="django.db.backends.postgresql" + ), + atomic=False, + ), + django_db_views.operations.ViewRunPython( + code=django_db_views.migration_functions.ForwardViewMigration( + "select *, uuid() as id, datetime() as created, 'onstudy_missing_lab_values_view' as report_model from (SELECT req.subject_identifier, req.id AS original_id, req.subject_visit_id, req.report_datetime, req.site_id, v.visit_code, v.visit_code_sequence, v.schedule_name, req.modified, 'effect_subject.bloodresultschem' AS label_lower, 'CHEM requisitioned but not entered' AS label, COUNT(*) AS records FROM effect_subject_subjectrequisition AS req LEFT JOIN effect_subject_bloodresultschem AS crf ON req.id = crf.requisition_id LEFT JOIN effect_subject_subjectvisit AS v ON v.id = req.subject_visit_id LEFT JOIN edc_lab_panel AS panel ON req.panel_id = panel.id WHERE panel.name = 'chemistry' AND req.is_drawn = 'Yes' AND crf.id IS NULL GROUP BY req.id, req.subject_identifier, req.subject_visit_id, req.report_datetime, req.site_id, v.visit_code, v.visit_code_sequence, v.schedule_name, req.modified UNION SELECT req.subject_identifier, req.id AS original_id, req.subject_visit_id, req.report_datetime, req.site_id, v.visit_code, v.visit_code_sequence, v.schedule_name, req.modified, 'effect_subject.lpcsf' AS label_lower, 'CSFC requisitioned but not entered' AS label, COUNT(*) AS records FROM effect_subject_subjectrequisition AS req LEFT JOIN effect_subject_lpcsf AS crf ON req.id = crf.csf_requisition_id LEFT JOIN effect_subject_subjectvisit AS v ON v.id = req.subject_visit_id LEFT JOIN edc_lab_panel AS panel ON req.panel_id = panel.id WHERE panel.name = 'csf_culture' AND req.is_drawn = 'Yes' AND crf.id IS NULL GROUP BY req.id, req.subject_identifier, req.subject_visit_id, req.report_datetime, req.site_id, v.visit_code, v.visit_code_sequence, v.schedule_name, req.modified UNION SELECT req.subject_identifier, req.id AS original_id, req.subject_visit_id, req.report_datetime, req.site_id, v.visit_code, v.visit_code_sequence, v.schedule_name, req.modified, 'effect_subject.bloodresultsfbc' AS label_lower, 'FBC requisitioned but not entered' AS label, COUNT(*) AS records FROM effect_subject_subjectrequisition AS req LEFT JOIN effect_subject_bloodresultsfbc AS crf ON req.id = crf.requisition_id LEFT JOIN effect_subject_subjectvisit AS v ON v.id = req.subject_visit_id LEFT JOIN edc_lab_panel AS panel ON req.panel_id = panel.id WHERE panel.name = 'fbc' AND req.is_drawn = 'Yes' AND crf.id IS NULL GROUP BY req.id, req.subject_identifier, req.subject_visit_id, req.report_datetime, req.site_id, v.visit_code, v.visit_code_sequence, v.schedule_name, req.modified UNION SELECT req.subject_identifier, req.id AS original_id, req.subject_visit_id, req.report_datetime, req.site_id, v.visit_code, v.visit_code_sequence, v.schedule_name, req.modified, 'effect_subject.tbdiagnostics' AS label_lower, 'SPM requisitioned but not entered' AS label, COUNT(*) AS records FROM effect_subject_subjectrequisition AS req LEFT JOIN effect_subject_tbdiagnostics AS crf ON req.id = crf.sputum_requisition_id LEFT JOIN effect_subject_subjectvisit AS v ON v.id = req.subject_visit_id LEFT JOIN edc_lab_panel AS panel ON req.panel_id = panel.id WHERE panel.name = 'sputum' AND req.is_drawn = 'Yes' AND crf.id IS NULL GROUP BY req.id, req.subject_identifier, req.subject_visit_id, req.report_datetime, req.site_id, v.visit_code, v.visit_code_sequence, v.schedule_name, req.modified UNION SELECT v.subject_identifier, crf.id AS original_id, crf.subject_visit_id, crf.report_datetime, crf.site_id, v.visit_code, v.visit_code_sequence, v.schedule_name, crf.modified, 'effect_subject.bloodresultschem' AS label_lower, 'CHEM: missing alt value/units' AS label, COUNT(*) AS records FROM effect_subject_bloodresultschem AS crf LEFT JOIN effect_subject_subjectvisit AS v ON v.id = crf.subject_visit_id WHERE crf.alt_value IS NULL OR crf.alt_units IS NULL GROUP BY v.subject_identifier, crf.subject_visit_id, crf.report_datetime, crf.site_id, v.visit_code, v.visit_code_sequence, v.schedule_name, crf.modified UNION SELECT v.subject_identifier, crf.id AS original_id, crf.subject_visit_id, crf.report_datetime, crf.site_id, v.visit_code, v.visit_code_sequence, v.schedule_name, crf.modified, 'effect_subject.bloodresultschem' AS label_lower, 'CHEM: missing creatinine value/units' AS label, COUNT(*) AS records FROM effect_subject_bloodresultschem AS crf LEFT JOIN effect_subject_subjectvisit AS v ON v.id = crf.subject_visit_id WHERE crf.creatinine_value IS NULL OR crf.creatinine_units IS NULL GROUP BY v.subject_identifier, crf.subject_visit_id, crf.report_datetime, crf.site_id, v.visit_code, v.visit_code_sequence, v.schedule_name, crf.modified UNION SELECT v.subject_identifier, crf.id AS original_id, crf.subject_visit_id, crf.report_datetime, crf.site_id, v.visit_code, v.visit_code_sequence, v.schedule_name, crf.modified, 'effect_subject.bloodresultschem' AS label_lower, 'CHEM: missing albumin value/units' AS label, COUNT(*) AS records FROM effect_subject_bloodresultschem AS crf LEFT JOIN effect_subject_subjectvisit AS v ON v.id = crf.subject_visit_id WHERE crf.albumin_value IS NULL OR crf.albumin_units IS NULL GROUP BY v.subject_identifier, crf.subject_visit_id, crf.report_datetime, crf.site_id, v.visit_code, v.visit_code_sequence, v.schedule_name, crf.modified UNION SELECT v.subject_identifier, crf.id AS original_id, crf.subject_visit_id, crf.report_datetime, crf.site_id, v.visit_code, v.visit_code_sequence, v.schedule_name, crf.modified, 'effect_subject.bloodresultschem' AS label_lower, 'CHEM: missing alp value/units' AS label, COUNT(*) AS records FROM effect_subject_bloodresultschem AS crf LEFT JOIN effect_subject_subjectvisit AS v ON v.id = crf.subject_visit_id WHERE crf.alp_value IS NULL OR crf.alp_units IS NULL GROUP BY v.subject_identifier, crf.subject_visit_id, crf.report_datetime, crf.site_id, v.visit_code, v.visit_code_sequence, v.schedule_name, crf.modified UNION SELECT v.subject_identifier, crf.id AS original_id, crf.subject_visit_id, crf.report_datetime, crf.site_id, v.visit_code, v.visit_code_sequence, v.schedule_name, crf.modified, 'effect_subject.bloodresultschem' AS label_lower, 'CHEM: missing ast value/units' AS label, COUNT(*) AS records FROM effect_subject_bloodresultschem AS crf LEFT JOIN effect_subject_subjectvisit AS v ON v.id = crf.subject_visit_id WHERE crf.ast_value IS NULL OR crf.ast_units IS NULL GROUP BY v.subject_identifier, crf.subject_visit_id, crf.report_datetime, crf.site_id, v.visit_code, v.visit_code_sequence, v.schedule_name, crf.modified UNION SELECT v.subject_identifier, crf.id AS original_id, crf.subject_visit_id, crf.report_datetime, crf.site_id, v.visit_code, v.visit_code_sequence, v.schedule_name, crf.modified, 'effect_subject.bloodresultschem' AS label_lower, 'CHEM: missing crp value/units' AS label, COUNT(*) AS records FROM effect_subject_bloodresultschem AS crf LEFT JOIN effect_subject_subjectvisit AS v ON v.id = crf.subject_visit_id WHERE crf.crp_value IS NULL OR crf.crp_units IS NULL GROUP BY v.subject_identifier, crf.subject_visit_id, crf.report_datetime, crf.site_id, v.visit_code, v.visit_code_sequence, v.schedule_name, crf.modified UNION SELECT v.subject_identifier, crf.id AS original_id, crf.subject_visit_id, crf.report_datetime, crf.site_id, v.visit_code, v.visit_code_sequence, v.schedule_name, crf.modified, 'effect_subject.bloodresultschem' AS label_lower, 'CHEM: missing egfr value/units' AS label, COUNT(*) AS records FROM effect_subject_bloodresultschem AS crf LEFT JOIN effect_subject_subjectvisit AS v ON v.id = crf.subject_visit_id WHERE crf.egfr_value IS NULL OR crf.egfr_units IS NULL GROUP BY v.subject_identifier, crf.subject_visit_id, crf.report_datetime, crf.site_id, v.visit_code, v.visit_code_sequence, v.schedule_name, crf.modified UNION SELECT v.subject_identifier, crf.id AS original_id, crf.subject_visit_id, crf.report_datetime, crf.site_id, v.visit_code, v.visit_code_sequence, v.schedule_name, crf.modified, 'effect_subject.bloodresultschem' AS label_lower, 'CHEM: missing magnesium value/units' AS label, COUNT(*) AS records FROM effect_subject_bloodresultschem AS crf LEFT JOIN effect_subject_subjectvisit AS v ON v.id = crf.subject_visit_id WHERE crf.magnesium_value IS NULL OR crf.magnesium_units IS NULL GROUP BY v.subject_identifier, crf.subject_visit_id, crf.report_datetime, crf.site_id, v.visit_code, v.visit_code_sequence, v.schedule_name, crf.modified UNION SELECT v.subject_identifier, crf.id AS original_id, crf.subject_visit_id, crf.report_datetime, crf.site_id, v.visit_code, v.visit_code_sequence, v.schedule_name, crf.modified, 'effect_subject.bloodresultschem' AS label_lower, 'CHEM: missing potassium value/units' AS label, COUNT(*) AS records FROM effect_subject_bloodresultschem AS crf LEFT JOIN effect_subject_subjectvisit AS v ON v.id = crf.subject_visit_id WHERE crf.potassium_value IS NULL OR crf.potassium_units IS NULL GROUP BY v.subject_identifier, crf.subject_visit_id, crf.report_datetime, crf.site_id, v.visit_code, v.visit_code_sequence, v.schedule_name, crf.modified UNION SELECT v.subject_identifier, crf.id AS original_id, crf.subject_visit_id, crf.report_datetime, crf.site_id, v.visit_code, v.visit_code_sequence, v.schedule_name, crf.modified, 'effect_subject.bloodresultschem' AS label_lower, 'CHEM: missing ggt value/units' AS label, COUNT(*) AS records FROM effect_subject_bloodresultschem AS crf LEFT JOIN effect_subject_subjectvisit AS v ON v.id = crf.subject_visit_id WHERE crf.ggt_value IS NULL OR crf.ggt_units IS NULL GROUP BY v.subject_identifier, crf.subject_visit_id, crf.report_datetime, crf.site_id, v.visit_code, v.visit_code_sequence, v.schedule_name, crf.modified UNION SELECT v.subject_identifier, crf.id AS original_id, crf.subject_visit_id, crf.report_datetime, crf.site_id, v.visit_code, v.visit_code_sequence, v.schedule_name, crf.modified, 'effect_subject.bloodresultschem' AS label_lower, 'CHEM: missing urea value/units' AS label, COUNT(*) AS records FROM effect_subject_bloodresultschem AS crf LEFT JOIN effect_subject_subjectvisit AS v ON v.id = crf.subject_visit_id WHERE crf.urea_value IS NULL OR crf.urea_units IS NULL GROUP BY v.subject_identifier, crf.subject_visit_id, crf.report_datetime, crf.site_id, v.visit_code, v.visit_code_sequence, v.schedule_name, crf.modified UNION SELECT v.subject_identifier, crf.id AS original_id, crf.subject_visit_id, crf.report_datetime, crf.site_id, v.visit_code, v.visit_code_sequence, v.schedule_name, crf.modified, 'effect_subject.bloodresultschem' AS label_lower, 'CHEM: missing tbil value/units' AS label, COUNT(*) AS records FROM effect_subject_bloodresultschem AS crf LEFT JOIN effect_subject_subjectvisit AS v ON v.id = crf.subject_visit_id WHERE crf.tbil_value IS NULL OR crf.tbil_units IS NULL GROUP BY v.subject_identifier, crf.subject_visit_id, crf.report_datetime, crf.site_id, v.visit_code, v.visit_code_sequence, v.schedule_name, crf.modified UNION SELECT v.subject_identifier, crf.id AS original_id, crf.subject_visit_id, crf.report_datetime, crf.site_id, v.visit_code, v.visit_code_sequence, v.schedule_name, crf.modified, 'effect_subject.bloodresultsfbc' AS label_lower, 'FBC: missing haemoglobin value/units' AS label, COUNT(*) AS records FROM effect_subject_bloodresultsfbc AS crf LEFT JOIN effect_subject_subjectvisit AS v ON v.id = crf.subject_visit_id WHERE crf.haemoglobin_value IS NULL OR crf.haemoglobin_units IS NULL GROUP BY v.subject_identifier, crf.subject_visit_id, crf.report_datetime, crf.site_id, v.visit_code, v.visit_code_sequence, v.schedule_name, crf.modified UNION SELECT v.subject_identifier, crf.id AS original_id, crf.subject_visit_id, crf.report_datetime, crf.site_id, v.visit_code, v.visit_code_sequence, v.schedule_name, crf.modified, 'effect_subject.bloodresultsfbc' AS label_lower, 'FBC: missing wbc value/units' AS label, COUNT(*) AS records FROM effect_subject_bloodresultsfbc AS crf LEFT JOIN effect_subject_subjectvisit AS v ON v.id = crf.subject_visit_id WHERE crf.wbc_value IS NULL OR crf.wbc_units IS NULL GROUP BY v.subject_identifier, crf.subject_visit_id, crf.report_datetime, crf.site_id, v.visit_code, v.visit_code_sequence, v.schedule_name, crf.modified UNION SELECT v.subject_identifier, crf.id AS original_id, crf.subject_visit_id, crf.report_datetime, crf.site_id, v.visit_code, v.visit_code_sequence, v.schedule_name, crf.modified, 'effect_subject.bloodresultsfbc' AS label_lower, 'FBC: missing platelets value/units' AS label, COUNT(*) AS records FROM effect_subject_bloodresultsfbc AS crf LEFT JOIN effect_subject_subjectvisit AS v ON v.id = crf.subject_visit_id WHERE crf.platelets_value IS NULL OR crf.platelets_units IS NULL GROUP BY v.subject_identifier, crf.subject_visit_id, crf.report_datetime, crf.site_id, v.visit_code, v.visit_code_sequence, v.schedule_name, crf.modified UNION SELECT v.subject_identifier, crf.id AS original_id, crf.subject_visit_id, crf.report_datetime, crf.site_id, v.visit_code, v.visit_code_sequence, v.schedule_name, crf.modified, 'effect_subject.bloodresultsfbc' AS label_lower, 'FBC: missing neutrophil value/units' AS label, COUNT(*) AS records FROM effect_subject_bloodresultsfbc AS crf LEFT JOIN effect_subject_subjectvisit AS v ON v.id = crf.subject_visit_id WHERE crf.neutrophil_value IS NULL OR crf.neutrophil_units IS NULL GROUP BY v.subject_identifier, crf.subject_visit_id, crf.report_datetime, crf.site_id, v.visit_code, v.visit_code_sequence, v.schedule_name, crf.modified UNION SELECT v.subject_identifier, crf.id AS original_id, crf.subject_visit_id, crf.report_datetime, crf.site_id, v.visit_code, v.visit_code_sequence, v.schedule_name, crf.modified, 'effect_subject.bloodresultsfbc' AS label_lower, 'FBC: missing neutrophil_diff value/units' AS label, COUNT(*) AS records FROM effect_subject_bloodresultsfbc AS crf LEFT JOIN effect_subject_subjectvisit AS v ON v.id = crf.subject_visit_id WHERE crf.neutrophil_diff_value IS NULL OR crf.neutrophil_diff_units IS NULL GROUP BY v.subject_identifier, crf.subject_visit_id, crf.report_datetime, crf.site_id, v.visit_code, v.visit_code_sequence, v.schedule_name, crf.modified UNION SELECT v.subject_identifier, crf.id AS original_id, crf.subject_visit_id, crf.report_datetime, crf.site_id, v.visit_code, v.visit_code_sequence, v.schedule_name, crf.modified, 'effect_subject.bloodresultsfbc' AS label_lower, 'FBC: missing lymphocyte value/units' AS label, COUNT(*) AS records FROM effect_subject_bloodresultsfbc AS crf LEFT JOIN effect_subject_subjectvisit AS v ON v.id = crf.subject_visit_id WHERE crf.lymphocyte_value IS NULL OR crf.lymphocyte_units IS NULL GROUP BY v.subject_identifier, crf.subject_visit_id, crf.report_datetime, crf.site_id, v.visit_code, v.visit_code_sequence, v.schedule_name, crf.modified UNION SELECT v.subject_identifier, crf.id AS original_id, crf.subject_visit_id, crf.report_datetime, crf.site_id, v.visit_code, v.visit_code_sequence, v.schedule_name, crf.modified, 'effect_subject.bloodresultsfbc' AS label_lower, 'FBC: missing lymphocyte_diff value/units' AS label, COUNT(*) AS records FROM effect_subject_bloodresultsfbc AS crf LEFT JOIN effect_subject_subjectvisit AS v ON v.id = crf.subject_visit_id WHERE crf.lymphocyte_diff_value IS NULL OR crf.lymphocyte_diff_units IS NULL GROUP BY v.subject_identifier, crf.subject_visit_id, crf.report_datetime, crf.site_id, v.visit_code, v.visit_code_sequence, v.schedule_name, crf.modified) as A ORDER BY subject_identifier, site_id", + "onstudy_missing_lab_values_view", + engine="django.db.backends.sqlite3", + ), + reverse_code=django_db_views.migration_functions.BackwardViewMigration( + "", "onstudy_missing_lab_values_view", engine="django.db.backends.sqlite3" + ), + atomic=False, + ), + ] diff --git a/effect_reports/models/dbviews/on_study_missing_lab_values/qa_cases.py b/effect_reports/models/dbviews/on_study_missing_lab_values/qa_cases.py index 906aadc..ab4ba38 100644 --- a/effect_reports/models/dbviews/on_study_missing_lab_values/qa_cases.py +++ b/effect_reports/models/dbviews/on_study_missing_lab_values/qa_cases.py @@ -1,36 +1,29 @@ -from edc_lab_panel.constants import FBC, LFT, LIPIDS, RFT -from edc_lab_panel.panels import fbc_panel, lft_panel, lipids_panel, rft_panel +from edc_lab_panel.panels import sputum_panel from edc_qareports.sql_generator import CrfCase, RequisitionCase -qa_cases = [ - RequisitionCase( - label="FBC requisitioned but not entered", - dbtable="meta_subject_bloodresultsfbc", - label_lower="meta_subject.bloodresultsfbc", - panel=FBC, - ), - RequisitionCase( - label="RFT requisitioned but not entered", - dbtable="meta_subject_bloodresultsrft", - label_lower="meta_subject.bloodresultsrft", - panel=RFT, - ), - RequisitionCase( - label="LFT requisitioned but not entered", - dbtable="meta_subject_bloodresultslft", - label_lower="meta_subject.bloodresultslft", - panel=LFT, - ), - RequisitionCase( - label="LIPIDS requisitioned but not entered", - dbtable="meta_subject_bloodresultslipids", - label_lower="meta_subject.bloodresultslipids", - panel=LIPIDS, - ), -] +from effect_labs.panels import chemistry_panel, csf_culture_panel, fbc_panel -panels = {FBC: fbc_panel, RFT: rft_panel, LFT: lft_panel, LIPIDS: lipids_panel} -for abbrev, panel in panels.items(): +qa_cases = [] +for label_lower, panel, id_field in [ + ("effect_subject.bloodresultschem", chemistry_panel, None), + ("effect_subject.lpcsf", csf_culture_panel, "csf_requisition_id"), + ("effect_subject.bloodresultsfbc", fbc_panel, None), + ("effect_subject.tbdiagnostics", sputum_panel, "sputum_requisition_id"), +]: + qa_cases.append( + RequisitionCase( + label=f"{panel.abbreviation.upper()} requisitioned but not entered", + dbtable=label_lower.replace(".", "_"), + label_lower=label_lower, + panel=panel.name, + requisition_id_field=id_field, + ) + ) + +for label_lower, panel in [ + ("effect_subject.bloodresultschem", chemistry_panel), + ("effect_subject.bloodresultsfbc", fbc_panel), +]: for utest_id in panel.utest_ids: try: utest_id, _ = utest_id @@ -38,9 +31,9 @@ pass qa_cases.append( CrfCase( - label=f"{abbrev.upper()}: missing {utest_id} value/units", - dbtable=f"meta_subject_bloodresults{abbrev.lower()}", - label_lower=f"meta_subject.bloodresults{abbrev.lower()}", + label=f"{panel.abbreviation.upper()}: missing {utest_id} value/units", + dbtable=label_lower.replace(".", "_"), + label_lower=label_lower, where=f"crf.{utest_id}_value is null or crf.{utest_id}_units is null", ) ) diff --git a/effect_reports/models/dbviews/on_study_missing_lab_values/unmanged_model.py b/effect_reports/models/dbviews/on_study_missing_lab_values/unmanged_model.py index 1dbaa52..1007207 100644 --- a/effect_reports/models/dbviews/on_study_missing_lab_values/unmanged_model.py +++ b/effect_reports/models/dbviews/on_study_missing_lab_values/unmanged_model.py @@ -15,6 +15,6 @@ class OnStudyMissingLabValues(OnStudyMissingValuesModelMixin, QaReportModelMixin class Meta: managed = False db_table = "onstudy_missing_lab_values_view" - verbose_name = "Missing Lab values for on-study patient" - verbose_name_plural = "Missing Lab values for on-study patients" + verbose_name = "Missing lab values for on-study patient" + verbose_name_plural = "Missing lab values for on-study patients" default_permissions = qa_reports_permissions From fc5890edbaf298e2364c9d1aaeeedd29c4980d3d Mon Sep 17 00:00:00 2001 From: Jonathan Willitts Date: Thu, 12 Sep 2024 11:41:20 +0100 Subject: [PATCH 4/6] Update CHANGES --- CHANGES | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGES b/CHANGES index d314020..3d64eb0 100644 --- a/CHANGES +++ b/CHANGES @@ -1,6 +1,10 @@ Changes +++++++ +unreleased +------ +- add QA reports for Missing Lab Values + 0.1.55 ------ - add Qa Reports app From c7b5a4102f067874dfe4056930ff3085c3e7f961 Mon Sep 17 00:00:00 2001 From: Jonathan Willitts Date: Thu, 12 Sep 2024 11:42:37 +0100 Subject: [PATCH 5/6] Make verbose name case consistent (Title) --- ...116_alter_bloodculture_options_and_more.py | 117 ++++++++++++++++++ effect_subject/models/blood_culture.py | 4 +- .../study_medication/study_medication.py | 4 +- .../study_medication_baseline.py | 4 +- .../study_medication_followup.py | 4 +- effect_subject/models/subject_requisition.py | 3 +- effect_subject/models/subject_visit.py | 3 +- 7 files changed, 129 insertions(+), 10 deletions(-) create mode 100644 effect_subject/migrations/0116_alter_bloodculture_options_and_more.py diff --git a/effect_subject/migrations/0116_alter_bloodculture_options_and_more.py b/effect_subject/migrations/0116_alter_bloodculture_options_and_more.py new file mode 100644 index 0000000..135380a --- /dev/null +++ b/effect_subject/migrations/0116_alter_bloodculture_options_and_more.py @@ -0,0 +1,117 @@ +# Generated by Django 5.1.1 on 2024-09-12 09:55 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ("effect_subject", "0115_alter_healtheconomicsevent_hospital_time_and_more"), + ] + + operations = [ + migrations.AlterModelOptions( + name="bloodculture", + options={ + "default_manager_name": "objects", + "default_permissions": ("add", "change", "delete", "view", "export", "import"), + "verbose_name": "Blood Culture", + "verbose_name_plural": "Blood Culture", + }, + ), + migrations.AlterModelOptions( + name="historicalbloodculture", + options={ + "get_latest_by": ("history_date", "history_id"), + "ordering": ("-history_date", "-history_id"), + "verbose_name": "historical Blood Culture", + "verbose_name_plural": "historical Blood Culture", + }, + ), + migrations.AlterModelOptions( + name="historicalstudymedication", + options={ + "get_latest_by": ("history_date", "history_id"), + "ordering": ("-history_date", "-history_id"), + "verbose_name": "historical Study Medication", + "verbose_name_plural": "historical Study Medication", + }, + ), + migrations.AlterModelOptions( + name="historicalstudymedicationbaseline", + options={ + "get_latest_by": ("history_date", "history_id"), + "ordering": ("-history_date", "-history_id"), + "verbose_name": "historical Study Medication (Baseline)", + "verbose_name_plural": "historical Study Medication (Baseline)", + }, + ), + migrations.AlterModelOptions( + name="historicalstudymedicationfollowup", + options={ + "get_latest_by": ("history_date", "history_id"), + "ordering": ("-history_date", "-history_id"), + "verbose_name": "historical Study Medication", + "verbose_name_plural": "historical Study Medication", + }, + ), + migrations.AlterModelOptions( + name="historicalsubjectrequisition", + options={ + "get_latest_by": ("history_date", "history_id"), + "ordering": ("-history_date", "-history_id"), + "verbose_name": "historical Subject Requisition", + "verbose_name_plural": "historical Subject Requisitions", + }, + ), + migrations.AlterModelOptions( + name="historicalsubjectvisit", + options={ + "get_latest_by": ("history_date", "history_id"), + "ordering": ("-history_date", "-history_id"), + "verbose_name": "historical Subject Visit", + "verbose_name_plural": "historical Subject Visits", + }, + ), + migrations.AlterModelOptions( + name="studymedication", + options={ + "default_manager_name": "objects", + "default_permissions": ("add", "change", "delete", "view", "export", "import"), + "verbose_name": "Study Medication", + "verbose_name_plural": "Study Medication", + }, + ), + migrations.AlterModelOptions( + name="studymedicationbaseline", + options={ + "verbose_name": "Study Medication (Baseline)", + "verbose_name_plural": "Study Medication (Baseline)", + }, + ), + migrations.AlterModelOptions( + name="studymedicationfollowup", + options={ + "verbose_name": "Study Medication", + "verbose_name_plural": "Study Medication", + }, + ), + migrations.AlterModelOptions( + name="subjectrequisition", + options={ + "default_manager_name": "objects", + "default_permissions": ("add", "change", "delete", "view", "export", "import"), + "verbose_name": "Subject Requisition", + "verbose_name_plural": "Subject Requisitions", + }, + ), + migrations.AlterModelOptions( + name="subjectvisit", + options={ + "default_manager_name": "objects", + "default_permissions": ("add", "change", "delete", "view", "export", "import"), + "verbose_name": "Subject Visit", + "verbose_name_plural": "Subject Visits", + }, + ), + ] diff --git a/effect_subject/models/blood_culture.py b/effect_subject/models/blood_culture.py index 3da012a..0432b4b 100644 --- a/effect_subject/models/blood_culture.py +++ b/effect_subject/models/blood_culture.py @@ -21,5 +21,5 @@ class BloodCulture(BloodCultureModelMixin, CrfModelMixin, edc_models.BaseUuidMod comment = models.TextField(verbose_name="Any additional comment", null=True, blank=True) class Meta(CrfModelMixin.Meta, edc_models.BaseUuidModel.Meta): - verbose_name = "Blood culture" - verbose_name_plural = "Blood culture" + verbose_name = "Blood Culture" + verbose_name_plural = "Blood Culture" diff --git a/effect_subject/models/study_medication/study_medication.py b/effect_subject/models/study_medication/study_medication.py index 26dbbf5..75c0723 100644 --- a/effect_subject/models/study_medication/study_medication.py +++ b/effect_subject/models/study_medication/study_medication.py @@ -184,5 +184,5 @@ class StudyMedication(CrfModelMixin, edc_models.BaseUuidModel): ) class Meta(CrfModelMixin.Meta, edc_models.BaseUuidModel.Meta): - verbose_name = "Study medication" - verbose_name_plural = "Study medication" + verbose_name = "Study Medication" + verbose_name_plural = "Study Medication" diff --git a/effect_subject/models/study_medication/study_medication_baseline.py b/effect_subject/models/study_medication/study_medication_baseline.py index 5bcc660..7c7ae2f 100644 --- a/effect_subject/models/study_medication/study_medication_baseline.py +++ b/effect_subject/models/study_medication/study_medication_baseline.py @@ -4,5 +4,5 @@ class StudyMedicationBaseline(StudyMedication): class Meta: proxy = True - verbose_name = "Study medication (Baseline)" - verbose_name_plural = "Study medication (Baseline)" + verbose_name = "Study Medication (Baseline)" + verbose_name_plural = "Study Medication (Baseline)" diff --git a/effect_subject/models/study_medication/study_medication_followup.py b/effect_subject/models/study_medication/study_medication_followup.py index df8c58b..7d8c703 100644 --- a/effect_subject/models/study_medication/study_medication_followup.py +++ b/effect_subject/models/study_medication/study_medication_followup.py @@ -4,5 +4,5 @@ class StudyMedicationFollowup(StudyMedication): class Meta: proxy = True - verbose_name = "Study medication" - verbose_name_plural = "Study medication" + verbose_name = "Study Medication" + verbose_name_plural = "Study Medication" diff --git a/effect_subject/models/subject_requisition.py b/effect_subject/models/subject_requisition.py index 6cc0f4d..aec3cb9 100644 --- a/effect_subject/models/subject_requisition.py +++ b/effect_subject/models/subject_requisition.py @@ -5,4 +5,5 @@ class SubjectRequisition(RequisitionModelMixin, BaseUuidModel): class Meta(RequisitionModelMixin.Meta, BaseUuidModel.Meta): - pass + verbose_name = "Subject Requisition" + verbose_name_plural = "Subject Requisitions" diff --git a/effect_subject/models/subject_visit.py b/effect_subject/models/subject_visit.py index 6286ad0..8f69653 100644 --- a/effect_subject/models/subject_visit.py +++ b/effect_subject/models/subject_visit.py @@ -105,4 +105,5 @@ class SubjectVisit( history = HistoricalRecords() class Meta(VisitModelMixin.Meta, BaseUuidModel.Meta): - pass + verbose_name = "Subject Visit" + verbose_name_plural = "Subject Visits" From b2c32b8b0790c0b6f61207cfec626b008bf6d246 Mon Sep 17 00:00:00 2001 From: Jonathan Willitts Date: Thu, 12 Sep 2024 12:01:19 +0100 Subject: [PATCH 6/6] Bump to `edc==0.6.12` --- CHANGES | 1 + setup.cfg | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGES b/CHANGES index 3d64eb0..2c109f1 100644 --- a/CHANGES +++ b/CHANGES @@ -4,6 +4,7 @@ Changes unreleased ------ - add QA reports for Missing Lab Values +- bump to edc 0.6.12 0.1.55 ------ diff --git a/setup.cfg b/setup.cfg index d846ec3..0a84286 100644 --- a/setup.cfg +++ b/setup.cfg @@ -26,7 +26,7 @@ zip_safe = False include_package_data = True packages = find: install_requires = - edc==0.5.99 + edc==0.6.12 edc-csf==0.3.6 edc-microbiology==0.3.10 beautifulsoup4