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_ae/model_mixins/__init__.py
CHANGED
|
@@ -44,25 +44,25 @@ class AeReviewModelMixin(models.Model):
|
|
|
44
44
|
verbose_name="Relationship to study drug:",
|
|
45
45
|
max_length=25,
|
|
46
46
|
choices=STUDY_DRUG_RELATIONSHIP,
|
|
47
|
-
|
|
47
|
+
default="",
|
|
48
48
|
)
|
|
49
49
|
|
|
50
50
|
ae_expected = models.CharField(
|
|
51
51
|
verbose_name="Based on the protocol, do you believe this event is expected?",
|
|
52
52
|
max_length=25,
|
|
53
53
|
choices=YES_NO,
|
|
54
|
-
|
|
54
|
+
default="",
|
|
55
55
|
)
|
|
56
56
|
|
|
57
57
|
ae_action_required = models.CharField(
|
|
58
58
|
verbose_name="If unexpected, do you believe further action is required?",
|
|
59
59
|
max_length=25,
|
|
60
60
|
choices=YES_NO,
|
|
61
|
-
|
|
61
|
+
default="",
|
|
62
62
|
)
|
|
63
63
|
|
|
64
64
|
investigator_comments = models.TextField(
|
|
65
|
-
blank=True,
|
|
65
|
+
blank=True, default="", verbose_name="This Clinical Reviewer's comments:"
|
|
66
66
|
)
|
|
67
67
|
|
|
68
68
|
original_report_agreed = models.CharField(
|
|
@@ -70,11 +70,11 @@ class AeReviewModelMixin(models.Model):
|
|
|
70
70
|
max_length=15,
|
|
71
71
|
choices=YES_NO,
|
|
72
72
|
blank=False,
|
|
73
|
-
|
|
73
|
+
default="",
|
|
74
74
|
help_text="If No, explain in the narrative below",
|
|
75
75
|
)
|
|
76
76
|
|
|
77
|
-
narrative = models.TextField(verbose_name="Narrative", blank=True,
|
|
77
|
+
narrative = models.TextField(verbose_name="Narrative", blank=True, default="")
|
|
78
78
|
|
|
79
79
|
officials_notified = models.DateTimeField(
|
|
80
80
|
blank=True,
|
|
@@ -20,7 +20,7 @@ class DeathReportModelMixin(models.Model):
|
|
|
20
20
|
"If death occurred at hospital / clinic, please give name of the facility"
|
|
21
21
|
),
|
|
22
22
|
max_length=150,
|
|
23
|
-
|
|
23
|
+
default="",
|
|
24
24
|
blank=True,
|
|
25
25
|
)
|
|
26
26
|
|
|
@@ -46,14 +46,14 @@ class DeathReportModelMixin(models.Model):
|
|
|
46
46
|
related_name="secondary_cause_of_death",
|
|
47
47
|
verbose_name="Secondary cause of death",
|
|
48
48
|
help_text=(
|
|
49
|
-
"Secondary cause of death in the opinion of the
|
|
49
|
+
"Secondary cause of death in the opinion of the local study doctor and local PI"
|
|
50
50
|
),
|
|
51
51
|
)
|
|
52
52
|
|
|
53
53
|
secondary_cause_of_death_other = models.CharField(
|
|
54
54
|
max_length=100,
|
|
55
55
|
blank=True,
|
|
56
|
-
|
|
56
|
+
default="",
|
|
57
57
|
verbose_name='If "Other" above, please specify',
|
|
58
58
|
)
|
|
59
59
|
|
meta_ae/models/__init__.py
CHANGED
|
@@ -8,3 +8,16 @@ from .death_report import DeathReport
|
|
|
8
8
|
from .death_report_tmg import DeathReportTmg
|
|
9
9
|
from .death_report_tmg_second import DeathReportTmgSecond
|
|
10
10
|
from .hospitalization import Hospitalization
|
|
11
|
+
|
|
12
|
+
__all__ = [
|
|
13
|
+
"AeFollowup",
|
|
14
|
+
"AeInitial",
|
|
15
|
+
"AeLocalReview",
|
|
16
|
+
"AeSponsorReview",
|
|
17
|
+
"AeSusar",
|
|
18
|
+
"AeTmg",
|
|
19
|
+
"DeathReport",
|
|
20
|
+
"DeathReportTmg",
|
|
21
|
+
"DeathReportTmgSecond",
|
|
22
|
+
"Hospitalization",
|
|
23
|
+
]
|
|
@@ -15,7 +15,7 @@ class Hospitalization(
|
|
|
15
15
|
verbose_name = "Hospitalization"
|
|
16
16
|
verbose_name_plural = "Hospitalization"
|
|
17
17
|
indexes = (
|
|
18
|
-
HospitalizationModelMixin.Meta.indexes
|
|
19
|
-
|
|
20
|
-
|
|
18
|
+
*HospitalizationModelMixin.Meta.indexes,
|
|
19
|
+
*BaseUuidModel.Meta.indexes,
|
|
20
|
+
models.Index(fields=["subject_identifier", "site"]),
|
|
21
21
|
)
|
meta_ae/pdf_reports/__init__.py
CHANGED
meta_analytics/.DS_Store
ADDED
|
Binary file
|
|
@@ -20,3 +20,27 @@ from .utils import (
|
|
|
20
20
|
get_unique_subject_identifiers,
|
|
21
21
|
get_unique_visit_codes,
|
|
22
22
|
)
|
|
23
|
+
|
|
24
|
+
__all__ = [
|
|
25
|
+
"CASE_EOS",
|
|
26
|
+
"CASE_FBGS_WITH_FIRST_OGTT",
|
|
27
|
+
"CASE_FBGS_WITH_SECOND_OGTT",
|
|
28
|
+
"CASE_FBG_ONLY",
|
|
29
|
+
"CASE_OGTT",
|
|
30
|
+
"EndpointByDate",
|
|
31
|
+
"GlucoseEndpointsByDate",
|
|
32
|
+
"endpoint_cases",
|
|
33
|
+
"endpoint_columns",
|
|
34
|
+
"get_empty_endpoint_df",
|
|
35
|
+
"get_eos_df",
|
|
36
|
+
"get_glucose_df",
|
|
37
|
+
"get_glucose_fbg_df",
|
|
38
|
+
"get_glucose_fbg_ogtt_df",
|
|
39
|
+
"get_glucose_tested_only_df",
|
|
40
|
+
"get_last_imp_visits_df",
|
|
41
|
+
"get_screening_df",
|
|
42
|
+
"get_test_string",
|
|
43
|
+
"get_unique_subject_identifiers",
|
|
44
|
+
"get_unique_visit_codes",
|
|
45
|
+
"glucose_endpoints",
|
|
46
|
+
]
|
|
@@ -31,9 +31,8 @@ def get_eos_df() -> pd.DataFrame:
|
|
|
31
31
|
df_visit_grp["followup_days"] = (
|
|
32
32
|
df_visit_grp["visit_datetime"] - df_visit_grp["baseline_datetime"]
|
|
33
33
|
).dt.days
|
|
34
|
-
|
|
34
|
+
return df_eos.merge(
|
|
35
35
|
df_visit_grp[["subject_identifier", "followup_days"]],
|
|
36
36
|
on="subject_identifier",
|
|
37
37
|
how="left",
|
|
38
38
|
).reset_index(drop=True)
|
|
39
|
-
return df_eos
|
|
@@ -25,7 +25,9 @@ def get_glucose_df() -> pd.DataFrame:
|
|
|
25
25
|
["ogtt_value", "ogtt_units", "ogtt_datetime"],
|
|
26
26
|
] = [np.nan, None, pd.NaT]
|
|
27
27
|
df_glucose_fbg["source"] = "meta_subject.glucosefbg"
|
|
28
|
-
df_glucose_fbg =
|
|
28
|
+
df_glucose_fbg = df_glucose_fbg[
|
|
29
|
+
[col for col in df_glucose_fbg.columns if "site_id" not in col]
|
|
30
|
+
].merge(
|
|
29
31
|
subject_visit_df[
|
|
30
32
|
[
|
|
31
33
|
"subject_identifier",
|
|
@@ -36,7 +38,6 @@ def get_glucose_df() -> pd.DataFrame:
|
|
|
36
38
|
"subject_visit_id",
|
|
37
39
|
]
|
|
38
40
|
],
|
|
39
|
-
df_glucose_fbg[[col for col in df_glucose_fbg.columns if "site_id" not in col]],
|
|
40
41
|
on="subject_visit_id",
|
|
41
42
|
how="left",
|
|
42
43
|
)
|
|
@@ -50,7 +51,7 @@ def get_glucose_df() -> pd.DataFrame:
|
|
|
50
51
|
)
|
|
51
52
|
df_glucose["source"] = "meta_subject.glucose"
|
|
52
53
|
|
|
53
|
-
df_glucose =
|
|
54
|
+
df_glucose = df_glucose.merge(
|
|
54
55
|
subject_visit_df[
|
|
55
56
|
[
|
|
56
57
|
"subject_identifier",
|
|
@@ -85,8 +86,7 @@ def get_glucose_df() -> pd.DataFrame:
|
|
|
85
86
|
"revision",
|
|
86
87
|
"report_datetime",
|
|
87
88
|
]
|
|
88
|
-
df =
|
|
89
|
-
df_glucose[keep_cols],
|
|
89
|
+
df = df_glucose[keep_cols].merge(
|
|
90
90
|
df_glucose_fbg[keep_cols],
|
|
91
91
|
on="subject_visit_id",
|
|
92
92
|
how="outer",
|
|
@@ -136,7 +136,7 @@ def get_glucose_df() -> pd.DataFrame:
|
|
|
136
136
|
df["fgb_days"] = pd.to_numeric(df["fgb_days"], downcast="integer")
|
|
137
137
|
df["ogtt_days"] = pd.to_numeric(df["ogtt_days"], downcast="integer")
|
|
138
138
|
|
|
139
|
-
|
|
139
|
+
return (
|
|
140
140
|
df.query(
|
|
141
141
|
"offstudy_reason != 'Patient fulfilled late exclusion criteria "
|
|
142
142
|
"(due to abnormal blood values or raised blood pressure at enrolment'"
|
|
@@ -146,4 +146,3 @@ def get_glucose_df() -> pd.DataFrame:
|
|
|
146
146
|
.sort_values(by=["subject_identifier", "visit_code"])
|
|
147
147
|
.reset_index(drop=True)
|
|
148
148
|
)
|
|
149
|
-
return df
|
|
@@ -19,9 +19,8 @@ def get_glucose_fbg_df(subject_identifiers: list[str] | None = None) -> pd.DataF
|
|
|
19
19
|
subject_visit_model="meta_subject.subjectvisit",
|
|
20
20
|
)
|
|
21
21
|
df["source"] = "meta_subject.glucosefbg"
|
|
22
|
-
df.rename(columns={"fbg_fasting": "fasting"}
|
|
22
|
+
df = df.rename(columns={"fbg_fasting": "fasting"})
|
|
23
23
|
df.loc[(df["fasting"] == "fasting"), "fasting"] = YES
|
|
24
24
|
df.loc[(df["fasting"] == "non_fasting"), "fasting"] = NO
|
|
25
25
|
df = calculate_fasting_hrs(df)
|
|
26
|
-
|
|
27
|
-
return df
|
|
26
|
+
return df.reset_index(drop=True)
|
|
@@ -5,12 +5,12 @@ from django_pandas.io import read_frame
|
|
|
5
5
|
from edc_pdutils.dataframes import get_appointments, get_crf
|
|
6
6
|
|
|
7
7
|
|
|
8
|
-
class InvalidLotNumber(Exception):
|
|
8
|
+
class InvalidLotNumber(Exception): # noqa: N818
|
|
9
9
|
pass
|
|
10
10
|
|
|
11
11
|
|
|
12
12
|
def site_cond(df, site_id):
|
|
13
|
-
return (0 == 0) if not site_id else df.site_id == site_id
|
|
13
|
+
return (0 == 0) if not site_id else df.site_id == site_id # noqa: PLR0133
|
|
14
14
|
|
|
15
15
|
|
|
16
16
|
def get_last_imp_visits_df(
|
|
@@ -28,8 +28,8 @@ def get_last_imp_visits_df(
|
|
|
28
28
|
lot_number_model_cls = django_apps.get_model("meta_pharmacy.lotnumber")
|
|
29
29
|
try:
|
|
30
30
|
lot_obj = lot_number_model_cls.objects.get(lot_no=lot_no)
|
|
31
|
-
except ObjectDoesNotExist:
|
|
32
|
-
raise ObjectDoesNotExist("The lot number given is invalid")
|
|
31
|
+
except ObjectDoesNotExist as e:
|
|
32
|
+
raise ObjectDoesNotExist("The lot number given is invalid") from e
|
|
33
33
|
|
|
34
34
|
df_meds = get_crf(
|
|
35
35
|
"meta_subject.studymedication", subject_visit_model="meta_subject.subjectvisit"
|
|
@@ -100,5 +100,4 @@ def get_last_imp_visits_df(
|
|
|
100
100
|
# calculate days since the IMP visit
|
|
101
101
|
df_final["days_since"] = pd.to_datetime("today").normalize() - df_final.imp_visit_date
|
|
102
102
|
df_final["days_until"] = df_final.next_appt_datetime - pd.to_datetime("today").normalize()
|
|
103
|
-
|
|
104
|
-
return df_final
|
|
103
|
+
return df_final.reset_index()
|
|
@@ -11,7 +11,7 @@ class EndpointTdeltaError(Exception):
|
|
|
11
11
|
pass
|
|
12
12
|
|
|
13
13
|
|
|
14
|
-
class InvalidCaseList(Exception):
|
|
14
|
+
class InvalidCaseList(Exception): # noqa: N818
|
|
15
15
|
pass
|
|
16
16
|
|
|
17
17
|
|
|
@@ -68,42 +68,36 @@ class CaseData:
|
|
|
68
68
|
|
|
69
69
|
def case_two(self) -> bool:
|
|
70
70
|
""" "FBG >= 7 x 2, first OGTT<=11.1"""
|
|
71
|
-
|
|
71
|
+
return bool(
|
|
72
72
|
self.fbg_value >= self.fbg_threshold
|
|
73
73
|
and self.next_fbg_value >= self.fbg_threshold
|
|
74
74
|
and 0.0 < self.ogtt_value < self.ogtt_threshold
|
|
75
75
|
and self.fasted == YES
|
|
76
76
|
and self.next_fasted == YES
|
|
77
77
|
and (self.next_fbg_datetime.date() - self.fbg_datetime.date()).days > 6
|
|
78
|
-
)
|
|
79
|
-
return True
|
|
80
|
-
return False
|
|
78
|
+
)
|
|
81
79
|
|
|
82
80
|
def case_three(self) -> bool:
|
|
83
81
|
""" "FBG >= 7 x 2, second OGTT<=11.1"""
|
|
84
|
-
|
|
82
|
+
return bool(
|
|
85
83
|
self.fbg_value >= self.fbg_threshold
|
|
86
84
|
and self.next_fbg_value >= self.fbg_threshold
|
|
87
85
|
and 0.0 < self.next_ogtt_value < self.ogtt_threshold
|
|
88
86
|
and self.fasted == YES
|
|
89
87
|
and self.next_fasted == YES
|
|
90
88
|
and (self.next_fbg_datetime.date() - self.fbg_datetime.date()).days > 6
|
|
91
|
-
)
|
|
92
|
-
return True
|
|
93
|
-
return False
|
|
89
|
+
)
|
|
94
90
|
|
|
95
91
|
def case_two_reversed(self) -> bool:
|
|
96
92
|
"""Same as case 2, but with the previous FBG reading."""
|
|
97
|
-
|
|
93
|
+
return bool(
|
|
98
94
|
self.fbg_value >= self.fbg_threshold
|
|
99
95
|
and self.previous_fbg_value >= self.fbg_threshold
|
|
100
96
|
and 0.0 < self.previous_ogtt_value < self.ogtt_threshold
|
|
101
97
|
and self.fasted == YES
|
|
102
98
|
and self.previous_fasted == YES
|
|
103
99
|
and (self.fbg_datetime.date() - self.previous_fbg_datetime.date()).days > 6
|
|
104
|
-
)
|
|
105
|
-
return True
|
|
106
|
-
return False
|
|
100
|
+
)
|
|
107
101
|
|
|
108
102
|
|
|
109
103
|
class EndpointByDate:
|
|
@@ -132,8 +126,8 @@ class EndpointByDate:
|
|
|
132
126
|
def __init__(
|
|
133
127
|
self,
|
|
134
128
|
subject_df: pd.DataFrame = None,
|
|
135
|
-
fbg_threshhold: float = None,
|
|
136
|
-
ogtt_threshhold: float = None,
|
|
129
|
+
fbg_threshhold: float | None = None,
|
|
130
|
+
ogtt_threshhold: float | None = None,
|
|
137
131
|
):
|
|
138
132
|
self.row = None
|
|
139
133
|
self.index = None
|
|
@@ -148,16 +142,15 @@ class EndpointByDate:
|
|
|
148
142
|
if case_data.case_two():
|
|
149
143
|
self.endpoint_reached(index, case=2, fbg_datetime=case_data.next_fbg_datetime)
|
|
150
144
|
break
|
|
151
|
-
|
|
145
|
+
if case_data.case_three():
|
|
152
146
|
self.endpoint_reached(index, case=3, fbg_datetime=case_data.next_fbg_datetime)
|
|
153
147
|
break
|
|
154
|
-
|
|
148
|
+
if case_data.case_two_reversed():
|
|
155
149
|
self.endpoint_reached(index, case=2, fbg_datetime=case_data.fbg_datetime)
|
|
156
150
|
break
|
|
157
|
-
|
|
158
|
-
pass
|
|
151
|
+
pass
|
|
159
152
|
|
|
160
|
-
def endpoint_reached(self, index: int, case: int, fbg_datetime: pd.Timestamp):
|
|
153
|
+
def endpoint_reached(self, index: int, case: int, fbg_datetime: pd.Timestamp): # noqa: ARG002
|
|
161
154
|
"""Update the subject_df"""
|
|
162
155
|
self.subject_df.loc[self.subject_df["fbg_datetime"] == fbg_datetime, "endpoint"] = 1
|
|
163
156
|
self.subject_df["interval_in_days"] = np.nan
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import numpy as np
|
|
2
2
|
import pandas as pd
|
|
3
3
|
from django.apps import apps as django_apps
|
|
4
|
+
from django.utils import timezone
|
|
4
5
|
from edc_constants.constants import YES
|
|
5
|
-
from edc_utils import get_utcnow
|
|
6
6
|
|
|
7
7
|
from ..constants import (
|
|
8
8
|
CASE_EOS,
|
|
@@ -42,7 +42,7 @@ class GlucoseEndpointsByDate:
|
|
|
42
42
|
fbg_threshhold = 7.0
|
|
43
43
|
ogtt_threshhold = 11.1
|
|
44
44
|
endpoint_cls = EndpointByDate
|
|
45
|
-
keep_cols = [
|
|
45
|
+
keep_cols = [ # noqa: RUF012
|
|
46
46
|
"fasted",
|
|
47
47
|
"fasting_hrs",
|
|
48
48
|
"fbg_value",
|
|
@@ -64,7 +64,6 @@ class GlucoseEndpointsByDate:
|
|
|
64
64
|
def __init__(
|
|
65
65
|
self, subject_identifiers: list[str] | None = None, case_list: list[int] | None = None
|
|
66
66
|
):
|
|
67
|
-
|
|
68
67
|
self._glucose_fbg_df = pd.DataFrame()
|
|
69
68
|
self._glucose_fbg_ogtt_df = pd.DataFrame()
|
|
70
69
|
self.endpoint_only_df = pd.DataFrame()
|
|
@@ -93,7 +92,7 @@ class GlucoseEndpointsByDate:
|
|
|
93
92
|
def run(self):
|
|
94
93
|
self.process_by_ogtt_only()
|
|
95
94
|
subject_identifiers_df = get_unique_subject_identifiers(self.df)
|
|
96
|
-
for
|
|
95
|
+
for _, row in subject_identifiers_df.iterrows():
|
|
97
96
|
subject_df = self.get_subject_df(row["subject_identifier"])
|
|
98
97
|
subject_df = self.endpoint_cls(
|
|
99
98
|
subject_df=subject_df,
|
|
@@ -215,11 +214,12 @@ class GlucoseEndpointsByDate:
|
|
|
215
214
|
[col for col in subject_df if "value" in col]
|
|
216
215
|
].fillna(0.0)
|
|
217
216
|
|
|
218
|
-
|
|
219
|
-
return subject_df
|
|
217
|
+
return subject_df.reset_index(drop=True)
|
|
220
218
|
|
|
221
219
|
def check_endpoint_by_fbg_for_subject(
|
|
222
|
-
self,
|
|
220
|
+
self,
|
|
221
|
+
subject_df: pd.DataFrame,
|
|
222
|
+
case_list: list[int] | None = None, # noqa: ARG002
|
|
223
223
|
) -> pd.DataFrame:
|
|
224
224
|
endpoint = self.endpoint_cls(
|
|
225
225
|
subject_df=subject_df,
|
|
@@ -286,8 +286,7 @@ class GlucoseEndpointsByDate:
|
|
|
286
286
|
self.endpoint_only_df = pd.concat([df1, df2])
|
|
287
287
|
self.endpoint_only_df = self.endpoint_only_df.reset_index(drop=True)
|
|
288
288
|
|
|
289
|
-
self.df =
|
|
290
|
-
self.df,
|
|
289
|
+
self.df = self.df.merge(
|
|
291
290
|
self.endpoint_only_df[["subject_identifier", "visit_code", "endpoint"]],
|
|
292
291
|
on=["subject_identifier", "visit_code"],
|
|
293
292
|
how="left",
|
|
@@ -300,7 +299,7 @@ class GlucoseEndpointsByDate:
|
|
|
300
299
|
"""Write endpoint_only_df to the Endpoints model"""
|
|
301
300
|
df = self.endpoint_only_df
|
|
302
301
|
model = "meta_reports.endpoints"
|
|
303
|
-
now =
|
|
302
|
+
now = timezone.now()
|
|
304
303
|
model_cls = django_apps.get_model(model)
|
|
305
304
|
if self.subject_identifiers:
|
|
306
305
|
model_cls.objects.filter(subject_identifier__in=self.subject_identifiers).delete()
|
|
@@ -72,7 +72,7 @@ def get_screening_df(df: pd.DataFrame | None = None) -> pd.DataFrame:
|
|
|
72
72
|
# condition to include any glucose test
|
|
73
73
|
|
|
74
74
|
# has_dm fillna with unk
|
|
75
|
-
df["has_dm"] = df["has_dm"].apply(lambda x:
|
|
75
|
+
df["has_dm"] = df["has_dm"].apply(lambda x: x if x else "unk")
|
|
76
76
|
|
|
77
77
|
na = "Not applicable, subject is not eligible based on the criteria above"
|
|
78
78
|
df["already_fasted"] = df["already_fasted"].apply(lambda x: "N/A" if x == na else x)
|
|
@@ -117,13 +117,13 @@ def get_screening_df(df: pd.DataFrame | None = None) -> pd.DataFrame:
|
|
|
117
117
|
subject_identifiers = list(df["subject_identifier"])
|
|
118
118
|
qs_subject_visit = SubjectVisit.objects.filter(subject_identifier__in=subject_identifiers)
|
|
119
119
|
df_subject_visit = read_frame(qs_subject_visit)
|
|
120
|
-
df_subject_visit.rename(columns={"id": "subject_visit"}
|
|
120
|
+
df_subject_visit = df_subject_visit.rename(columns={"id": "subject_visit"})
|
|
121
121
|
qs_physical_exam = PhysicalExam.objects.filter(
|
|
122
122
|
subject_visit__subject_identifier__in=subject_identifiers
|
|
123
123
|
)
|
|
124
124
|
df_physical_exam = read_frame(qs_physical_exam)
|
|
125
125
|
# merge w/ subject visit to get subject_identifier
|
|
126
|
-
df_physical_exam =
|
|
126
|
+
df_physical_exam = df_physical_exam.merge(
|
|
127
127
|
df_physical_exam,
|
|
128
128
|
df_subject_visit[
|
|
129
129
|
["subject_visit", "subject_identifier", "visit_code", "visit_code_sequence"]
|
|
@@ -144,13 +144,11 @@ def get_screening_df(df: pd.DataFrame | None = None) -> pd.DataFrame:
|
|
|
144
144
|
["waist_circumference_baseline"]
|
|
145
145
|
].apply(pd.to_numeric)
|
|
146
146
|
# merge on subject_identifier with main DF
|
|
147
|
-
df =
|
|
148
|
-
df,
|
|
147
|
+
df = df.merge(
|
|
149
148
|
df_physical_exam[["subject_identifier", "waist_circumference_baseline"]],
|
|
150
149
|
on="subject_identifier",
|
|
151
150
|
how="left",
|
|
152
|
-
)
|
|
153
|
-
df.reset_index(drop=True, inplace=True)
|
|
151
|
+
).reset_index(drop=True)
|
|
154
152
|
# set waist_circumference=waist_circumference_baseline
|
|
155
153
|
# if `waist_circumference` is none and `waist_circumference_baseline` is not
|
|
156
154
|
df.loc[
|
|
@@ -159,6 +157,4 @@ def get_screening_df(df: pd.DataFrame | None = None) -> pd.DataFrame:
|
|
|
159
157
|
] = df["waist_circumference_baseline"]
|
|
160
158
|
|
|
161
159
|
# drop waist_circumference_baseline
|
|
162
|
-
df.drop(columns=["waist_circumference_baseline"]
|
|
163
|
-
|
|
164
|
-
return df
|
|
160
|
+
return df.drop(columns=["waist_circumference_baseline"])
|
|
@@ -37,16 +37,12 @@ def get_empty_endpoint_df() -> pd.DataFrame:
|
|
|
37
37
|
"endpoint",
|
|
38
38
|
"endpoint_type",
|
|
39
39
|
]
|
|
40
|
-
].apply(
|
|
41
|
-
pd.to_numeric
|
|
42
|
-
)
|
|
40
|
+
].apply(pd.to_numeric)
|
|
43
41
|
endpoint_df[
|
|
44
42
|
["baseline_datetime", "visit_datetime", "fbg_datetime", "offstudy_datetime"]
|
|
45
43
|
] = endpoint_df[
|
|
46
44
|
["baseline_datetime", "visit_datetime", "fbg_datetime", "offstudy_datetime"]
|
|
47
|
-
].apply(
|
|
48
|
-
pd.to_datetime
|
|
49
|
-
)
|
|
45
|
+
].apply(pd.to_datetime)
|
|
50
46
|
endpoint_df["visit_code"] = endpoint_df["visit_code"].astype(float)
|
|
51
47
|
return endpoint_df
|
|
52
48
|
|
|
@@ -56,8 +52,7 @@ def get_unique_visit_codes(df: pd.DataFrame) -> pd.DataFrame:
|
|
|
56
52
|
stats_df = stats_df.reset_index()
|
|
57
53
|
stats_df["visit_code"] = stats_df["visit_code"].astype(float)
|
|
58
54
|
stats_df = stats_df.sort_values(["visit_code"])
|
|
59
|
-
|
|
60
|
-
return stats_df
|
|
55
|
+
return stats_df.reset_index(drop=True)
|
|
61
56
|
|
|
62
57
|
|
|
63
58
|
def get_unique_subject_identifiers(df: pd.DataFrame) -> pd.DataFrame:
|
meta_analytics/get_tables.py
CHANGED
|
@@ -35,8 +35,7 @@ def get_tables() -> dict[str, Data]:
|
|
|
35
35
|
& (df_not_tested["eligible_part_two"] == "Yes")
|
|
36
36
|
)
|
|
37
37
|
]
|
|
38
|
-
df_not_tested.drop(df_not_eligible_p1p2.index
|
|
39
|
-
df_not_tested.drop(df_fbg.index, inplace=True)
|
|
38
|
+
df_not_tested = df_not_tested.drop(df_not_eligible_p1p2.index).drop(df_fbg.index)
|
|
40
39
|
|
|
41
40
|
df_stats = pd.DataFrame(
|
|
42
41
|
{
|
meta_consent/action_items.py
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
from edc_action_item import Action
|
|
1
|
+
from edc_action_item.action import Action
|
|
2
|
+
from edc_action_item.site_action_items import site_action_items
|
|
2
3
|
from edc_constants.constants import HIGH_PRIORITY
|
|
3
4
|
|
|
4
5
|
from .constants import CONSENT_V1_EXTENSION_ACTION, RECONSENT_ACTION
|
meta_consent/admin/__init__.py
CHANGED
|
@@ -1,3 +1,9 @@
|
|
|
1
1
|
from .subject_consent_admin import SubjectConsentAdmin
|
|
2
2
|
from .subject_consent_v1_admin import SubjectConsentV1Admin
|
|
3
3
|
from .subject_consent_v1_ext_admin import SubjectConsentV1ExtAdmin
|
|
4
|
+
|
|
5
|
+
__all__ = [
|
|
6
|
+
"SubjectConsentAdmin",
|
|
7
|
+
"SubjectConsentV1Admin",
|
|
8
|
+
"SubjectConsentV1ExtAdmin",
|
|
9
|
+
]
|
|
@@ -9,7 +9,7 @@ from meta_pharmacy.constants import METFORMIN
|
|
|
9
9
|
|
|
10
10
|
|
|
11
11
|
@admin.action(permissions=["view"], description="Create missing METFORMIN prescription")
|
|
12
|
-
def create_missing_metformin_rx(modeladmin, request, queryset):
|
|
12
|
+
def create_missing_metformin_rx(modeladmin, request, queryset): # noqa: ARG001
|
|
13
13
|
medication = Medication.objects.get(name=METFORMIN)
|
|
14
14
|
total = queryset.count()
|
|
15
15
|
subject_identifiers = queryset.values_list("subject_identifier", flat=True)
|
|
@@ -7,10 +7,10 @@ class AgreesListFilter(SimpleListFilter):
|
|
|
7
7
|
title = "Agrees"
|
|
8
8
|
parameter_name = "agrees"
|
|
9
9
|
|
|
10
|
-
def lookups(self, request, model_admin):
|
|
10
|
+
def lookups(self, request, model_admin): # noqa: ARG002
|
|
11
11
|
return YES_NO_NA
|
|
12
12
|
|
|
13
|
-
def queryset(self, request, queryset):
|
|
13
|
+
def queryset(self, request, queryset): # noqa: ARG002
|
|
14
14
|
qs = None
|
|
15
15
|
if self.value():
|
|
16
16
|
if self.value() == YES:
|
|
@@ -21,14 +21,13 @@ from ..models import SubjectConsent
|
|
|
21
21
|
|
|
22
22
|
|
|
23
23
|
class SubjectConsentModelAdminMixin:
|
|
24
|
-
|
|
25
24
|
form = SubjectConsentForm
|
|
26
25
|
|
|
27
|
-
actions =
|
|
26
|
+
actions = (
|
|
28
27
|
flag_as_verified_against_paper,
|
|
29
28
|
unflag_as_verified_against_paper,
|
|
30
29
|
"create_missing_metformin_rx",
|
|
31
|
-
|
|
30
|
+
)
|
|
32
31
|
|
|
33
32
|
fieldsets = (
|
|
34
33
|
(
|
|
@@ -73,7 +72,7 @@ class SubjectConsentModelAdminMixin:
|
|
|
73
72
|
|
|
74
73
|
search_fields = ("subject_identifier", "screening_identifier", "identity")
|
|
75
74
|
|
|
76
|
-
radio_fields = {
|
|
75
|
+
radio_fields = { # noqa: RUF012
|
|
77
76
|
"gender": admin.VERTICAL,
|
|
78
77
|
"assessment_score": admin.VERTICAL,
|
|
79
78
|
"consent_copy": admin.VERTICAL,
|
|
@@ -60,7 +60,7 @@ class SubjectConsentV1ExtAdmin(
|
|
|
60
60
|
AgreesListFilter,
|
|
61
61
|
)
|
|
62
62
|
|
|
63
|
-
radio_fields = {
|
|
63
|
+
radio_fields = { # noqa: RUF012
|
|
64
64
|
"agrees_to_extension": admin.VERTICAL,
|
|
65
65
|
"consent_reviewed": admin.VERTICAL,
|
|
66
66
|
"study_questions": admin.VERTICAL,
|
|
@@ -69,7 +69,7 @@ class SubjectConsentV1ExtAdmin(
|
|
|
69
69
|
"consent_copy": admin.VERTICAL,
|
|
70
70
|
}
|
|
71
71
|
|
|
72
|
-
def get_readonly_fields(self, request, obj=None) -> tuple[str, ...]:
|
|
72
|
+
def get_readonly_fields(self, request, obj=None) -> tuple[str, ...]: # noqa: ARG002
|
|
73
73
|
if obj:
|
|
74
74
|
return ("subject_consent",)
|
|
75
75
|
return ()
|