Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
# Generated by Django 6.0.4 on 2026-05-07 23:04

import edc_action_item.managers
import effect_ae.models.death_report_tmg_second
from django.db import migrations


class Migration(migrations.Migration):

dependencies = [
("effect_ae", "0038_alter_deathreporttmgsecond_managers"),
]

operations = [
migrations.AlterModelManagers(
name="deathreporttmgsecond",
managers=[
(
"objects",
effect_ae.models.death_report_tmg_second.DeathReportTmgSecondManager(),
),
("on_site", edc_action_item.managers.ActionIdentifierSiteManager()),
],
),
]
2 changes: 2 additions & 0 deletions src/effect_prn/admin/__init__.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
from .arv_summary_admin import ArvSummaryAdmin
from .autocomplete_admin import ArvRegimensAdmin
from .end_of_study_admin import EndOfStudyAdmin
from .hospitalization_admin import HospitalizationAdmin
from .loss_to_followup_admin import LossToFollowupAdmin
Expand Down
104 changes: 104 additions & 0 deletions src/effect_prn/admin/arv_summary_admin.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,104 @@
from django.contrib import admin
from django_audit_fields.admin import audit_fieldset_tuple
from edc_model_admin.dashboard import ModelAdminSubjectDashboardMixin
from edc_model_admin.history import SimpleHistoryAdmin
from edc_sites.admin import SiteModelAdminMixin

from ..admin_site import effect_prn_admin
from ..forms import ArvSummaryForm
from ..models import ArvSummary


@admin.register(ArvSummary, site=effect_prn_admin)
class ArvSummaryAdmin(
SiteModelAdminMixin,
ModelAdminSubjectDashboardMixin,
SimpleHistoryAdmin,
):
form = ArvSummaryForm

autocomplete_fields = (
"at_screening_regimen",
"cont_enrol_regimen",
"after_enrol_regimen",
)

fieldsets = (
(
None,
{
"fields": (
"subject_identifier",
"report_datetime",
),
},
),
(
"Part 1: ARVs at screening",
{
"fields": (
"at_screening",
"at_screening_regimen",
"at_screening_start_date_known",
"at_screening_start_date",
),
},
),
(
"Part 2: ARVs at enrolment",
{
"description": (
"This section is applicable if the participant "
"was taking ARVs at screening (YES from above)"
),
"fields": (
"cont_enrol",
"cont_enrol_changed",
"cont_enrol_regimen",
),
},
),
(
"Part 3: ARVs after enrolment",
{
"description": (
"This section is applicable if (1) the participant "
"was NOT taking ARVs at screening (NO from part 1) "
"or (2) the participant was taking ARVs at screening "
"(YES part 1) but did NOT continue at enrolment (NO from part 2) "
),
"fields": (
"after_enrol",
"after_enrol_regimen",
"after_enrol_start_date_known",
"after_enrol_start_date",
),
},
),
audit_fieldset_tuple,
)

list_display = (
"subject_identifier",
"dashboard",
"at_screening",
"cont_enrol",
"after_enrol",
)

list_filter = (
"at_screening",
"cont_enrol",
"after_enrol",
)

radio_fields = { # noqa: RUF012
"at_screening": admin.VERTICAL,
"at_screening_start_date_known": admin.VERTICAL,
"cont_enrol": admin.VERTICAL,
"cont_enrol_changed": admin.VERTICAL,
"after_enrol": admin.VERTICAL,
"after_enrol_start_date_known": admin.VERTICAL,
}

search_fields = ("subject_identifier",)
13 changes: 13 additions & 0 deletions src/effect_prn/admin/autocomplete_admin.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
from django.contrib import admin
from edc_list_data.admin import ListModelAdminMixin

from effect_lists.models import ArvRegimens

from ..admin_site import effect_prn_admin


@admin.register(ArvRegimens, site=effect_prn_admin)
class ArvRegimensAdmin(ListModelAdminMixin, admin.ModelAdmin):
"""Registered again for the autocomplete field"""

pass
9 changes: 8 additions & 1 deletion src/effect_prn/choices.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,14 @@
from clinicedc_constants import NOT_APPLICABLE, OTHER
from clinicedc_constants import NO, NOT_APPLICABLE, OTHER, UNKNOWN, YES

from .constants import REMAIN_ON_STUDY_MODIFIED

ARV_CHANGE_OPTIONS = (
(YES, "Yes, ART was changed"),
(NO, "No, ART was not changed"),
(UNKNOWN, "Unknown"),
(NOT_APPLICABLE, "Not applicable"),
)

LOSS_CHOICES = (
("unknown_address", "Changed to an unknown address"),
("never_returned", "Did not return despite reminders"),
Expand Down
1 change: 1 addition & 0 deletions src/effect_prn/forms/__init__.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
from .arv_summary_form import ArvSummaryForm
from .end_of_study_form import EndOfStudyForm
from .hospitalization_form import HospitalizationForm
from .loss_to_followup_form import LossToFollowupForm
Expand Down
55 changes: 55 additions & 0 deletions src/effect_prn/forms/arv_summary_form.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
from clinicedc_constants import NO, YES
from django import forms
from edc_form_validators import FormValidator, FormValidatorMixin
from edc_model_form.mixins import BaseModelFormMixin
from edc_sites.forms import SiteModelFormMixin

from ..models import ArvSummary


class ArvSummaryFormValidator(FormValidator):
def clean(self):
self.required_if(YES, field="at_screening", field_required="at_screening_regimen")
self.applicable_if(
YES, field="at_screening", field_applicable="at_screening_start_date_known"
)
self.required_if(
YES,
field="at_screening_start_date_known",
field_required="at_screening_start_date",
)

self.applicable_if(YES, field="at_screening", field_applicable="cont_enrol")

self.applicable_if(YES, field="cont_enrol", field_applicable="cont_enrol_changed")
self.applicable_if(
YES, field="cont_enrol_changed", field_applicable="cont_enrol_regimen"
)

cond = self.cleaned_data.get("at_screening") == NO or (
self.cleaned_data.get("at_screening") == YES
and self.cleaned_data.get("cont_enrol") == NO
)
self.applicable_if_true(cond, field_applicable="after_enrol")
self.applicable_if(YES, field="after_enrol", field_applicable="after_enrol_regimen")
self.applicable_if(
YES, field="after_enrol", field_applicable="after_enrol_start_date_known"
)
self.required_if(
YES,
field="after_enrol_start_date_known",
field_required="after_enrol_start_date",
)


class ArvSummaryForm(
SiteModelFormMixin,
FormValidatorMixin,
BaseModelFormMixin,
forms.ModelForm,
):
form_validator_cls = ArvSummaryFormValidator

class Meta:
model = ArvSummary
fields = "__all__"
Loading
Loading