Skip to content

Commit

Permalink
change Screening Missing OGTT report note model to a custom note mode…
Browse files Browse the repository at this point in the history
…l, bump edc=0.6.4
  • Loading branch information
erikvw committed Aug 23, 2024
1 parent b05c8b1 commit 8a37a1f
Show file tree
Hide file tree
Showing 20 changed files with 877 additions and 18 deletions.
1 change: 1 addition & 0 deletions meta_dashboard/views/subject/dashboard/dashboard_view.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ class DashboardView(SubjectDashboardView):
history_button_label = _("Audit")

def get_context_data(self, **kwargs) -> dict[str, Any]:
"""Add message if subject reaches DM Endpoint."""
context = super().get_context_data(**kwargs)
try:
Endpoints.objects.get(subject_identifier=self.subject_identifier)
Expand Down
1 change: 1 addition & 0 deletions meta_reports/admin/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
from .endpoints_all_admin import EndpointsAllAdmin
from .unmanaged import (
GlucoseSummaryAdmin,
MissingOgttNoteModelAdmin,
MissingScreeningOgttAdmin,
PatientHistoryMissingBaselineCd4Admin,
UnattendedThreeInRow2Admin,
Expand Down
5 changes: 4 additions & 1 deletion meta_reports/admin/unmanaged/__init__.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
from .glucose_summary_admin import GlucoseSummaryAdmin
from .missing_screening_ogtt_admin import MissingScreeningOgttAdmin
from .missing_screening_ogtt_admin import (
MissingOgttNoteModelAdmin,
MissingScreeningOgttAdmin,
)
from .patient_history_missing_baseline_cd4_admin import (
PatientHistoryMissingBaselineCd4Admin,
)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
from .note_model_admin import MissingOgttNoteModelAdmin
from .unmanaged_model_admin import MissingScreeningOgttAdmin
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
from django.contrib import admin
from django_audit_fields import audit_fieldset_tuple
from edc_qareports.modeladmin_mixins import NoteModelAdminMixin

from ....admin_site import meta_reports_admin
from ....forms import MissingOgttNoteForm
from ....models import MissingOgttNote


@admin.register(MissingOgttNote, site=meta_reports_admin)
class MissingOgttNoteModelAdmin(
NoteModelAdminMixin,
admin.ModelAdmin,
):
"""A modeladmin class for the Note model."""

form = MissingOgttNoteForm
note_template_name = "edc_qareports/qa_report_note.html"

fieldsets = (
(
None,
{"fields": ("subject_identifier", "report_datetime", "result_status")},
),
(
"OGTT",
{
"fields": (
"fasting",
"ogtt_base_datetime",
"ogtt_datetime",
"ogtt_value",
"ogtt_units",
)
},
),
(
"Note",
{
"fields": (
"note",
"report_model",
)
},
),
audit_fieldset_tuple,
)

radio_fields = {
"ogtt_units": admin.VERTICAL,
"result_status": admin.VERTICAL,
"fasting": admin.VERTICAL,
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,19 @@
from django.utils.translation import gettext as _
from edc_model_admin.dashboard import ModelAdminDashboardMixin
from edc_model_admin.mixins import TemplatesModelAdminMixin
from edc_qareports.modeladmin_mixins import (
NoteStatusListFilter as BaseNoteStatusListFilter,
)
from edc_qareports.modeladmin_mixins import QaReportModelAdminMixin
from edc_sites.admin import SiteModelAdminMixin
from edc_visit_schedule.admin import ScheduleStatusListFilter

from ...admin_site import meta_reports_admin
from ...models import MissingScreeningOgtt
from ....admin_site import meta_reports_admin
from ....models import NOTE_STATUSES, MissingScreeningOgtt


class NoteStatusListFilter(BaseNoteStatusListFilter):
note_model_status_choices = NOTE_STATUSES


@admin.register(MissingScreeningOgtt, site=meta_reports_admin)
Expand All @@ -20,13 +27,19 @@ class MissingScreeningOgttAdmin(
TemplatesModelAdminMixin,
admin.ModelAdmin,
):
ordering = ["site", "screening_identifier"]
note_model = "meta_reports.missingogttnote"
note_status_list_filter = NoteStatusListFilter
note_template = "edc_qareports/columns/notes_column.html"
include_note_column = True

ordering = ["site", "subject_identifier"]

list_display = [
"dashboard",
"screening_identifier",
"subject_identifier",
"site",
"screening_datetime",
"fbg_datetime",
"screening_date",
"fbg_date",
"fbg_value",
"ogtt_value",
"repeated",
Expand All @@ -46,7 +59,7 @@ class MissingScreeningOgttAdmin(
"p3_ltfu",
]

search_fields = ["screening_identifier"]
search_fields = ["subject_identifier"]

def dashboard(self, obj=None, label=None) -> str:
url = self.get_subject_dashboard_url(obj=obj)
Expand All @@ -57,3 +70,15 @@ def dashboard(self, obj=None, label=None) -> str:
)
context = dict(title=_("Go to subject screening"), url=url, label=label)
return render_to_string("dashboard_button.html", context=context)

@admin.display(description="Screen date", ordering="screening_datetime")
def screening_date(self, obj):
if obj.screening_datetime:
return obj.screening_datetime.date()
return None

@admin.display(description="Fbg date", ordering="fbg_datetime")
def fbg_date(self, obj):
if obj.fbg_datetime:
return obj.fbg_datetime.date()
return None
1 change: 1 addition & 0 deletions meta_reports/forms/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
from .missing_ogtt_note_form import MissingOgttNoteForm
33 changes: 33 additions & 0 deletions meta_reports/forms/missing_ogtt_note_form.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
from django import forms
from edc_constants.constants import NO, YES
from edc_form_validators import FormValidator, FormValidatorMixin
from edc_glucose.form_validators import OgttFormValidatorMixin
from edc_glucose.utils import validate_glucose_as_millimoles_per_liter

from ..models import MissingOgttNote


class MissingOgttNoteFormValidator(OgttFormValidatorMixin, FormValidator):

def clean(self):
self.applicable_if(YES, field="result_status", field_applicable="fasting")
self.required_if(YES, NO, field="fasting", field_required="ogtt_base_datetime")
self.required_if(YES, NO, field="fasting", field_required="ogtt_datetime")
self.required_if(YES, NO, field="fasting", field_required="ogtt_value")
self.applicable_if(YES, NO, field="fasting", field_applicable="ogtt_units")
validate_glucose_as_millimoles_per_liter("ogtt", self.cleaned_data)
self.validate_ogtt_dates()
self.validate_ogtt_time_interval()


class MissingOgttNoteForm(FormValidatorMixin, forms.ModelForm):
form_validator_cls = MissingOgttNoteFormValidator

class Meta:
model = MissingOgttNote
fields = "__all__"
help_text = {"subject_identifier": "(read-only)", "name": "(read-only)"}
widgets = {
"report_model": forms.TextInput(attrs={"readonly": "readonly"}),
"subject_identifier": forms.TextInput(attrs={"readonly": "readonly"}),
}
54 changes: 54 additions & 0 deletions meta_reports/migrations/0034_auto_20240823_1642.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
# Generated by Django 5.0.8 on 2024-08-23 13:42

import django_db_views.migration_functions
import django_db_views.operations
from django.db import migrations


class Migration(migrations.Migration):

dependencies = [
("meta_reports", "0033_auto_20240823_0012"),
]

operations = [
django_db_views.operations.ViewRunPython(
code=django_db_views.migration_functions.ForwardViewMigration(
"# noqa\n select *, uuid() as id, now() as created,\n 'meta_reports.missing_screening_ogtt_view' as report_model\n from (\n select screening_identifier, site_id, report_datetime as 'screening_datetime', fbg_datetime,\n converted_fbg_value as fbg_value, converted_ogtt_value as ogtt_value, repeat_glucose_performed as repeated,\n p3_ltfu, fbg2_value, ogtt2_value, fbg2_datetime, ogtt2_datetime, consented,\n screening_identifier as subject_identifier, id as original_id\n from meta_screening_subjectscreening\n where converted_fbg_value is not null and converted_ogtt_value is null and unsuitable_agreed != \"Yes\"\n ) as A\n order by screening_identifier",
"missing_screening_ogtt_view",
engine="django.db.backends.mysql",
),
reverse_code=django_db_views.migration_functions.BackwardViewMigration(
"# noqa\n select *, uuid() as id, now() as created,\n 'meta_reports.missing_screening_ogtt_view' as report_model\n from (\n select screening_identifier, site_id, report_datetime as 'screening_datetime', fbg_datetime,\n converted_fbg_value as fbg_value, converted_ogtt_value as ogtt_value, repeat_glucose_performed as repeated,\n p3_ltfu, fbg2_value, ogtt2_value, fbg2_datetime, ogtt2_datetime, consented, \"\" as subject_identifier,\n id as original_id\n from meta_screening_subjectscreening\n where converted_fbg_value is not null and converted_ogtt_value is null and unsuitable_agreed != \"Yes\"\n ) as A\n order by screening_identifier",
"missing_screening_ogtt_view",
engine="django.db.backends.mysql",
),
atomic=False,
),
django_db_views.operations.ViewRunPython(
code=django_db_views.migration_functions.ForwardViewMigration(
"# noqa\n select *, get_random_uuid() as id, now() as created,\n 'meta_reports.missing_screening_ogtt_view' as report_model\n from (\n select screening_identifier, site_id, report_datetime as 'screening_datetime', fbg_datetime,\n converted_fbg_value as fbg_value, converted_ogtt_value as ogtt_value, repeat_glucose_performed as repeated,\n p3_ltfu, fbg2_value, ogtt2_value, fbg2_datetime, ogtt2_datetime, consented,\n screening_identifier as subject_identifier, id as original_id\n from meta_screening_subjectscreening\n where converted_fbg_value is not null and converted_ogtt_value is null and unsuitable_agreed != \"Yes\"\n ) as A\n order by screening_identifier",
"missing_screening_ogtt_view",
engine="django.db.backends.postgresql",
),
reverse_code=django_db_views.migration_functions.BackwardViewMigration(
"# noqa\n select *, get_random_uuid() as id, now() as created,\n 'meta_reports.missing_screening_ogtt_view' as report_model\n from (\n select screening_identifier, site_id, report_datetime as 'screening_datetime', fbg_datetime,\n converted_fbg_value as fbg_value, converted_ogtt_value as ogtt_value, repeat_glucose_performed as repeated,\n p3_ltfu, fbg2_value, ogtt2_value, fbg2_datetime, ogtt2_datetime, consented, \"\" as subject_identifier,\n id as original_id\n from meta_screening_subjectscreening\n where converted_fbg_value is not null and converted_ogtt_value is null and unsuitable_agreed != \"Yes\"\n ) as A\n order by screening_identifier",
"missing_screening_ogtt_view",
engine="django.db.backends.postgresql",
),
atomic=False,
),
django_db_views.operations.ViewRunPython(
code=django_db_views.migration_functions.ForwardViewMigration(
"# noqa\nSELECT *, lower(\n hex(randomblob(4)) || '-' || hex(randomblob(2)) || '-' || '4' ||\n substr(hex( randomblob(2)), 2) || '-' ||\n substr('AB89', 1 + (abs(random()) % 4) , 1) ||\n substr(hex(randomblob(2)), 2) || '-' ||\n hex(randomblob(6))\n ) as id, datetime() as `created`,\n 'meta_reports.missing_screening_ogtt_view' as report_model\n from (\n select screening_identifier, site_id, report_datetime as 'screening_datetime', fbg_datetime,\n converted_fbg_value as fbg_value, converted_ogtt_value as ogtt_value, fbg2_value, ogtt2_value,\n repeat_glucose_performed as repeated, p3_ltfu, fbg2_datetime, ogtt2_datetime, consented,\n screening_identifier as subject_identifier, id as original_id\n from meta_screening_subjectscreening\n where converted_fbg_value is not null and converted_ogtt_value is null and unsuitable_agreed != \"Yes\"\n ) as A\n order by screening_identifier",
"missing_screening_ogtt_view",
engine="django.db.backends.sqlite3",
),
reverse_code=django_db_views.migration_functions.BackwardViewMigration(
"# noqa\nSELECT *, lower(\n hex(randomblob(4)) || '-' || hex(randomblob(2)) || '-' || '4' ||\n substr(hex( randomblob(2)), 2) || '-' ||\n substr('AB89', 1 + (abs(random()) % 4) , 1) ||\n substr(hex(randomblob(2)), 2) || '-' ||\n hex(randomblob(6))\n ) as id, datetime() as `created`,\n 'meta_reports.missing_screening_ogtt_view' as report_model\n from (\n select screening_identifier, site_id, report_datetime as 'screening_datetime', fbg_datetime,\n converted_fbg_value as fbg_value, converted_ogtt_value as ogtt_value, fbg2_value, ogtt2_value,\n repeat_glucose_performed as repeated, p3_ltfu, fbg2_datetime, ogtt2_datetime, consented, \"\" as subject_identifier,\n id as original_id\n from meta_screening_subjectscreening\n where converted_fbg_value is not null and converted_ogtt_value is null and unsuitable_agreed != \"Yes\"\n ) as A\n order by screening_identifier",
"missing_screening_ogtt_view",
engine="django.db.backends.sqlite3",
),
atomic=False,
),
]
Loading

0 comments on commit 8a37a1f

Please sign in to comment.