meta-edc 1.1.8__py3-none-any.whl → 1.1.12__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of meta-edc might be problematic. Click here for more details.
- meta_ae/action_items.py +2 -1
- meta_ae/admin/__init__.py +11 -0
- meta_ae/admin/ae_susar_admin.py +1 -1
- meta_ae/admin/death_report_admin.py +1 -1
- meta_ae/admin/modeladmin_mixins.py +10 -12
- meta_ae/baker_recipes.py +3 -3
- meta_ae/forms/__init__.py +13 -0
- meta_ae/forms/modelform_mixins.py +2 -2
- meta_ae/migrations/0001_initial.py +27 -27
- meta_ae/migrations/0006_aelocalreview_aesponsorreview.py +5 -5
- meta_ae/migrations/0022_historicalhospitalization_hospitalization.py +5 -13
- meta_ae/migrations/0023_alter_aefollowup_action_identifier_and_more.py +2017 -0
- meta_ae/model_mixins/__init__.py +2 -0
- meta_ae/model_mixins/ae_review_model_mixin.py +6 -6
- meta_ae/model_mixins/death_report_model_mixin.py +3 -3
- meta_ae/models/__init__.py +13 -0
- meta_ae/models/hospitalization.py +3 -3
- meta_ae/pdf_reports/__init__.py +2 -0
- meta_analytics/.DS_Store +0 -0
- meta_analytics/dataframes/__init__.py +24 -0
- meta_analytics/dataframes/get_eos_df.py +1 -2
- meta_analytics/dataframes/get_glucose_df.py +6 -7
- meta_analytics/dataframes/get_glucose_fbg_df.py +2 -3
- meta_analytics/dataframes/get_glucose_fbg_ogtt_df.py +1 -2
- meta_analytics/dataframes/get_last_imp_visits_df.py +5 -6
- meta_analytics/dataframes/glucose_endpoints/__init__.py +2 -0
- meta_analytics/dataframes/glucose_endpoints/endpoint_by_date.py +13 -20
- meta_analytics/dataframes/glucose_endpoints/glucose_endpoints_by_date.py +9 -10
- meta_analytics/dataframes/screening/__init__.py +2 -0
- meta_analytics/dataframes/screening/get_glucose_tested_only_df.py +1 -2
- meta_analytics/dataframes/screening/get_screening_df.py +6 -10
- meta_analytics/dataframes/utils.py +3 -8
- meta_analytics/get_tables.py +1 -2
- meta_analytics/tables/__init__.py +2 -0
- meta_consent/action_items.py +2 -1
- meta_consent/admin/__init__.py +6 -0
- meta_consent/admin/actions/__init__.py +2 -0
- meta_consent/admin/actions/create_missing_prescriptions.py +1 -1
- meta_consent/admin/list_filters.py +2 -2
- meta_consent/admin/modeladmin_mixins.py +3 -4
- meta_consent/admin/subject_consent_v1_ext_admin.py +2 -2
- meta_consent/baker_recipes.py +7 -8
- meta_consent/form_validators/__init__.py +2 -0
- meta_consent/forms/__init__.py +7 -0
- meta_consent/forms/subject_consent_v1_ext_form.py +2 -3
- meta_consent/forms/subject_reconsent_form.py +4 -4
- meta_consent/management/commands/create_missing_prescriptions.py +4 -2
- meta_consent/migrations/0001_initial.py +9 -9
- meta_consent/migrations/0024_historicalsubjectconsentv1.py +3 -8
- meta_consent/migrations/0026_historicalsubjectconsentv1ext_subjectconsentv1ext.py +5 -14
- meta_consent/migrations/0032_alter_historicalsubjectconsent_device_created_and_more.py +678 -0
- meta_consent/models/__init__.py +9 -0
- meta_consent/models/model_mixins.py +1 -2
- meta_consent/models/signals.py +9 -10
- meta_consent/models/subject_consent.py +1 -1
- meta_consent/models/subject_reconsent.py +3 -3
- meta_dashboard/patterns.py +1 -1
- meta_dashboard/templatetags/meta_dashboard_extras.py +1 -1
- meta_dashboard/view_utils/__init__.py +7 -0
- meta_dashboard/view_utils/subject_screening_button.py +9 -16
- meta_dashboard/views/__init__.py +8 -0
- meta_dashboard/views/ae/__init__.py +2 -0
- meta_dashboard/views/ae/ae_listboard_view.py +1 -1
- meta_dashboard/views/ae/death_report_listboard_view.py +1 -1
- meta_dashboard/views/screening/__init__.py +2 -0
- meta_dashboard/views/subject/__init__.py +2 -0
- meta_dashboard/views/subject/dashboard/__init__.py +2 -0
- meta_dashboard/views/subject/dashboard/dashboard_view.py +1 -1
- meta_dashboard/views/subject/listboard/__init__.py +2 -0
- meta_edc/__init__.py +5 -9
- meta_edc/celery.py +1 -1
- meta_edc/celery_live.py +1 -1
- meta_edc/celery_uat.py +1 -1
- meta_edc/management/commands/update_forms_reference.py +10 -12
- meta_edc/settings/debug.py +5 -4
- meta_edc/settings/defaults.py +18 -3
- meta_edc/settings/live.py +3 -1
- meta_edc/settings/logging.py +9 -4
- meta_edc/settings/minimal.py +4 -5
- meta_edc/settings/uat.py +3 -1
- meta_edc/views/__init__.py +2 -0
- meta_edc-1.1.12.dist-info/METADATA +174 -0
- {meta_edc-1.1.8.dist-info → meta_edc-1.1.12.dist-info}/RECORD +413 -526
- meta_edc-1.1.12.dist-info/WHEEL +4 -0
- meta_lists/migrations/0020_alter_abnormalfootappearanceobservations_extra_value_and_more.py +404 -0
- meta_pharmacy/admin/__init__.py +5 -0
- meta_pharmacy/admin/substitutions_admin.py +2 -2
- meta_pharmacy/forms/__init__.py +2 -0
- meta_pharmacy/forms/substitutions_form.py +6 -4
- meta_pharmacy/labels/__init__.py +4 -2
- meta_pharmacy/labels/draw_label_for_subject_with_barcode.py +1 -2
- meta_pharmacy/labels/draw_label_with_test_data.py +2 -2
- meta_pharmacy/labels/label_data.py +1 -2
- meta_pharmacy/labels/print_sheets.py +4 -6
- meta_pharmacy/migrations/0002_initial.py +7 -20
- meta_pharmacy/migrations/0003_auto_20240909_2335.py +3 -2
- meta_pharmacy/migrations/0006_lotnumber_label.py +5 -14
- meta_pharmacy/migrations/0008_remove_lotnumber_medication_and_more.py +5 -6
- meta_pharmacy/migrations/0010_alter_historicallabeldata_device_created_and_more.py +382 -0
- meta_pharmacy/models/__init__.py +7 -0
- meta_pharmacy/models/label_data.py +4 -5
- meta_pharmacy/models/substitutions.py +3 -3
- meta_pharmacy/prepare_meta_pharmacy.py +1 -1
- meta_pharmacy/utils/__init__.py +2 -0
- meta_pharmacy/utils/update_initial_pharmacy_data.py +1 -1
- meta_prn/admin/__init__.py +16 -0
- meta_prn/admin/dm_referral_admin.py +2 -1
- meta_prn/admin/end_of_study_admin.py +6 -7
- meta_prn/admin/loss_to_followup_admin.py +3 -2
- meta_prn/admin/off_study_medication_admin.py +5 -6
- meta_prn/admin/offschedule_admin.py +5 -6
- meta_prn/admin/offschedule_dm_referral_admin.py +6 -6
- meta_prn/admin/offschedule_postnatal_admin.py +7 -7
- meta_prn/admin/offschedule_pregnancy_admin.py +8 -7
- meta_prn/admin/onschedule_admin.py +7 -8
- meta_prn/admin/onschedule_dm_referral_admin.py +6 -7
- meta_prn/admin/pregnancy_notification_admin.py +5 -6
- meta_prn/admin/protocol_incident_admin.py +1 -1
- meta_prn/admin/subject_transfer_admin.py +1 -1
- meta_prn/baker_recipes.py +4 -4
- meta_prn/form_validators/__init__.py +5 -0
- meta_prn/form_validators/end_of_study.py +2 -2
- meta_prn/forms/__init__.py +13 -0
- meta_prn/migrations/0001_initial.py +25 -25
- meta_prn/migrations/0017_auto_20220307_1929.py +5 -5
- meta_prn/migrations/0018_auto_20220309_2106.py +9 -9
- meta_prn/migrations/0021_auto_20220316_2147.py +13 -13
- meta_prn/migrations/0022_auto_20220318_0133.py +9 -9
- meta_prn/migrations/0032_historicalegfrnotification_egfrnotification.py +5 -13
- meta_prn/migrations/0038_alter_endofstudy_delivery_date_and_more.py +5 -13
- meta_prn/migrations/0041_endofstudy_transfer_date_and_more.py +5 -13
- meta_prn/migrations/0057_historicalonscheduledmreferral_and_more.py +13 -38
- meta_prn/migrations/0067_alter_offschedule_managers_and_more.py +2557 -0
- meta_prn/models/__init__.py +20 -0
- meta_prn/models/offschedule.py +4 -4
- meta_prn/models/protocol_incident.py +1 -1
- meta_prn/models/subject_transfer.py +8 -0
- meta_rando/migrations/0001_initial.py +5 -5
- meta_rando/migrations/0006_alter_historicalrandomizationlist_allocated_user_and_more.py +130 -0
- meta_reports/__init__.py +2 -0
- meta_reports/admin/__init__.py +16 -0
- meta_reports/admin/dbviews/__init__.py +13 -0
- meta_reports/admin/dbviews/glucose_summary_admin.py +6 -6
- meta_reports/admin/dbviews/imp_substitutions_admin.py +12 -11
- meta_reports/admin/dbviews/missing_screening_ogtt_admin/__init__.py +5 -0
- meta_reports/admin/dbviews/missing_screening_ogtt_admin/note_model_admin.py +27 -3
- meta_reports/admin/dbviews/missing_screening_ogtt_admin/unmanaged_model_admin.py +6 -6
- meta_reports/admin/dbviews/on_study_missing_lab_values_admin/__init__.py +2 -0
- meta_reports/admin/dbviews/on_study_missing_lab_values_admin/unmanaged_model_admin.py +0 -3
- meta_reports/admin/dbviews/on_study_missing_values_admin/__init__.py +2 -0
- meta_reports/admin/dbviews/patient_history_missing_baseline_cd4_admin.py +8 -8
- meta_reports/admin/dbviews/unattended_three_in_row2_admin.py +6 -6
- meta_reports/admin/dbviews/unattended_three_in_row_admin.py +5 -5
- meta_reports/admin/dbviews/unattended_two_in_row_admin.py +5 -5
- meta_reports/admin/endpoints_admin.py +1 -1
- meta_reports/admin/last_imp_refill_admin.py +9 -9
- meta_reports/admin/list_filters.py +2 -2
- meta_reports/admin/modeladmin_mixins.py +9 -16
- meta_reports/death_report.py +1 -1
- meta_reports/forms/__init__.py +2 -0
- meta_reports/forms/missing_ogtt_note_form.py +2 -3
- meta_reports/management/commands/generate_endpoints.py +5 -4
- meta_reports/migrations/0035_historicalmissingogttnote_missingogttnote.py +5 -14
- meta_reports/migrations/0059_alter_endpoints_created_and_more.py +161 -0
- meta_reports/models/__init__.py +17 -0
- meta_reports/models/dbviews/__init__.py +14 -0
- meta_reports/models/dbviews/glucose_summary/__init__.py +2 -0
- meta_reports/models/dbviews/glucose_summary/unmanaged_model.py +4 -5
- meta_reports/models/dbviews/imp_substitutions/__init__.py +2 -0
- meta_reports/models/dbviews/imp_substitutions/view_definition.py +1 -1
- meta_reports/models/dbviews/missing_screening_ogtt/__init__.py +2 -0
- meta_reports/models/dbviews/missing_screening_ogtt/note_model.py +1 -1
- meta_reports/models/dbviews/missing_screening_ogtt/unmanaged_model.py +4 -3
- meta_reports/models/dbviews/on_study_missing_lab_values/__init__.py +2 -0
- meta_reports/models/dbviews/on_study_missing_lab_values/qa_cases.py +13 -11
- meta_reports/models/dbviews/on_study_missing_values/__init__.py +2 -0
- meta_reports/models/dbviews/on_study_missing_values/qa_cases.py +18 -0
- meta_reports/models/dbviews/patient_history_missing_baseline_cd4/__init__.py +2 -0
- meta_reports/models/dbviews/unattended_three_in_row/__init__.py +2 -0
- meta_reports/models/dbviews/unattended_three_in_row2/__init__.py +2 -0
- meta_reports/models/dbviews/unattended_two_in_row/__init__.py +2 -0
- meta_reports/models/endpoints.py +4 -4
- meta_reports/models/last_imp_refill.py +2 -3
- meta_reports/pdf_report.py +2 -2
- meta_reports/tasks.py +1 -1
- meta_screening/admin/__init__.py +8 -0
- meta_screening/admin/fieldsets.py +13 -14
- meta_screening/admin/list_filters.py +6 -4
- meta_screening/admin/screening_part_one_admin.py +1 -2
- meta_screening/admin/screening_part_three_admin.py +2 -3
- meta_screening/admin/screening_part_two_admin.py +7 -10
- meta_screening/admin/subject_refusal_admin.py +5 -3
- meta_screening/admin/subject_screening_admin.py +4 -4
- meta_screening/baker_recipes.py +9 -9
- meta_screening/eligibility/__init__.py +9 -0
- meta_screening/eligibility/eligibility.py +7 -7
- meta_screening/eligibility/eligibility_part_three/__init__.py +2 -0
- meta_screening/eligibility/eligibility_part_three/base_eligibility_part_three.py +8 -8
- meta_screening/eligibility/eligibility_part_three/eligibility_part_three_phase_three.py +13 -14
- meta_screening/form_validators/__init__.py +8 -0
- meta_screening/forms/__init__.py +20 -0
- meta_screening/forms/field_lists.py +16 -17
- meta_screening/forms/screening_part_one_form.py +2 -2
- meta_screening/forms/screening_part_three_form.py +5 -3
- meta_screening/forms/screening_part_two_form.py +1 -5
- meta_screening/forms/subject_refusal_form.py +0 -4
- meta_screening/forms/subject_screening_form.py +0 -4
- meta_screening/migrations/0001_initial.py +15 -15
- meta_screening/migrations/0010_auto_20191106_0828.py +5 -5
- meta_screening/migrations/0068_alter_historicalscreeningpartone_acute_condition_and_more.py +1579 -0
- meta_screening/model_mixins/__init__.py +8 -0
- meta_screening/model_mixins/eligibility_model_mixin.py +5 -3
- meta_screening/model_mixins/part_one_fields_model_mixin.py +5 -9
- meta_screening/model_mixins/part_three_fields_model_mixin.py +5 -6
- meta_screening/model_mixins/part_two_fields_model_mixin.py +18 -16
- meta_screening/models/__init__.py +9 -0
- meta_screening/models/icp_referral.py +5 -5
- meta_screening/models/signals.py +10 -11
- meta_screening/models/subject_refusal.py +1 -1
- meta_screening/models/subject_screening.py +1 -3
- meta_subject/action_items.py +13 -15
- meta_subject/admin/__init__.py +39 -0
- meta_subject/admin/birth_outcome_admin.py +4 -8
- meta_subject/admin/blood_results/__init__.py +9 -0
- meta_subject/admin/blood_results/blood_results_fbc_admin.py +1 -1
- meta_subject/admin/blood_results/blood_results_hba1c_admin.py +1 -1
- meta_subject/admin/blood_results/blood_results_ins_admin.py +1 -1
- meta_subject/admin/blood_results/blood_results_lft_admin.py +1 -1
- meta_subject/admin/blood_results/blood_results_lipids_admin.py +1 -1
- meta_subject/admin/blood_results/blood_results_rft_admin.py +3 -5
- meta_subject/admin/complications_glycemia_admin.py +1 -1
- meta_subject/admin/delivery_admin.py +7 -10
- meta_subject/admin/diabetes/__init__.py +2 -0
- meta_subject/admin/diabetes/dm_endpoint_admin.py +2 -2
- meta_subject/admin/diabetes/dm_followup_admin.py +3 -2
- meta_subject/admin/egfr_drop_notification_admin.py +1 -1
- meta_subject/admin/followup_examination_admin.py +10 -9
- meta_subject/admin/followup_vitals_admin.py +4 -5
- meta_subject/admin/glucose_admin.py +2 -4
- meta_subject/admin/glucose_fbg_admin.py +1 -3
- meta_subject/admin/health_economics/__init__.py +2 -0
- meta_subject/admin/health_economics/health_economics_simple_admin.py +1 -1
- meta_subject/admin/health_economics/health_economics_update_admin.py +1 -1
- meta_subject/admin/hepatitis_test_admin.py +1 -1
- meta_subject/admin/list_filters.py +1 -1
- meta_subject/admin/mnsi_admin.py +7 -5
- meta_subject/admin/other_arv_regimens_admin.py +3 -3
- meta_subject/admin/patient_history_admin.py +4 -4
- meta_subject/admin/physical_exam_admin.py +1 -1
- meta_subject/admin/pregnancy_update_admin.py +1 -1
- meta_subject/admin/study_medication_admin.py +8 -15
- meta_subject/admin/subject_requisition_admin.py +1 -1
- meta_subject/admin/subject_visit_admin.py +1 -1
- meta_subject/admin/subject_visit_missed_admin.py +1 -1
- meta_subject/admin/urine_dipstick_test_admin.py +1 -1
- meta_subject/admin/urine_pregnancy_admin.py +1 -1
- meta_subject/baker_recipes.py +15 -15
- meta_subject/form_validators/__init__.py +11 -0
- meta_subject/form_validators/delivery_form_validator.py +2 -3
- meta_subject/form_validators/dm_endpoint_form_validator.py +1 -1
- meta_subject/form_validators/dm_followup_form_validator.py +7 -6
- meta_subject/form_validators/glucose_form_validator.py +3 -5
- meta_subject/forms/__init__.py +41 -0
- meta_subject/forms/blood_results/__init__.py +9 -0
- meta_subject/forms/blood_results/blood_results_rft_form.py +1 -2
- meta_subject/forms/diabetes/__init__.py +2 -0
- meta_subject/forms/diabetes/dm_followup_form.py +2 -2
- meta_subject/forms/followup_vitals_form.py +3 -8
- meta_subject/forms/health_economics/__init__.py +2 -0
- meta_subject/forms/next_appointment_form.py +2 -3
- meta_subject/forms/slider_widget.py +1 -1
- meta_subject/forms/study_medication_form.py +11 -8
- meta_subject/management/commands/create_missing_refills.py +3 -3
- meta_subject/management/commands/create_missing_rx.py +1 -1
- meta_subject/management/commands/missed.py +20 -23
- meta_subject/metadata_rules/__init__.py +2 -0
- meta_subject/metadata_rules/predicates.py +25 -32
- meta_subject/migrations/0001_initial.py +61 -61
- meta_subject/migrations/0002_auto_20191021_0353.py +5 -5
- meta_subject/migrations/0012_auto_20200118_2334.py +5 -5
- meta_subject/migrations/0014_auto_20200120_1622.py +5 -5
- meta_subject/migrations/0018_coronakap_historicalcoronakap.py +5 -5
- meta_subject/migrations/0033_auto_20200516_2356.py +5 -5
- meta_subject/migrations/0038_auto_20200520_0020.py +5 -5
- meta_subject/migrations/0040_auto_20200527_2155.py +1 -1
- meta_subject/migrations/0045_auto_20200530_1801.py +1 -1
- meta_subject/migrations/0051_auto_20200617_2117.py +5 -5
- meta_subject/migrations/0063_auto_20210715_0337.py +5 -5
- meta_subject/migrations/0066_auto_20210721_0335.py +9 -9
- meta_subject/migrations/0067_auto_20210726_0340.py +5 -5
- meta_subject/migrations/0068_auto_20210728_1809.py +5 -5
- meta_subject/migrations/0072_auto_20210805_1545.py +7 -7
- meta_subject/migrations/0073_auto_20210809_0055.py +5 -5
- meta_subject/migrations/0077_auto_20210809_2323.py +3 -3
- meta_subject/migrations/0082_auto_20210823_1612.py +3 -3
- meta_subject/migrations/0083_auto_20210823_1620.py +3 -3
- meta_subject/migrations/0088_auto_20210924_0027.py +5 -5
- meta_subject/migrations/0090_auto_20210924_0424.py +5 -5
- meta_subject/migrations/0093_auto_20211117_0352.py +5 -5
- meta_subject/migrations/0095_auto_20220128_1719.py +5 -5
- meta_subject/migrations/0098_auto_20220309_2106.py +5 -5
- meta_subject/migrations/0101_auto_20220316_2147.py +13 -13
- meta_subject/migrations/0115_historicalegfrnotification_egfrnotification.py +5 -13
- meta_subject/migrations/0164_dmreferralfollowup_historicaldmreferralfollowup.py +5 -5
- meta_subject/migrations/0172_remove_historicalbloodresultsglu_action_item_and_more.py +1 -2
- meta_subject/migrations/0177_alter_bloodresultslft_alp_value_and_more.py +1 -2
- meta_subject/migrations/0178_historicalhealtheconomicsupdate_and_more.py +5 -14
- meta_subject/migrations/0186_healtheconomicsupdate_singleton_field_and_more.py +1 -2
- meta_subject/migrations/0187_dmdiagnosis_historicaldmdiagnosis_dmdxresult_and_more.py +5 -14
- meta_subject/migrations/0188_historicaldmdxresult_dmdxresult.py +5 -14
- meta_subject/migrations/0209_remove_historicaldmdxresult_dm_diagnosis_and_more.py +1 -2
- meta_subject/migrations/0216_historicalnextappointment_nextappointment.py +5 -6
- meta_subject/migrations/0220_historicalbloodresultsgludummy_bloodresultsgludummy.py +5 -14
- meta_subject/migrations/0227_alter_followupvitals_waist_circumference_comment_and_more.py +97 -0
- meta_subject/migrations/0228_bloodresultshba1c_hba1c_datetime_and_more.py +9297 -0
- meta_subject/model_mixins/__init__.py +8 -0
- meta_subject/model_mixins/search_slug_model_mixin.py +1 -2
- meta_subject/model_mixins/vitals_fields_model_mixin.py +1 -1
- meta_subject/models/__init__.py +48 -0
- meta_subject/models/birth_outcomes.py +3 -3
- meta_subject/models/blood_results/__init__.py +11 -0
- meta_subject/models/delivery.py +3 -3
- meta_subject/models/diabetes/__init__.py +2 -0
- meta_subject/models/diabetes/dm_endpoint.py +4 -4
- meta_subject/models/diabetes/dm_followup.py +3 -4
- meta_subject/models/diet_and_lifestyle.py +2 -2
- meta_subject/models/followup_examination.py +11 -11
- meta_subject/models/glucose.py +4 -4
- meta_subject/models/glucose_fbg.py +2 -3
- meta_subject/models/health_economics/__init__.py +2 -0
- meta_subject/models/health_economics/health_economics.py +7 -7
- meta_subject/models/health_economics/health_economics_update.py +2 -1
- meta_subject/models/hepatitis_test.py +2 -2
- meta_subject/models/other_arv_regimens_detail.py +1 -1
- meta_subject/models/patient_history.py +5 -6
- meta_subject/models/physical_exam.py +2 -2
- meta_subject/models/pregnancy_update.py +1 -1
- meta_subject/models/signals.py +14 -12
- meta_subject/models/subject_visit.py +1 -1
- meta_subject/models/urine_dipstick_test.py +1 -1
- meta_subject/models/urine_pregnancy.py +1 -1
- meta_visit_schedule/visit_schedules/__init__.py +2 -0
- meta_visit_schedule/visit_schedules/phase_three/__init__.py +2 -0
- meta_visit_schedule/visit_schedules/phase_three/schedule.py +2 -2
- meta_visit_schedule/visit_schedules/phase_three/schedule_dm_referral.py +1 -2
- meta_visit_schedule/visit_schedules/phase_three/schedule_pregnancy.py +1 -2
- meta_ae/tests/holidays.csv +0 -15
- meta_ae/tests/tests/test_actions.py +0 -126
- meta_ae/tests/urls.py +0 -10
- meta_analytics/dataframes/glucose_endpoints/utils.py +0 -0
- meta_analytics/notebooks/anu.ipynb +0 -95
- meta_analytics/notebooks/appointment_planning.ipynb +0 -329
- meta_analytics/notebooks/arvs.ipynb +0 -103
- meta_analytics/notebooks/cleaning/__init__.py +0 -0
- meta_analytics/notebooks/cleaning/consent_v1_ext.ipynb +0 -227
- meta_analytics/notebooks/cleaning/offschedule_eos.ipynb +0 -353
- meta_analytics/notebooks/dsmc/renal_dysfunction.ipynb +0 -435
- meta_analytics/notebooks/endpoints/meta_endpoints_by_date.ipynb +0 -656
- meta_analytics/notebooks/followup_examination.ipynb +0 -141
- meta_analytics/notebooks/hba1c.ipynb +0 -136
- meta_analytics/notebooks/hiv_regimens.ipynb +0 -429
- meta_analytics/notebooks/incidence.ipynb +0 -232
- meta_analytics/notebooks/liver.ipynb +0 -389
- meta_analytics/notebooks/magreth.ipynb +0 -645
- meta_analytics/notebooks/monitoring_report.ipynb +0 -1834
- meta_analytics/notebooks/pharmacy.ipynb +0 -1061
- meta_analytics/notebooks/pharmacy_stock_202410.ipynb +0 -306
- meta_analytics/notebooks/qa.ipynb +0 -273
- meta_analytics/notebooks/steering.ipynb +0 -61
- meta_analytics/notebooks/undiagnosed/meta3_screening_consort_chart.ipynb +0 -1176
- meta_analytics/notebooks/undiagnosed/meta3_screening_undiagnosed.ipynb +0 -519
- meta_analytics/notebooks/undiagnosed/meta_screening_table2.ipynb +0 -964
- meta_analytics/notebooks/undiagnosed/screen_undiagnosed_or.ipynb +0 -296
- meta_analytics/notebooks/undiagnosed/screening.ipynb +0 -273
- meta_analytics/notebooks/undiagnosed/screening2.ipynb +0 -958
- meta_analytics/notebooks/undiagnosed/screening_undiagnosed_20241002.ipynb +0 -958
- meta_analytics/notebooks/ven.ipynb +0 -191
- meta_analytics/notebooks/vitals.ipynb +0 -263
- meta_analytics/tests/__init__.py +0 -0
- meta_analytics/tests/test_endpoints_by_date.py +0 -94
- meta_consent/tests/__init__.py +0 -0
- meta_consent/tests/holidays.csv +0 -15
- meta_consent/tests/tests/__init__.py +0 -0
- meta_consent/tests/tests/test_form_validators.py +0 -110
- meta_consent/tests/tests/test_subject_consent.py +0 -10
- meta_consent/tests/urls.py +0 -17
- meta_dashboard/tests/__init__.py +0 -0
- meta_dashboard/tests/admin.py +0 -22
- meta_dashboard/tests/holidays.csv +0 -15
- meta_dashboard/tests/tests/__init__.py +0 -0
- meta_dashboard/tests/urls.py +0 -55
- meta_edc/tests/__init__.py +0 -0
- meta_edc/tests/tests/__init__.py +0 -0
- meta_edc/tests/tests/test_endpoints.py +0 -555
- meta_edc-1.1.8.dist-info/METADATA +0 -767
- meta_edc-1.1.8.dist-info/WHEEL +0 -5
- meta_edc-1.1.8.dist-info/licenses/AUTHORS.rst +0 -8
- meta_edc-1.1.8.dist-info/top_level.txt +0 -20
- meta_labs/tests/__init__.py +0 -0
- meta_labs/tests/test_labs.py +0 -27
- meta_labs/tests/test_reportables.py +0 -70
- meta_labs/tests/urls.py +0 -4
- meta_lists/tests/__init__.py +0 -0
- meta_lists/tests/test_lists.py +0 -8
- meta_pharmacy/notebooks/pharmacy.ipynb +0 -41
- meta_prn/tests/__init__.py +0 -0
- meta_prn/tests/tests/__init__.py +0 -0
- meta_prn/tests/tests/test_actions.py +0 -97
- meta_prn/tests/tests/test_dm_referral.py +0 -203
- meta_prn/tests/tests/test_eos_events.py +0 -134
- meta_prn/tests/tests/test_manager_order.py +0 -14
- meta_prn/tests/tests/test_pregnancy_notification.py +0 -93
- meta_prn/tests/urls.py +0 -10
- meta_rando/tests/__init__.py +0 -0
- meta_rando/tests/tests/__init__.py +0 -0
- meta_rando/tests/tests/test_randomizers.py +0 -57
- meta_reports/tests/__init__.py +0 -0
- meta_reports/tests/test_reports.py +0 -35
- meta_reports/tests/test_sql_gen.py +0 -5
- meta_reports/tests/urls.py +0 -4
- meta_screening/offline_models.py +0 -3
- meta_screening/tests/__init__.py +0 -0
- meta_screening/tests/holidays.csv +0 -15
- meta_screening/tests/meta_test_case_mixin.py +0 -234
- meta_screening/tests/options.py +0 -127
- meta_screening/tests/tests/__init__.py +0 -0
- meta_screening/tests/tests/test_forms.py +0 -404
- meta_screening/tests/tests/test_screening_part_one.py +0 -108
- meta_screening/tests/tests/test_screening_part_three.py +0 -433
- meta_screening/tests/tests/test_screening_part_two.py +0 -84
- meta_sites/tests/__init__.py +0 -0
- meta_sites/tests/test_sites.py +0 -12
- meta_sites/tests/urls.py +0 -4
- meta_stats/__init__.py +0 -0
- meta_stats/incidence.py +0 -16
- meta_stats/models.py +0 -0
- meta_stats/tests/__init__.py +0 -0
- meta_stats/tests/tests/__init__.py +0 -0
- meta_stats/tests/tests/test_incidence.py +0 -10
- meta_subject/tests/__init__.py +0 -0
- meta_subject/tests/holidays.csv +0 -15
- meta_subject/tests/tests/__init__.py +0 -0
- meta_subject/tests/tests/test_egfr.py +0 -234
- meta_subject/tests/tests/test_fixes.py +0 -64
- meta_subject/tests/tests/test_followup.py +0 -52
- meta_subject/tests/tests/test_manager_order.py +0 -11
- meta_subject/tests/tests/test_medication_adherence.py +0 -79
- meta_subject/tests/tests/test_metadata_rules.py +0 -135
- meta_subject/tests/tests/test_mnsi.py +0 -341
- meta_subject/tests/tests/test_next_appointment.py +0 -231
- meta_subject/tests/tests/test_patient_history_form.py +0 -74
- meta_subject/tests/tests/test_physical_exam.py +0 -84
- meta_subject/tests/tests/test_sf12.py +0 -161
- meta_subject/tests/tests/test_study_medication.py +0 -229
- meta_subject/tests/urls.py +0 -24
- meta_visit_schedule/tests/__init__.py +0 -0
- meta_visit_schedule/tests/tests/__init__.py +0 -0
- meta_visit_schedule/tests/tests/test_schedule.py +0 -181
- meta_visit_schedule/tests/urls.py +0 -4
- tests/__init__.py +0 -0
- tests/etc/randomization_list.csv +0 -241
- tests/etc/randomization_list_phase_three.csv +0 -241
- tests/etc/user-aes-local.key +0 -0
- tests/etc/user-aes-restricted.key +0 -1
- tests/etc/user-rsa-local-private.pem +0 -27
- tests/etc/user-rsa-local-public.pem +0 -9
- tests/etc/user-rsa-restricted-private.pem +0 -27
- tests/etc/user-rsa-restricted-public.pem +0 -9
- tests/etc/user-salt-local.key +0 -0
- tests/etc/user-salt-restricted.key +0 -0
- tests/holidays.csv +0 -15
- tests/test_settings.py +0 -185
- {meta_edc-1.1.8.dist-info → meta_edc-1.1.12.dist-info}/licenses/LICENSE +0 -0
- /meta_ae/tests/__init__.py → /meta_subject/management/__init__py.py +0 -0
- /meta_ae/tests/tests/__init__.py → /meta_subject/management/commands/__init__py.py +0 -0
meta_reports/models/endpoints.py
CHANGED
|
@@ -9,7 +9,7 @@ class Endpoints(QaReportModelMixin, models.Model):
|
|
|
9
9
|
|
|
10
10
|
visit_code = models.IntegerField(null=True)
|
|
11
11
|
|
|
12
|
-
fasting = models.CharField(max_length=10,
|
|
12
|
+
fasting = models.CharField(max_length=10, default="")
|
|
13
13
|
|
|
14
14
|
fbg_date = models.DateField(null=True)
|
|
15
15
|
|
|
@@ -17,18 +17,18 @@ class Endpoints(QaReportModelMixin, models.Model):
|
|
|
17
17
|
|
|
18
18
|
ogtt_value = models.FloatField(null=True)
|
|
19
19
|
|
|
20
|
-
endpoint_label = models.CharField(max_length=250,
|
|
20
|
+
endpoint_label = models.CharField(max_length=250, default="")
|
|
21
21
|
|
|
22
22
|
baseline_date = models.DateField(null=True)
|
|
23
23
|
|
|
24
24
|
offstudy_date = models.DateField(null=True)
|
|
25
25
|
|
|
26
|
-
offstudy_reason = models.CharField(max_length=250,
|
|
26
|
+
offstudy_reason = models.CharField(max_length=250, default="")
|
|
27
27
|
|
|
28
28
|
def __str__(self):
|
|
29
29
|
return f"{self.subject_identifier} {self.visit_code} {self.endpoint_label}"
|
|
30
30
|
|
|
31
|
-
class Meta(QaReportModelMixin.Meta):
|
|
31
|
+
class Meta(QaReportModelMixin.Meta): # noqa: DJ012
|
|
32
32
|
verbose_name = "Endpoints (DM)"
|
|
33
33
|
verbose_name_plural = "Endpoints (DM)"
|
|
34
34
|
default_permissions = qa_reports_permissions
|
|
@@ -4,7 +4,6 @@ from edc_qareports.model_mixins import QaReportModelMixin, qa_reports_permission
|
|
|
4
4
|
|
|
5
5
|
|
|
6
6
|
class LastImpRefill(QaReportModelMixin, models.Model):
|
|
7
|
-
|
|
8
7
|
reference_date = models.DateField(null=True)
|
|
9
8
|
|
|
10
9
|
imp_visit_code = models.FloatField(null=True)
|
|
@@ -15,7 +14,7 @@ class LastImpRefill(QaReportModelMixin, models.Model):
|
|
|
15
14
|
|
|
16
15
|
next_appt_date = models.DateField(null=True)
|
|
17
16
|
|
|
18
|
-
visit_code = models.CharField(max_length=15,
|
|
17
|
+
visit_code = models.CharField(max_length=15, default="")
|
|
19
18
|
|
|
20
19
|
visit_code_sequence = models.IntegerField(null=True)
|
|
21
20
|
|
|
@@ -28,7 +27,7 @@ class LastImpRefill(QaReportModelMixin, models.Model):
|
|
|
28
27
|
def recreate_db_view(self, **kwargs):
|
|
29
28
|
raise NotImplementedError()
|
|
30
29
|
|
|
31
|
-
class Meta(QaReportModelMixin.Meta):
|
|
30
|
+
class Meta(QaReportModelMixin.Meta): # noqa: DJ012
|
|
32
31
|
verbose_name = "Last IMP Refill"
|
|
33
32
|
verbose_name_plural = "Last IMP Refills"
|
|
34
33
|
default_permissions = qa_reports_permissions
|
meta_reports/pdf_report.py
CHANGED
|
@@ -20,7 +20,7 @@ def get_weight_for_timepoint(subject_identifier=None, reference_dt=None):
|
|
|
20
20
|
|
|
21
21
|
|
|
22
22
|
class MetaCrfPdfReport(CrfPdfReport):
|
|
23
|
-
logo_data = {
|
|
23
|
+
logo_data = { # noqa: RUF012
|
|
24
24
|
"app_label": "meta_edc",
|
|
25
25
|
"filename": "meta_logo.png",
|
|
26
26
|
"first_page": (4.0 * cm, 0.83 * cm),
|
|
@@ -34,7 +34,7 @@ class MetaCrfPdfReport(CrfPdfReport):
|
|
|
34
34
|
subject_identifier=self.subject_identifier
|
|
35
35
|
).get_drug_assignment_display()
|
|
36
36
|
|
|
37
|
-
def draw_demographics(self, story, **kwargs):
|
|
37
|
+
def draw_demographics(self, story, **kwargs): # noqa: ARG002
|
|
38
38
|
model_obj = getattr(self, self.model_attr)
|
|
39
39
|
weight = get_weight_for_timepoint(
|
|
40
40
|
subject_identifier=self.subject_identifier,
|
meta_reports/tasks.py
CHANGED
|
@@ -3,7 +3,7 @@ from celery import shared_task
|
|
|
3
3
|
|
|
4
4
|
@shared_task
|
|
5
5
|
def update_endpoints_table(subject_identifiers: list[str] | None = None):
|
|
6
|
-
from meta_analytics.dataframes import GlucoseEndpointsByDate
|
|
6
|
+
from meta_analytics.dataframes import GlucoseEndpointsByDate # noqa: PLC0415
|
|
7
7
|
|
|
8
8
|
if len(subject_identifiers) > 5:
|
|
9
9
|
cls = GlucoseEndpointsByDate()
|
meta_screening/admin/__init__.py
CHANGED
|
@@ -3,3 +3,11 @@ from .screening_part_three_admin import ScreeningPartThreeAdmin
|
|
|
3
3
|
from .screening_part_two_admin import ScreeningPartTwoAdmin
|
|
4
4
|
from .subject_refusal_admin import SubjectRefusalAdmin
|
|
5
5
|
from .subject_screening_admin import SubjectScreeningAdmin
|
|
6
|
+
|
|
7
|
+
__all__ = [
|
|
8
|
+
"ScreeningPartOneAdmin",
|
|
9
|
+
"ScreeningPartThreeAdmin",
|
|
10
|
+
"ScreeningPartTwoAdmin",
|
|
11
|
+
"SubjectRefusalAdmin",
|
|
12
|
+
"SubjectScreeningAdmin",
|
|
13
|
+
]
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
from typing import Tuple
|
|
2
1
|
|
|
3
2
|
from django.utils.safestring import mark_safe
|
|
4
3
|
|
|
@@ -20,7 +19,7 @@ from ..forms.field_lists import (
|
|
|
20
19
|
)
|
|
21
20
|
|
|
22
21
|
|
|
23
|
-
def get_part_one_fieldset(collapse=None) ->
|
|
22
|
+
def get_part_one_fieldset(collapse=None) -> tuple[str, dict]:
|
|
24
23
|
dct = {
|
|
25
24
|
"description": mark_safe( # nosec B308
|
|
26
25
|
"To be completed by the <u>study clinician</u> or the "
|
|
@@ -33,7 +32,7 @@ def get_part_one_fieldset(collapse=None) -> Tuple[str, dict]:
|
|
|
33
32
|
return "Part 1", dct
|
|
34
33
|
|
|
35
34
|
|
|
36
|
-
def get_part_two_fieldset(collapse=None) ->
|
|
35
|
+
def get_part_two_fieldset(collapse=None) -> tuple[str, dict]:
|
|
37
36
|
dct = {
|
|
38
37
|
"description": mark_safe( # nosec B308
|
|
39
38
|
"To be completed by the <u>study clinician</u> or the "
|
|
@@ -48,7 +47,7 @@ def get_part_two_fieldset(collapse=None) -> Tuple[str, dict]:
|
|
|
48
47
|
|
|
49
48
|
def get_part_three_fieldset(
|
|
50
49
|
collapse=None,
|
|
51
|
-
) ->
|
|
50
|
+
) -> tuple[str, dict]:
|
|
52
51
|
dct = {
|
|
53
52
|
"description": mark_safe( # nosec B308
|
|
54
53
|
"To be completed by the <u>study clinician</u>"
|
|
@@ -67,7 +66,7 @@ def get_part_three_glucose_fieldset(collapse=None):
|
|
|
67
66
|
return "Part 3c: Glucose Measurements (FBG / OGTT)", dct
|
|
68
67
|
|
|
69
68
|
|
|
70
|
-
def get_part_three_repeat_glucose_fieldset(collapse=None) ->
|
|
69
|
+
def get_part_three_repeat_glucose_fieldset(collapse=None) -> tuple[str, dict]:
|
|
71
70
|
fields = [
|
|
72
71
|
"repeat_glucose_performed",
|
|
73
72
|
"repeat_fasting",
|
|
@@ -87,47 +86,47 @@ def get_part_three_repeat_glucose_fieldset(collapse=None) -> Tuple[str, dict]:
|
|
|
87
86
|
return "Part 3d: Repeat Glucose Measurements (FBG / OGTT)", dct
|
|
88
87
|
|
|
89
88
|
|
|
90
|
-
def get_part_three_other_fieldset(collapse=None) ->
|
|
89
|
+
def get_part_three_other_fieldset(collapse=None) -> tuple[str, dict]:
|
|
91
90
|
dct = {"fields": part_three_other_fields}
|
|
92
91
|
if collapse:
|
|
93
92
|
dct.update(classes=("collapse",))
|
|
94
93
|
return "Part 3e: Creatinine / HbA1c", dct
|
|
95
94
|
|
|
96
95
|
|
|
97
|
-
def get_part_three_creatinine_fieldset(collapse=None) ->
|
|
96
|
+
def get_part_three_creatinine_fieldset(collapse=None) -> tuple[str, dict]:
|
|
98
97
|
dct = {"fields": part_three_creatinine_fields}
|
|
99
98
|
if collapse:
|
|
100
99
|
dct.update(classes=("collapse",))
|
|
101
100
|
return "Part 3e: Creatinine", dct
|
|
102
101
|
|
|
103
102
|
|
|
104
|
-
def get_part_three_hba1c_fieldset(collapse=None) ->
|
|
103
|
+
def get_part_three_hba1c_fieldset(collapse=None) -> tuple[str, dict]:
|
|
105
104
|
dct = {"fields": part_three_hba1c_fields}
|
|
106
105
|
if collapse:
|
|
107
106
|
dct.update(classes=("collapse",))
|
|
108
107
|
return "Part 3f: HbA1c", dct
|
|
109
108
|
|
|
110
109
|
|
|
111
|
-
def get_part_three_report_datetime_fieldset() ->
|
|
110
|
+
def get_part_three_report_datetime_fieldset() -> tuple[str, dict]:
|
|
112
111
|
dct = {"fields": ["part_three_report_datetime"]}
|
|
113
112
|
return "Part 3", dct
|
|
114
113
|
|
|
115
114
|
|
|
116
|
-
def get_part_three_vitals_fieldset(collapse=None) ->
|
|
115
|
+
def get_part_three_vitals_fieldset(collapse=None) -> tuple[str, dict]:
|
|
117
116
|
dct = {"fields": part_three_vitals_fields}
|
|
118
117
|
if collapse:
|
|
119
118
|
dct.update(classes=("collapse",))
|
|
120
119
|
return "Part 3a: Vitals", dct
|
|
121
120
|
|
|
122
121
|
|
|
123
|
-
def get_part_three_pregnancy_fieldset(collapse=None) ->
|
|
122
|
+
def get_part_three_pregnancy_fieldset(collapse=None) -> tuple[str, dict]:
|
|
124
123
|
dct = {"fields": part_three_pregnancy_fields}
|
|
125
124
|
if collapse:
|
|
126
125
|
dct.update(classes=("collapse",))
|
|
127
126
|
return "Part 3b: Pregnancy", dct
|
|
128
127
|
|
|
129
128
|
|
|
130
|
-
def get_p3_screening_appt_update_fields(collapse=None) ->
|
|
129
|
+
def get_p3_screening_appt_update_fields(collapse=None) -> tuple[str, dict]:
|
|
131
130
|
dct = {
|
|
132
131
|
"description": mark_safe( # nosec B308
|
|
133
132
|
'<span style="color:orange;font-weight:bold">IMPORTANT:</span>'
|
|
@@ -144,14 +143,14 @@ def get_p3_screening_appt_update_fields(collapse=None) -> Tuple[str, dict]:
|
|
|
144
143
|
return "Part 3 screening appointment update", dct
|
|
145
144
|
|
|
146
145
|
|
|
147
|
-
comments_fieldset:
|
|
146
|
+
comments_fieldset: tuple[str, dict] = (
|
|
148
147
|
"Additional Comments",
|
|
149
148
|
{
|
|
150
149
|
"fields": (*part_three_comment_fields,),
|
|
151
150
|
},
|
|
152
151
|
)
|
|
153
152
|
|
|
154
|
-
calculated_values_fieldset:
|
|
153
|
+
calculated_values_fieldset: tuple[str, dict] = (
|
|
155
154
|
"Calculated values",
|
|
156
155
|
{
|
|
157
156
|
"classes": ("collapse",),
|
|
@@ -11,13 +11,13 @@ class EligibilityPending(admin.SimpleListFilter):
|
|
|
11
11
|
|
|
12
12
|
parameter_name = "eligibility_pending"
|
|
13
13
|
|
|
14
|
-
def lookups(self, request, model_admin):
|
|
14
|
+
def lookups(self, request, model_admin): # noqa: ARG002
|
|
15
15
|
return (
|
|
16
16
|
(PENDING, "Pending"),
|
|
17
17
|
(PENDING_REPEAT, "Pending repeat GLU"),
|
|
18
18
|
)
|
|
19
19
|
|
|
20
|
-
def queryset(self, request, queryset):
|
|
20
|
+
def queryset(self, request, queryset): # noqa: ARG002
|
|
21
21
|
if self.value() == PENDING_REPEAT:
|
|
22
22
|
return queryset.filter(
|
|
23
23
|
eligible_part_one=YES,
|
|
@@ -35,6 +35,7 @@ class EligibilityPending(admin.SimpleListFilter):
|
|
|
35
35
|
p3_ltfu=NOT_APPLICABLE,
|
|
36
36
|
part_three_report_datetime__isnull=True,
|
|
37
37
|
)
|
|
38
|
+
return queryset
|
|
38
39
|
|
|
39
40
|
|
|
40
41
|
class P3LtfuListFilter(admin.SimpleListFilter):
|
|
@@ -42,13 +43,13 @@ class P3LtfuListFilter(admin.SimpleListFilter):
|
|
|
42
43
|
|
|
43
44
|
parameter_name = "p3_ltfu_custom"
|
|
44
45
|
|
|
45
|
-
def lookups(self, request, model_admin):
|
|
46
|
+
def lookups(self, request, model_admin): # noqa: ARG002
|
|
46
47
|
return (
|
|
47
48
|
(YES, "Yes"),
|
|
48
49
|
(NO, "No, lost contact"),
|
|
49
50
|
)
|
|
50
51
|
|
|
51
|
-
def queryset(self, request, queryset):
|
|
52
|
+
def queryset(self, request, queryset): # noqa: ARG002
|
|
52
53
|
if self.value() == YES:
|
|
53
54
|
return queryset.filter(
|
|
54
55
|
eligible_part_one=YES,
|
|
@@ -69,6 +70,7 @@ class P3LtfuListFilter(admin.SimpleListFilter):
|
|
|
69
70
|
| Q(eligible_part_two=TBD)
|
|
70
71
|
| Q(eligible_part_three=TBD)
|
|
71
72
|
)
|
|
73
|
+
return queryset
|
|
72
74
|
|
|
73
75
|
|
|
74
76
|
class P3ApptListFilter(AppointmentListFilter):
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
from typing import Tuple
|
|
2
1
|
|
|
3
2
|
from django.contrib import admin
|
|
4
3
|
from django_audit_fields.admin import audit_fieldset_tuple
|
|
@@ -35,7 +34,7 @@ class ScreeningPartOneAdmin(SiteModelAdminMixin, SubjectScreeningAdmin):
|
|
|
35
34
|
|
|
36
35
|
fieldsets = get_fieldsets()
|
|
37
36
|
|
|
38
|
-
readonly_fields:
|
|
37
|
+
readonly_fields: tuple[str, ...] = (
|
|
39
38
|
*part_two_fields,
|
|
40
39
|
*part_three_fields,
|
|
41
40
|
*calculated_fields,
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
from copy import deepcopy
|
|
2
|
-
from typing import Tuple
|
|
3
2
|
|
|
4
3
|
from django.contrib import admin
|
|
5
4
|
from django_audit_fields.admin import audit_fieldset_tuple
|
|
@@ -30,7 +29,7 @@ from .list_filters import EligibilityPending, P3ApptListFilter, P3LtfuListFilter
|
|
|
30
29
|
from .subject_screening_admin import SubjectScreeningAdmin
|
|
31
30
|
|
|
32
31
|
|
|
33
|
-
def get_part_two_fieldset_without_contact_number() ->
|
|
32
|
+
def get_part_two_fieldset_without_contact_number() -> tuple[str, dict]:
|
|
34
33
|
"""Remove contact number from the part 2 fields"""
|
|
35
34
|
part_two_name, part_two_dct = get_part_two_fieldset(collapse=True)
|
|
36
35
|
part_two_dct = deepcopy(part_two_dct)
|
|
@@ -76,7 +75,7 @@ class ScreeningPartThreeAdmin(SiteModelAdminMixin, SubjectScreeningAdmin):
|
|
|
76
75
|
"refused",
|
|
77
76
|
)
|
|
78
77
|
|
|
79
|
-
readonly_fields:
|
|
78
|
+
readonly_fields: tuple[str, ...] = (
|
|
80
79
|
*part_one_fields,
|
|
81
80
|
*(f for f in part_two_fields if f != "contact_number"),
|
|
82
81
|
*calculated_fields,
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
from typing import Tuple
|
|
2
|
-
|
|
3
1
|
from django.contrib import admin
|
|
4
2
|
from django_audit_fields.admin import audit_fieldset_tuple
|
|
5
3
|
from edc_sites.admin import SiteModelAdminMixin
|
|
@@ -21,12 +19,12 @@ from .fieldsets import (
|
|
|
21
19
|
from .subject_screening_admin import SubjectScreeningAdmin
|
|
22
20
|
|
|
23
21
|
|
|
24
|
-
def get_fieldsets() ->
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
22
|
+
def get_fieldsets() -> tuple[
|
|
23
|
+
tuple[str, dict],
|
|
24
|
+
tuple[str, dict],
|
|
25
|
+
tuple[str, dict],
|
|
26
|
+
tuple[str, dict],
|
|
27
|
+
tuple[str, dict],
|
|
30
28
|
]:
|
|
31
29
|
return (
|
|
32
30
|
get_part_one_fieldset(collapse=True),
|
|
@@ -39,12 +37,11 @@ def get_fieldsets() -> Tuple[
|
|
|
39
37
|
|
|
40
38
|
@admin.register(ScreeningPartTwo, site=meta_screening_admin)
|
|
41
39
|
class ScreeningPartTwoAdmin(SiteModelAdminMixin, SubjectScreeningAdmin):
|
|
42
|
-
|
|
43
40
|
form = ScreeningPartTwoForm
|
|
44
41
|
|
|
45
42
|
fieldsets = get_fieldsets()
|
|
46
43
|
|
|
47
|
-
readonly_fields:
|
|
44
|
+
readonly_fields: tuple[str, ...] = (
|
|
48
45
|
*part_one_fields,
|
|
49
46
|
*part_three_fields,
|
|
50
47
|
*calculated_fields,
|
|
@@ -17,7 +17,7 @@ class SubjectRefusalAdmin(
|
|
|
17
17
|
):
|
|
18
18
|
form = SubjectRefusalForm
|
|
19
19
|
|
|
20
|
-
autocomplete_fields =
|
|
20
|
+
autocomplete_fields = ("subject_screening",)
|
|
21
21
|
|
|
22
22
|
post_url_on_delete_name = "screening_listboard_url"
|
|
23
23
|
subject_listboard_url_name = "screening_listboard_url"
|
|
@@ -54,7 +54,7 @@ class SubjectRefusalAdmin(
|
|
|
54
54
|
"subject_screening__initials",
|
|
55
55
|
)
|
|
56
56
|
|
|
57
|
-
radio_fields = {"reason": admin.VERTICAL}
|
|
57
|
+
radio_fields = {"reason": admin.VERTICAL} # noqa: RUF012
|
|
58
58
|
|
|
59
59
|
def get_subject_dashboard_url_kwargs(self, obj):
|
|
60
60
|
return dict(screening_identifier=obj.screening_identifier)
|
|
@@ -69,5 +69,7 @@ class SubjectRefusalAdmin(
|
|
|
69
69
|
if callable(super().view_on_site):
|
|
70
70
|
url = super().view_on_site(obj)
|
|
71
71
|
else:
|
|
72
|
-
raise NoReverseMatch(
|
|
72
|
+
raise NoReverseMatch(
|
|
73
|
+
f"{e}. See subject_dashboard_url_name for {self!r}."
|
|
74
|
+
) from e
|
|
73
75
|
return url
|
|
@@ -97,7 +97,7 @@ class SubjectScreeningAdmin(ModelAdminSubjectDashboardMixin, SimpleHistoryAdmin)
|
|
|
97
97
|
"inclusion_d",
|
|
98
98
|
)
|
|
99
99
|
|
|
100
|
-
radio_fields = {
|
|
100
|
+
radio_fields = { # noqa: RUF012
|
|
101
101
|
"acute_condition": admin.VERTICAL,
|
|
102
102
|
"acute_metabolic_acidosis": admin.VERTICAL,
|
|
103
103
|
"advised_to_fast": admin.VERTICAL,
|
|
@@ -145,11 +145,11 @@ class SubjectScreeningAdmin(ModelAdminSubjectDashboardMixin, SimpleHistoryAdmin)
|
|
|
145
145
|
"vl_undetectable": admin.VERTICAL,
|
|
146
146
|
}
|
|
147
147
|
|
|
148
|
-
def post_url_on_delete_kwargs(self, request, obj):
|
|
148
|
+
def post_url_on_delete_kwargs(self, request, obj): # noqa: ARG002
|
|
149
149
|
return {}
|
|
150
150
|
|
|
151
151
|
# TODO: this is a hack!
|
|
152
|
-
def get_post_url_on_delete_name(self, request) -> str:
|
|
152
|
+
def get_post_url_on_delete_name(self, request) -> str: # noqa: ARG002
|
|
153
153
|
return url_names.get(self.post_url_on_delete_name)
|
|
154
154
|
|
|
155
155
|
@staticmethod
|
|
@@ -163,7 +163,7 @@ class SubjectScreeningAdmin(ModelAdminSubjectDashboardMixin, SimpleHistoryAdmin)
|
|
|
163
163
|
data.append(f"Contact #: {obj.contact_number or '--'}")
|
|
164
164
|
return format_html(
|
|
165
165
|
"{}",
|
|
166
|
-
mark_safe("<BR>".join(data)), #
|
|
166
|
+
mark_safe("<BR>".join(data)), # noqa: S308
|
|
167
167
|
)
|
|
168
168
|
|
|
169
169
|
def reasons(self, obj=None):
|
meta_screening/baker_recipes.py
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
from dateutil.relativedelta import relativedelta
|
|
2
2
|
from django.contrib.sites.models import Site
|
|
3
|
-
from
|
|
3
|
+
from django.utils import timezone
|
|
4
|
+
from edc_constants.constants import BLACK, FEMALE, NO, NOT_APPLICABLE, NULL_STRING, YES
|
|
4
5
|
from edc_reportable.units import MILLIGRAMS_PER_DECILITER, MILLIMOLES_PER_LITER
|
|
5
|
-
from edc_utils import get_utcnow
|
|
6
6
|
from faker import Faker
|
|
7
7
|
from model_bakery.recipe import Recipe
|
|
8
8
|
|
|
@@ -13,11 +13,11 @@ fake = Faker()
|
|
|
13
13
|
|
|
14
14
|
subjectscreening = Recipe(
|
|
15
15
|
SubjectScreening,
|
|
16
|
-
report_datetime=
|
|
16
|
+
report_datetime=timezone.now() - relativedelta(days=1),
|
|
17
17
|
screening_consent=YES,
|
|
18
18
|
hospital_identifier="111",
|
|
19
19
|
initials="ZZ",
|
|
20
|
-
subject_identifier=
|
|
20
|
+
subject_identifier=NULL_STRING,
|
|
21
21
|
gender=FEMALE,
|
|
22
22
|
age_in_years=40,
|
|
23
23
|
ethnicity=BLACK,
|
|
@@ -29,7 +29,7 @@ subjectscreening = Recipe(
|
|
|
29
29
|
staying_nearby_12=YES,
|
|
30
30
|
pregnant=NO,
|
|
31
31
|
site=Site.objects.get_current(),
|
|
32
|
-
part_two_report_datetime=
|
|
32
|
+
part_two_report_datetime=timezone.now() - relativedelta(days=1),
|
|
33
33
|
congestive_heart_failure=NO,
|
|
34
34
|
liver_disease=NO,
|
|
35
35
|
alcoholism=NO,
|
|
@@ -39,8 +39,8 @@ subjectscreening = Recipe(
|
|
|
39
39
|
acute_condition=NO,
|
|
40
40
|
metformin_sensitivity=NO,
|
|
41
41
|
advised_to_fast=YES,
|
|
42
|
-
appt_datetime=
|
|
43
|
-
part_three_report_datetime=
|
|
42
|
+
appt_datetime=timezone.now() + relativedelta(days=1),
|
|
43
|
+
part_three_report_datetime=timezone.now(),
|
|
44
44
|
weight=65,
|
|
45
45
|
height=120,
|
|
46
46
|
fasting=YES,
|
|
@@ -51,8 +51,8 @@ subjectscreening = Recipe(
|
|
|
51
51
|
creatinine_units=MILLIGRAMS_PER_DECILITER,
|
|
52
52
|
fbg_value=6.9,
|
|
53
53
|
fbg_units=MILLIMOLES_PER_LITER,
|
|
54
|
-
fbg_datetime=
|
|
55
|
-
ogtt_base_datetime=
|
|
54
|
+
fbg_datetime=timezone.now(),
|
|
55
|
+
ogtt_base_datetime=timezone.now(),
|
|
56
56
|
unsuitable_for_study=NO,
|
|
57
57
|
unsuitable_agreed=NOT_APPLICABLE,
|
|
58
58
|
vl_undetectable=YES,
|
|
@@ -6,3 +6,12 @@ from .eligibility import (
|
|
|
6
6
|
from .eligibility_part_one import EligibilityPartOne
|
|
7
7
|
from .eligibility_part_three import EligibilityPartThreePhaseThree
|
|
8
8
|
from .eligibility_part_two import EligibilityPartTwo
|
|
9
|
+
|
|
10
|
+
__all__ = [
|
|
11
|
+
"EligibilityPartOne",
|
|
12
|
+
"EligibilityPartThreePhaseThree",
|
|
13
|
+
"EligibilityPartTwo",
|
|
14
|
+
"MetaEligibility",
|
|
15
|
+
"SubjectScreeningEligibilityError",
|
|
16
|
+
"get_display_label",
|
|
17
|
+
]
|
|
@@ -16,7 +16,7 @@ class SubjectScreeningEligibilityError(Exception):
|
|
|
16
16
|
pass
|
|
17
17
|
|
|
18
18
|
|
|
19
|
-
def get_eligible_as_word(
|
|
19
|
+
def get_eligible_as_word( # noqa: PLR0913
|
|
20
20
|
obj=None,
|
|
21
21
|
eligible_part_one=None,
|
|
22
22
|
eligible_part_two=None,
|
|
@@ -90,8 +90,8 @@ class MetaEligibility:
|
|
|
90
90
|
|
|
91
91
|
"""
|
|
92
92
|
|
|
93
|
-
eligibility_values =
|
|
94
|
-
default_options = dict(
|
|
93
|
+
eligibility_values = (YES, NO, TBD)
|
|
94
|
+
default_options = dict( # noqa: RUF012
|
|
95
95
|
eligible_value_default=TBD,
|
|
96
96
|
eligible_values_list=[YES, NO, TBD],
|
|
97
97
|
is_eligible_value=YES,
|
|
@@ -99,8 +99,8 @@ class MetaEligibility:
|
|
|
99
99
|
|
|
100
100
|
def __init__(
|
|
101
101
|
self,
|
|
102
|
-
model_obj: models.Model = None,
|
|
103
|
-
defaults: dict = None,
|
|
102
|
+
model_obj: models.Model | None = None,
|
|
103
|
+
defaults: dict | None = None,
|
|
104
104
|
update_model=None,
|
|
105
105
|
):
|
|
106
106
|
self.part_one = None
|
|
@@ -162,7 +162,7 @@ class MetaEligibility:
|
|
|
162
162
|
@property
|
|
163
163
|
def is_eligible(self: Any) -> bool:
|
|
164
164
|
"""Returns True if eligible else False"""
|
|
165
|
-
return
|
|
165
|
+
return self.eligible == YES
|
|
166
166
|
|
|
167
167
|
def check_eligibility_values_or_raise(self: Any):
|
|
168
168
|
for response in [
|
|
@@ -207,7 +207,7 @@ class MetaEligibility:
|
|
|
207
207
|
)
|
|
208
208
|
else:
|
|
209
209
|
status_str = format_html(
|
|
210
|
-
"P1: {p1_eligible}<BR>
|
|
210
|
+
"P1: {p1_eligible}<BR>P2: {p2_eligible}<BR>P3: {p3_eligible}<BR>",
|
|
211
211
|
p1_eligible=self.part_one.eligible.upper(),
|
|
212
212
|
p2_eligible=self.part_two.eligible.upper(),
|
|
213
213
|
p3_eligible=self.part_three.eligible.upper(),
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import contextlib
|
|
2
|
+
|
|
1
3
|
from edc_constants.constants import NEG, NO, NOT_APPLICABLE
|
|
2
4
|
from edc_egfr import EgfrCkdEpi
|
|
3
5
|
from edc_egfr.calculators import EgfrCalculatorError
|
|
@@ -37,7 +39,7 @@ class BaseEligibilityPartThree(ScreeningEligibility):
|
|
|
37
39
|
def assess_eligibility(self) -> None:
|
|
38
40
|
if self.weight and self.height:
|
|
39
41
|
self.bmi = calculate_bmi(weight_kg=self.weight, height_cm=self.height)
|
|
40
|
-
|
|
42
|
+
with contextlib.suppress(EgfrCalculatorError):
|
|
41
43
|
self.calculated_egfr_value = EgfrCkdEpi(
|
|
42
44
|
gender=self.model_obj.gender,
|
|
43
45
|
age_in_years=self.model_obj.age_in_years,
|
|
@@ -45,8 +47,6 @@ class BaseEligibilityPartThree(ScreeningEligibility):
|
|
|
45
47
|
creatinine_value=self.model_obj.creatinine_value,
|
|
46
48
|
creatinine_units=self.model_obj.creatinine_units,
|
|
47
49
|
).value
|
|
48
|
-
except EgfrCalculatorError:
|
|
49
|
-
pass
|
|
50
50
|
|
|
51
51
|
def set_fld_attrs_on_model(self) -> None:
|
|
52
52
|
self.model_obj.converted_creatinine_value = self.converted_creatinine_value
|
|
@@ -89,7 +89,7 @@ class BaseEligibilityPartThree(ScreeningEligibility):
|
|
|
89
89
|
units_to=MICROMOLES_PER_LITER,
|
|
90
90
|
)
|
|
91
91
|
except ConversionNotHandled as e:
|
|
92
|
-
raise ConversionNotHandled(f"Creatinine. {e}")
|
|
92
|
+
raise ConversionNotHandled(f"Creatinine. {e}") from e
|
|
93
93
|
if value and float(value) > 999999.9999:
|
|
94
94
|
raise ConversionNotHandled("Creatinine value is absurd.")
|
|
95
95
|
return value
|
|
@@ -106,7 +106,7 @@ class BaseEligibilityPartThree(ScreeningEligibility):
|
|
|
106
106
|
units_to=MILLIMOLES_PER_LITER,
|
|
107
107
|
)
|
|
108
108
|
except ConversionNotHandled as e:
|
|
109
|
-
raise ConversionNotHandled(f"FBG. {e}")
|
|
109
|
+
raise ConversionNotHandled(f"FBG. {e}") from e
|
|
110
110
|
return value
|
|
111
111
|
|
|
112
112
|
@property
|
|
@@ -121,7 +121,7 @@ class BaseEligibilityPartThree(ScreeningEligibility):
|
|
|
121
121
|
units_to=MILLIMOLES_PER_LITER,
|
|
122
122
|
)
|
|
123
123
|
except ConversionNotHandled as e:
|
|
124
|
-
raise ConversionNotHandled(f"FBG2. {e}")
|
|
124
|
+
raise ConversionNotHandled(f"FBG2. {e}") from e
|
|
125
125
|
return value
|
|
126
126
|
|
|
127
127
|
@property
|
|
@@ -136,7 +136,7 @@ class BaseEligibilityPartThree(ScreeningEligibility):
|
|
|
136
136
|
units_to=MILLIMOLES_PER_LITER,
|
|
137
137
|
)
|
|
138
138
|
except ConversionNotHandled as e:
|
|
139
|
-
raise ConversionNotHandled(f"OGTT. {e}")
|
|
139
|
+
raise ConversionNotHandled(f"OGTT. {e}") from e
|
|
140
140
|
return value
|
|
141
141
|
|
|
142
142
|
@property
|
|
@@ -151,7 +151,7 @@ class BaseEligibilityPartThree(ScreeningEligibility):
|
|
|
151
151
|
units_to=MILLIMOLES_PER_LITER,
|
|
152
152
|
)
|
|
153
153
|
except ConversionNotHandled as e:
|
|
154
|
-
raise ConversionNotHandled(f"OGTT2. {e}")
|
|
154
|
+
raise ConversionNotHandled(f"OGTT2. {e}") from e
|
|
155
155
|
return value
|
|
156
156
|
|
|
157
157
|
def set_eligible_model_field(self):
|
|
@@ -52,20 +52,19 @@ class EligibilityPartThreePhaseThree(BaseEligibilityPartThree):
|
|
|
52
52
|
):
|
|
53
53
|
self.eligible = TBD
|
|
54
54
|
self.reasons_ineligible.update(fbg_ogtt_incomplete=FBG_OGTT_INCOMPLETE)
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
self.reasons_ineligible.update(hi_fbg=HI_FBG)
|
|
55
|
+
elif self.ogtt_category == PRE_DM:
|
|
56
|
+
self.eligible = YES
|
|
57
|
+
elif self.ogtt_category == DM:
|
|
58
|
+
self.eligible = NO
|
|
59
|
+
self.reasons_ineligible.update(hi_ogtt=HI_OGTT)
|
|
60
|
+
elif self.fbg_category == PRE_DM and self.ogtt_category == NORMAL:
|
|
61
|
+
self.eligible = YES
|
|
62
|
+
elif self.fbg_category == NORMAL and self.ogtt_category == NORMAL:
|
|
63
|
+
self.eligible = NO
|
|
64
|
+
self.reasons_ineligible.update(normal_fbg_ogtt=NORMAL_FBG_OGTT)
|
|
65
|
+
elif self.fbg_category == DM and self.ogtt_category == NORMAL:
|
|
66
|
+
self.eligible = NO
|
|
67
|
+
self.reasons_ineligible.update(hi_fbg=HI_FBG)
|
|
69
68
|
if self.calculated_egfr_value and self.calculated_egfr_value < 45.0:
|
|
70
69
|
self.reasons_ineligible.update(egfr_low=EGFR_LT_45)
|
|
71
70
|
self.eligible = NO
|
|
@@ -3,3 +3,11 @@ from .screening_part_three import ScreeningPartThreeFormValidator
|
|
|
3
3
|
from .screening_part_two import ScreeningPartTwoFormValidator
|
|
4
4
|
from .subject_refusal import SubjectRefusalFormValidator
|
|
5
5
|
from .subject_screening import SubjectScreeningFormValidator
|
|
6
|
+
|
|
7
|
+
__all__ = [
|
|
8
|
+
"ScreeningPartOneFormValidator",
|
|
9
|
+
"ScreeningPartThreeFormValidator",
|
|
10
|
+
"ScreeningPartTwoFormValidator",
|
|
11
|
+
"SubjectRefusalFormValidator",
|
|
12
|
+
"SubjectScreeningFormValidator",
|
|
13
|
+
]
|
meta_screening/forms/__init__.py
CHANGED
|
@@ -16,3 +16,23 @@ from .screening_part_three_form import ScreeningPartThreeForm
|
|
|
16
16
|
from .screening_part_two_form import ScreeningPartTwoForm
|
|
17
17
|
from .subject_refusal_form import SubjectRefusalForm
|
|
18
18
|
from .subject_screening_form import SubjectScreeningForm
|
|
19
|
+
|
|
20
|
+
__all__ = [
|
|
21
|
+
"ScreeningPartOneForm",
|
|
22
|
+
"ScreeningPartThreeForm",
|
|
23
|
+
"ScreeningPartTwoForm",
|
|
24
|
+
"SubjectRefusalForm",
|
|
25
|
+
"SubjectScreeningForm",
|
|
26
|
+
"calculated_fields",
|
|
27
|
+
"field_lists",
|
|
28
|
+
"part_one_fields",
|
|
29
|
+
"part_three_comment_fields",
|
|
30
|
+
"part_three_fbg_fields",
|
|
31
|
+
"part_three_fields",
|
|
32
|
+
"part_three_glucose_fields",
|
|
33
|
+
"part_three_ogtt_fields",
|
|
34
|
+
"part_three_other_fields",
|
|
35
|
+
"part_three_pregnancy_fields",
|
|
36
|
+
"part_three_vitals_fields",
|
|
37
|
+
"part_two_fields",
|
|
38
|
+
]
|