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
|
@@ -1,93 +0,0 @@
|
|
|
1
|
-
from dateutil.relativedelta import relativedelta
|
|
2
|
-
from django.core.exceptions import ObjectDoesNotExist
|
|
3
|
-
from django.test import TestCase
|
|
4
|
-
from edc_appointment.models import Appointment
|
|
5
|
-
from edc_constants.constants import FEMALE, NO, YES
|
|
6
|
-
from edc_utils import get_utcnow
|
|
7
|
-
from edc_visit_schedule.constants import MONTH1
|
|
8
|
-
from model_bakery.baker import make_recipe
|
|
9
|
-
|
|
10
|
-
from meta_prn.models import OffSchedule
|
|
11
|
-
from meta_prn.models.pregnancy_notification import PregnancyNotificationError
|
|
12
|
-
from meta_screening.tests.meta_test_case_mixin import MetaTestCaseMixin
|
|
13
|
-
from meta_visit_schedule.constants import SCHEDULE, SCHEDULE_PREGNANCY
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
class TestPregnancyNotification(MetaTestCaseMixin, TestCase):
|
|
17
|
-
def setUp(self):
|
|
18
|
-
super().setUp()
|
|
19
|
-
self.subject_visit = self.get_subject_visit(gender=FEMALE)
|
|
20
|
-
|
|
21
|
-
def test_pregnancy_notification_updates_urine_pregnancy(self):
|
|
22
|
-
subject_visit = self.get_next_subject_visit(self.subject_visit)
|
|
23
|
-
subject_visit = self.get_next_subject_visit(subject_visit)
|
|
24
|
-
self.assertEqual(subject_visit.visit_code, MONTH1)
|
|
25
|
-
urine_pregnancy = make_recipe(
|
|
26
|
-
"meta_subject.urinepregnancy",
|
|
27
|
-
subject_visit=subject_visit,
|
|
28
|
-
report_datetime=get_utcnow(),
|
|
29
|
-
assay_date=get_utcnow().date(),
|
|
30
|
-
)
|
|
31
|
-
|
|
32
|
-
self.assertFalse(urine_pregnancy.notified)
|
|
33
|
-
self.assertIsNotNone(urine_pregnancy.assay_date)
|
|
34
|
-
make_recipe(
|
|
35
|
-
"meta_prn.pregnancynotification",
|
|
36
|
-
subject_identifier=subject_visit.subject_identifier,
|
|
37
|
-
report_datetime=get_utcnow(),
|
|
38
|
-
)
|
|
39
|
-
urine_pregnancy.refresh_from_db()
|
|
40
|
-
self.assertTrue(urine_pregnancy.notified)
|
|
41
|
-
self.assertIsNotNone(urine_pregnancy.notified_datetime)
|
|
42
|
-
|
|
43
|
-
def test_pregnancy_notification_unconfirmed_ok(self):
|
|
44
|
-
subject_visit = self.get_next_subject_visit(self.subject_visit)
|
|
45
|
-
subject_visit = self.get_next_subject_visit(subject_visit)
|
|
46
|
-
self.assertEqual(subject_visit.visit_code, MONTH1)
|
|
47
|
-
make_recipe(
|
|
48
|
-
"meta_prn.pregnancynotification",
|
|
49
|
-
subject_identifier=subject_visit.subject_identifier,
|
|
50
|
-
report_datetime=get_utcnow(),
|
|
51
|
-
bhcg_confirmed=NO,
|
|
52
|
-
unconfirmed_details="blah blah",
|
|
53
|
-
)
|
|
54
|
-
|
|
55
|
-
def test_pregnancy_notification_confirmed_raises(self):
|
|
56
|
-
subject_visit = self.get_next_subject_visit(self.subject_visit)
|
|
57
|
-
subject_visit = self.get_next_subject_visit(subject_visit)
|
|
58
|
-
self.assertEqual(subject_visit.visit_code, MONTH1)
|
|
59
|
-
try:
|
|
60
|
-
make_recipe(
|
|
61
|
-
"meta_prn.pregnancynotification",
|
|
62
|
-
subject_identifier=subject_visit.subject_identifier,
|
|
63
|
-
report_datetime=get_utcnow(),
|
|
64
|
-
bhcg_confirmed=YES,
|
|
65
|
-
unconfirmed_details="blah blah",
|
|
66
|
-
)
|
|
67
|
-
except PregnancyNotificationError:
|
|
68
|
-
pass
|
|
69
|
-
else:
|
|
70
|
-
self.fail("PregnancyNotificationError unexpectedly NOT raised")
|
|
71
|
-
|
|
72
|
-
def test_pregnancy_notification_takes_off_schedule(self):
|
|
73
|
-
subject_visit = self.get_next_subject_visit(self.subject_visit)
|
|
74
|
-
subject_visit = self.get_next_subject_visit(subject_visit)
|
|
75
|
-
self.assertEqual(subject_visit.visit_code, MONTH1)
|
|
76
|
-
make_recipe(
|
|
77
|
-
"meta_prn.pregnancynotification",
|
|
78
|
-
subject_identifier=subject_visit.subject_identifier,
|
|
79
|
-
report_datetime=subject_visit.report_datetime,
|
|
80
|
-
bhcg_confirmed=NO,
|
|
81
|
-
unconfirmed_details="blah blah",
|
|
82
|
-
edd=subject_visit.report_datetime + relativedelta(months=6),
|
|
83
|
-
)
|
|
84
|
-
|
|
85
|
-
try:
|
|
86
|
-
OffSchedule.objects.get(subject_identifier=subject_visit.subject_identifier)
|
|
87
|
-
except ObjectDoesNotExist:
|
|
88
|
-
self.fail("OffSchedule unexpectedly does not exist")
|
|
89
|
-
|
|
90
|
-
self.assertEqual(Appointment.objects.filter(schedule_name=SCHEDULE).count(), 3)
|
|
91
|
-
self.assertEqual(
|
|
92
|
-
Appointment.objects.filter(schedule_name=SCHEDULE_PREGNANCY).count(), 1
|
|
93
|
-
)
|
meta_prn/tests/urls.py
DELETED
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
from django.contrib import admin
|
|
2
|
-
from django.urls.conf import include, path
|
|
3
|
-
|
|
4
|
-
from meta_prn.admin_site import meta_prn_admin
|
|
5
|
-
|
|
6
|
-
urlpatterns = [
|
|
7
|
-
path("meta_prn/", include("meta_prn.urls")),
|
|
8
|
-
path("admin/", meta_prn_admin.urls),
|
|
9
|
-
path("admin/", admin.site.urls),
|
|
10
|
-
]
|
meta_rando/tests/__init__.py
DELETED
|
File without changes
|
|
File without changes
|
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
from django.core.exceptions import ObjectDoesNotExist
|
|
2
|
-
from django.test import TestCase, override_settings
|
|
3
|
-
from edc_constants.constants import FEMALE, MALE
|
|
4
|
-
from edc_randomization.site_randomizers import site_randomizers
|
|
5
|
-
from edc_registration.models import RegisteredSubject
|
|
6
|
-
|
|
7
|
-
from meta_edc.meta_version import PHASE_THREE, get_meta_version
|
|
8
|
-
from meta_rando.randomizers import RandomizerPhaseThree
|
|
9
|
-
from meta_screening.tests.meta_test_case_mixin import MetaTestCaseMixin
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
class TestRandomizers(MetaTestCaseMixin, TestCase):
|
|
13
|
-
import_randomization_list = False
|
|
14
|
-
|
|
15
|
-
def test_import(self):
|
|
16
|
-
RandomizerPhaseThree.import_list(sid_count_for_tests=10)
|
|
17
|
-
obj = RandomizerPhaseThree.model_cls().objects.all().order_by("sid")[0]
|
|
18
|
-
self.assertEqual(
|
|
19
|
-
[1001, "active", "hindu_mandal", "F"],
|
|
20
|
-
[obj.sid, obj.assignment, obj.site_name, obj.gender],
|
|
21
|
-
)
|
|
22
|
-
|
|
23
|
-
@override_settings(META_PHASE=PHASE_THREE)
|
|
24
|
-
def test_randomize_phase_three(self):
|
|
25
|
-
self.assertEqual(get_meta_version(), 3)
|
|
26
|
-
site_randomizers._registry = {}
|
|
27
|
-
site_randomizers.loaded = False
|
|
28
|
-
site_randomizers.register(RandomizerPhaseThree)
|
|
29
|
-
self.subject_visit = self.get_subject_visit(gender=FEMALE)
|
|
30
|
-
try:
|
|
31
|
-
RegisteredSubject.objects.get(
|
|
32
|
-
sid=1001,
|
|
33
|
-
subject_identifier=self.subject_visit.subject_identifier,
|
|
34
|
-
gender=FEMALE,
|
|
35
|
-
)
|
|
36
|
-
except ObjectDoesNotExist:
|
|
37
|
-
self.fail("RegisteredSubject unexpectedly does not exist")
|
|
38
|
-
|
|
39
|
-
self.subject_visit = self.get_subject_visit(gender=MALE)
|
|
40
|
-
try:
|
|
41
|
-
RegisteredSubject.objects.get(
|
|
42
|
-
sid=1003,
|
|
43
|
-
subject_identifier=self.subject_visit.subject_identifier,
|
|
44
|
-
gender=MALE,
|
|
45
|
-
)
|
|
46
|
-
except ObjectDoesNotExist:
|
|
47
|
-
self.fail("RegisteredSubject unexpectedly does not exist")
|
|
48
|
-
|
|
49
|
-
self.subject_visit = self.get_subject_visit(gender=FEMALE)
|
|
50
|
-
try:
|
|
51
|
-
RegisteredSubject.objects.get(
|
|
52
|
-
sid=1002,
|
|
53
|
-
subject_identifier=self.subject_visit.subject_identifier,
|
|
54
|
-
gender=FEMALE,
|
|
55
|
-
)
|
|
56
|
-
except ObjectDoesNotExist:
|
|
57
|
-
self.fail("RegisteredSubject unexpectedly does not exist")
|
meta_reports/tests/__init__.py
DELETED
|
File without changes
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
from django.contrib.auth.models import User
|
|
2
|
-
from django.test import TestCase
|
|
3
|
-
from django.test.client import RequestFactory
|
|
4
|
-
from edc_adverse_event.models import AeClassification
|
|
5
|
-
from model_bakery import baker
|
|
6
|
-
|
|
7
|
-
from meta_reports.ae_report import AeReport
|
|
8
|
-
from meta_screening.tests.meta_test_case_mixin import MetaTestCaseMixin
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
class TestReports(MetaTestCaseMixin, TestCase):
|
|
12
|
-
def setUp(self):
|
|
13
|
-
self.user = User.objects.create(username="erikvw", is_staff=True, is_active=True)
|
|
14
|
-
subject_screening = self.get_subject_screening()
|
|
15
|
-
subject_consent = self.get_subject_consent(subject_screening)
|
|
16
|
-
self.subject_identifier = subject_consent.subject_identifier
|
|
17
|
-
|
|
18
|
-
def test_aereport(self):
|
|
19
|
-
rf = RequestFactory()
|
|
20
|
-
request = rf.get("/")
|
|
21
|
-
request.user = self.user
|
|
22
|
-
ae_classification = AeClassification.objects.all()[0]
|
|
23
|
-
ae_initial = baker.make_recipe(
|
|
24
|
-
"meta_ae.aeinitial",
|
|
25
|
-
subject_identifier=self.subject_identifier,
|
|
26
|
-
ae_classification=ae_classification,
|
|
27
|
-
)
|
|
28
|
-
|
|
29
|
-
report = AeReport(
|
|
30
|
-
ae_initial=ae_initial,
|
|
31
|
-
subject_identifier=ae_initial.subject_identifier,
|
|
32
|
-
user=request.user,
|
|
33
|
-
request=request,
|
|
34
|
-
)
|
|
35
|
-
return report.render_to_response()
|
meta_reports/tests/urls.py
DELETED
meta_screening/offline_models.py
DELETED
meta_screening/tests/__init__.py
DELETED
|
File without changes
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
2019-01-01,New Year's Day,tanzania
|
|
2
|
-
2019-01-12,Zanzibar Revolution Day,tanzania
|
|
3
|
-
2019-04-07,The Sheikh Abeid Amani Karume Day,tanzania
|
|
4
|
-
2019-04-17,Easter Monday,tanzania
|
|
5
|
-
2019-04-26,Union Day,tanzania
|
|
6
|
-
2019-05-01,Labour Day,tanzania
|
|
7
|
-
2019-06-26,Eid al-Fitr,tanzania
|
|
8
|
-
2019-07-07,Saba Saba Day,tanzania
|
|
9
|
-
2019-07-14,Good Friday,tanzania
|
|
10
|
-
2019-08-08,Nane Nane Day,tanzania
|
|
11
|
-
2019-10-14,Nyerere Day,tanzania
|
|
12
|
-
2019-12-01,Mawlid Day,tanzania
|
|
13
|
-
2019-12-09,Independence Day,tanzania
|
|
14
|
-
2019-12-25,Christmas Day,tanzania
|
|
15
|
-
2019-12-26,Boxing Day,tanzania
|
|
@@ -1,234 +0,0 @@
|
|
|
1
|
-
from __future__ import annotations
|
|
2
|
-
|
|
3
|
-
from copy import deepcopy
|
|
4
|
-
from datetime import date, datetime
|
|
5
|
-
|
|
6
|
-
from dateutil.relativedelta import relativedelta
|
|
7
|
-
from django.conf import settings
|
|
8
|
-
from django.contrib.sites.models import Site
|
|
9
|
-
from edc_appointment.constants import IN_PROGRESS_APPT, INCOMPLETE_APPT
|
|
10
|
-
from edc_appointment.tests.test_case_mixins import AppointmentTestCaseMixin
|
|
11
|
-
from edc_constants.constants import YES
|
|
12
|
-
from edc_facility.import_holidays import import_holidays
|
|
13
|
-
from edc_list_data.site_list_data import site_list_data
|
|
14
|
-
from edc_metadata import REQUIRED
|
|
15
|
-
from edc_metadata.models import CrfMetadata
|
|
16
|
-
from edc_randomization.site_randomizers import site_randomizers
|
|
17
|
-
from edc_reportable.utils import load_reference_ranges
|
|
18
|
-
from edc_sites.site import sites
|
|
19
|
-
from edc_sites.utils import add_or_update_django_sites
|
|
20
|
-
from edc_visit_tracking.constants import SCHEDULED
|
|
21
|
-
from model_bakery import baker
|
|
22
|
-
|
|
23
|
-
from meta_consent.models import SubjectConsent, SubjectConsentV1Ext
|
|
24
|
-
from meta_edc.meta_version import PHASE_THREE
|
|
25
|
-
from meta_labs.reportables import reference_range_options
|
|
26
|
-
from meta_pharmacy.prepare_meta_pharmacy import prepare_meta_pharmacy
|
|
27
|
-
from meta_sites.sites import domain_suffix
|
|
28
|
-
from meta_subject.models import SubjectVisit
|
|
29
|
-
from meta_visit_schedule.constants import DAY1
|
|
30
|
-
|
|
31
|
-
from ..models import (
|
|
32
|
-
ScreeningPartOne,
|
|
33
|
-
ScreeningPartThree,
|
|
34
|
-
ScreeningPartTwo,
|
|
35
|
-
SubjectScreening,
|
|
36
|
-
)
|
|
37
|
-
from .options import (
|
|
38
|
-
get_part_one_eligible_options,
|
|
39
|
-
get_part_three_eligible_options,
|
|
40
|
-
get_part_two_eligible_options,
|
|
41
|
-
now,
|
|
42
|
-
)
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
class MetaTestCaseMixin(AppointmentTestCaseMixin):
|
|
46
|
-
fqdn = domain_suffix
|
|
47
|
-
|
|
48
|
-
default_sites = sites.get_by_country("tanzania", aslist=True)
|
|
49
|
-
|
|
50
|
-
site_names = [s.name for s in default_sites]
|
|
51
|
-
|
|
52
|
-
import_randomization_list = True
|
|
53
|
-
|
|
54
|
-
sid_count_for_tests = 5
|
|
55
|
-
|
|
56
|
-
@classmethod
|
|
57
|
-
def setUpTestData(cls):
|
|
58
|
-
load_reference_ranges(**reference_range_options)
|
|
59
|
-
import_holidays(test=True)
|
|
60
|
-
add_or_update_django_sites(single_sites=sites.get_by_country("tanzania", aslist=True))
|
|
61
|
-
if cls.import_randomization_list:
|
|
62
|
-
randomizer_cls = site_randomizers.get(PHASE_THREE)
|
|
63
|
-
randomizer_cls.import_list(
|
|
64
|
-
verbose=False, sid_count_for_tests=cls.sid_count_for_tests
|
|
65
|
-
)
|
|
66
|
-
site_list_data.initialize()
|
|
67
|
-
site_list_data.autodiscover()
|
|
68
|
-
prepare_meta_pharmacy()
|
|
69
|
-
|
|
70
|
-
def get_subject_screening(
|
|
71
|
-
self,
|
|
72
|
-
report_datetime: datetime | None = None,
|
|
73
|
-
eligibility_datetime: datetime | None = None,
|
|
74
|
-
gender: str | None = None,
|
|
75
|
-
ethnicity: str | None = None,
|
|
76
|
-
age_in_years: int | None = None,
|
|
77
|
-
):
|
|
78
|
-
part_one_eligible_options = deepcopy(get_part_one_eligible_options())
|
|
79
|
-
part_two_eligible_options = deepcopy(get_part_two_eligible_options())
|
|
80
|
-
part_three_eligible_options = deepcopy(get_part_three_eligible_options())
|
|
81
|
-
if report_datetime:
|
|
82
|
-
part_one_eligible_options.update(report_datetime=report_datetime)
|
|
83
|
-
part_one_eligible_options["age_in_years"] = (
|
|
84
|
-
age_in_years or part_one_eligible_options["age_in_years"]
|
|
85
|
-
)
|
|
86
|
-
part_one_eligible_options["gender"] = gender or part_one_eligible_options["gender"]
|
|
87
|
-
part_one_eligible_options["ethnicity"] = (
|
|
88
|
-
ethnicity or part_one_eligible_options["ethnicity"]
|
|
89
|
-
)
|
|
90
|
-
part_one = ScreeningPartOne.objects.create(
|
|
91
|
-
user_created="erikvw",
|
|
92
|
-
user_modified="erikvw",
|
|
93
|
-
**part_one_eligible_options,
|
|
94
|
-
)
|
|
95
|
-
screening_identifier = part_one.screening_identifier
|
|
96
|
-
self.assertEqual(part_one.reasons_ineligible_part_one, None)
|
|
97
|
-
self.assertEqual(part_one.eligible_part_one, YES)
|
|
98
|
-
|
|
99
|
-
screening_part_two = ScreeningPartTwo.objects.get(
|
|
100
|
-
screening_identifier=screening_identifier
|
|
101
|
-
)
|
|
102
|
-
for k, v in part_two_eligible_options.items():
|
|
103
|
-
setattr(screening_part_two, k, v)
|
|
104
|
-
screening_part_two.save()
|
|
105
|
-
self.assertEqual(screening_part_two.reasons_ineligible_part_two, None)
|
|
106
|
-
self.assertEqual(screening_part_two.eligible_part_two, YES)
|
|
107
|
-
|
|
108
|
-
screening_part_three = ScreeningPartThree.objects.get(
|
|
109
|
-
screening_identifier=screening_identifier
|
|
110
|
-
)
|
|
111
|
-
for k, v in part_three_eligible_options.items():
|
|
112
|
-
setattr(screening_part_three, k, v)
|
|
113
|
-
screening_part_three.save()
|
|
114
|
-
self.assertEqual(screening_part_three.reasons_ineligible_part_three, None)
|
|
115
|
-
self.assertEqual(screening_part_three.eligible_part_three, YES)
|
|
116
|
-
|
|
117
|
-
subject_screening = SubjectScreening.objects.get(
|
|
118
|
-
screening_identifier=screening_identifier
|
|
119
|
-
)
|
|
120
|
-
|
|
121
|
-
self.assertTrue(subject_screening.eligible)
|
|
122
|
-
|
|
123
|
-
if eligibility_datetime:
|
|
124
|
-
screening_part_three.eligibility_datetime = eligibility_datetime
|
|
125
|
-
screening_part_three.save()
|
|
126
|
-
subject_screening = SubjectScreening.objects.get(
|
|
127
|
-
screening_identifier=screening_identifier
|
|
128
|
-
)
|
|
129
|
-
return subject_screening
|
|
130
|
-
|
|
131
|
-
@staticmethod
|
|
132
|
-
def get_subject_consent(
|
|
133
|
-
subject_screening: SubjectScreening,
|
|
134
|
-
consent_datetime: datetime = None,
|
|
135
|
-
dob: date = None,
|
|
136
|
-
site_id: int = None,
|
|
137
|
-
):
|
|
138
|
-
return baker.make_recipe(
|
|
139
|
-
"meta_consent.subjectconsentv1",
|
|
140
|
-
user_created="erikvw",
|
|
141
|
-
user_modified="erikvw",
|
|
142
|
-
screening_identifier=subject_screening.screening_identifier,
|
|
143
|
-
initials=subject_screening.initials,
|
|
144
|
-
gender=subject_screening.gender,
|
|
145
|
-
dob=dob or (now.date() - relativedelta(years=subject_screening.age_in_years)),
|
|
146
|
-
site=Site.objects.get(id=site_id or settings.SITE_ID),
|
|
147
|
-
consent_datetime=consent_datetime or subject_screening.report_datetime,
|
|
148
|
-
)
|
|
149
|
-
|
|
150
|
-
@staticmethod
|
|
151
|
-
def get_subject_consent_extended(
|
|
152
|
-
subject_consent: SubjectConsent,
|
|
153
|
-
consent_datetime: datetime = None,
|
|
154
|
-
):
|
|
155
|
-
return SubjectConsentV1Ext.objects.create(
|
|
156
|
-
subject_consent=subject_consent,
|
|
157
|
-
report_datetime=consent_datetime,
|
|
158
|
-
agrees_to_extension=YES,
|
|
159
|
-
user_created="erikvw",
|
|
160
|
-
user_modified="erikvw",
|
|
161
|
-
site=subject_consent.site,
|
|
162
|
-
)
|
|
163
|
-
|
|
164
|
-
def get_subject_visit(
|
|
165
|
-
self,
|
|
166
|
-
visit_code: str | None = None,
|
|
167
|
-
visit_code_sequence: int | None = None,
|
|
168
|
-
subject_screening=None,
|
|
169
|
-
subject_consent=None,
|
|
170
|
-
reason: str | None = None,
|
|
171
|
-
appt_datetime: datetime | None = None,
|
|
172
|
-
gender: str | None = None,
|
|
173
|
-
ethnicity: str | None = None,
|
|
174
|
-
age_in_years: int | None = None,
|
|
175
|
-
screening_datetime: datetime | None = None,
|
|
176
|
-
eligibility_datetime: datetime | None = None,
|
|
177
|
-
):
|
|
178
|
-
reason = reason or SCHEDULED
|
|
179
|
-
subject_screening = subject_screening or self.get_subject_screening(
|
|
180
|
-
gender=gender,
|
|
181
|
-
ethnicity=ethnicity,
|
|
182
|
-
age_in_years=age_in_years,
|
|
183
|
-
report_datetime=screening_datetime,
|
|
184
|
-
eligibility_datetime=eligibility_datetime,
|
|
185
|
-
)
|
|
186
|
-
subject_consent = subject_consent or self.get_subject_consent(subject_screening)
|
|
187
|
-
options = dict(
|
|
188
|
-
subject_identifier=subject_consent.subject_identifier,
|
|
189
|
-
visit_code=visit_code or DAY1,
|
|
190
|
-
visit_code_sequence=(
|
|
191
|
-
visit_code_sequence if visit_code_sequence is not None else 0
|
|
192
|
-
),
|
|
193
|
-
reason=reason,
|
|
194
|
-
)
|
|
195
|
-
if appt_datetime:
|
|
196
|
-
options.update(appt_datetime=appt_datetime)
|
|
197
|
-
appointment = self.get_appointment(**options)
|
|
198
|
-
subject_visit = SubjectVisit(
|
|
199
|
-
appointment=appointment,
|
|
200
|
-
reason=SCHEDULED,
|
|
201
|
-
report_datetime=appointment.appt_datetime,
|
|
202
|
-
)
|
|
203
|
-
subject_visit.save()
|
|
204
|
-
subject_visit.refresh_from_db()
|
|
205
|
-
return subject_visit
|
|
206
|
-
|
|
207
|
-
@staticmethod
|
|
208
|
-
def get_next_subject_visit(subject_visit):
|
|
209
|
-
appointment = subject_visit.appointment
|
|
210
|
-
appointment.appt_status = INCOMPLETE_APPT
|
|
211
|
-
appointment.save()
|
|
212
|
-
appointment.refresh_from_db()
|
|
213
|
-
next_appointment = appointment.next_by_timepoint
|
|
214
|
-
next_appointment.appt_status = IN_PROGRESS_APPT
|
|
215
|
-
next_appointment.save()
|
|
216
|
-
subject_visit = SubjectVisit(
|
|
217
|
-
appointment=next_appointment,
|
|
218
|
-
reason=SCHEDULED,
|
|
219
|
-
report_datetime=next_appointment.appt_datetime,
|
|
220
|
-
visit_code=next_appointment.visit_code,
|
|
221
|
-
visit_code_sequence=next_appointment.visit_code_sequence,
|
|
222
|
-
)
|
|
223
|
-
subject_visit.save()
|
|
224
|
-
subject_visit.refresh_from_db()
|
|
225
|
-
return subject_visit
|
|
226
|
-
|
|
227
|
-
@staticmethod
|
|
228
|
-
def get_crf_metadata(subject_visit):
|
|
229
|
-
return CrfMetadata.objects.filter(
|
|
230
|
-
subject_identifier=subject_visit.subject_identifier,
|
|
231
|
-
visit_code=subject_visit.visit_code,
|
|
232
|
-
visit_code_sequence=subject_visit.visit_code_sequence,
|
|
233
|
-
entry_status=REQUIRED,
|
|
234
|
-
)
|
meta_screening/tests/options.py
DELETED
|
@@ -1,127 +0,0 @@
|
|
|
1
|
-
from datetime import datetime
|
|
2
|
-
from random import sample
|
|
3
|
-
from secrets import choice
|
|
4
|
-
from string import ascii_uppercase
|
|
5
|
-
from zoneinfo import ZoneInfo
|
|
6
|
-
|
|
7
|
-
from dateutil.relativedelta import relativedelta
|
|
8
|
-
from django.conf import settings
|
|
9
|
-
from django.contrib.sites.models import Site
|
|
10
|
-
from edc_constants.constants import (
|
|
11
|
-
BLACK,
|
|
12
|
-
FEMALE,
|
|
13
|
-
NO,
|
|
14
|
-
NOT_APPLICABLE,
|
|
15
|
-
RANDOM_SAMPLING,
|
|
16
|
-
YES,
|
|
17
|
-
)
|
|
18
|
-
from edc_reportable.units import MICROMOLES_PER_LITER, MILLIMOLES_PER_LITER
|
|
19
|
-
from faker import Faker
|
|
20
|
-
|
|
21
|
-
from meta_edc.meta_version import get_meta_version
|
|
22
|
-
from meta_screening.forms import part_one_fields, part_three_fields, part_two_fields
|
|
23
|
-
|
|
24
|
-
fake = Faker()
|
|
25
|
-
now = datetime(2019, 5, 1).astimezone(ZoneInfo("UTC"))
|
|
26
|
-
tomorrow = now + relativedelta(days=1)
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
def get_part_one_eligible_options():
|
|
30
|
-
options = dict(
|
|
31
|
-
age_in_years=25,
|
|
32
|
-
art_six_months=YES,
|
|
33
|
-
continue_part_two=YES,
|
|
34
|
-
ethnicity=BLACK,
|
|
35
|
-
gender=FEMALE,
|
|
36
|
-
hiv_pos=YES,
|
|
37
|
-
hospital_identifier="".join(map(str, sample(range(0, 10), 10))), # nosec B311
|
|
38
|
-
initials=f"{choice(ascii_uppercase)}{choice(ascii_uppercase)}", # nosec B311
|
|
39
|
-
lives_nearby=YES,
|
|
40
|
-
on_rx_stable=YES,
|
|
41
|
-
pregnant=NOT_APPLICABLE,
|
|
42
|
-
report_datetime=now,
|
|
43
|
-
screening_consent=YES,
|
|
44
|
-
selection_method=RANDOM_SAMPLING,
|
|
45
|
-
staying_nearby_12=YES,
|
|
46
|
-
vl_undetectable=YES,
|
|
47
|
-
meta_phase_two=NO,
|
|
48
|
-
site=Site.objects.get(id=settings.SITE_ID),
|
|
49
|
-
)
|
|
50
|
-
if fld := [f for f in part_one_fields if f not in options]:
|
|
51
|
-
raise TypeError(
|
|
52
|
-
f"Missing part one fields for meta phase {get_meta_version()}. Got {fld}."
|
|
53
|
-
)
|
|
54
|
-
return options
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
def get_part_two_eligible_options(report_datetime: datetime = None) -> dict:
|
|
58
|
-
options = dict(
|
|
59
|
-
acute_condition=NO,
|
|
60
|
-
acute_metabolic_acidosis=NO,
|
|
61
|
-
advised_to_fast=YES,
|
|
62
|
-
alcoholism=NO,
|
|
63
|
-
already_fasted=NO,
|
|
64
|
-
appt_datetime=report_datetime or (now + relativedelta(days=10)),
|
|
65
|
-
congestive_heart_failure=NO,
|
|
66
|
-
liver_disease=NO,
|
|
67
|
-
metformin_sensitivity=NO,
|
|
68
|
-
part_two_report_datetime=report_datetime or now,
|
|
69
|
-
renal_function_condition=NO,
|
|
70
|
-
tissue_hypoxia_condition=NO,
|
|
71
|
-
has_dm=NO,
|
|
72
|
-
on_dm_medication=NO,
|
|
73
|
-
agree_to_p3=YES,
|
|
74
|
-
p3_ltfu=NOT_APPLICABLE,
|
|
75
|
-
p3_ltfu_date=None,
|
|
76
|
-
p3_ltfu_comment=None,
|
|
77
|
-
contact_number=None,
|
|
78
|
-
)
|
|
79
|
-
if fld := [f for f in part_two_fields if f not in options]:
|
|
80
|
-
raise TypeError(
|
|
81
|
-
f"Missing part two fields for meta phase {get_meta_version()}. Got {fld}."
|
|
82
|
-
)
|
|
83
|
-
return options
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
def get_part_three_eligible_options(report_datetime: datetime = None):
|
|
87
|
-
options = dict(
|
|
88
|
-
creatinine_performed=YES,
|
|
89
|
-
creatinine_units=MICROMOLES_PER_LITER,
|
|
90
|
-
creatinine_value=50,
|
|
91
|
-
dia_blood_pressure=65,
|
|
92
|
-
dia_blood_pressure_one=65,
|
|
93
|
-
dia_blood_pressure_two=65,
|
|
94
|
-
fasting=YES,
|
|
95
|
-
fasting_duration_str="8h",
|
|
96
|
-
hba1c_performed=YES,
|
|
97
|
-
hba1c_datetime=report_datetime or now,
|
|
98
|
-
hba1c_value=7.0,
|
|
99
|
-
height=110,
|
|
100
|
-
fbg_datetime=tomorrow,
|
|
101
|
-
fbg_units=MILLIMOLES_PER_LITER,
|
|
102
|
-
fbg_value=6.9,
|
|
103
|
-
ogtt_base_datetime=tomorrow + relativedelta(minutes=5),
|
|
104
|
-
ogtt_datetime=tomorrow + relativedelta(hours=2),
|
|
105
|
-
ogtt_units=MILLIMOLES_PER_LITER,
|
|
106
|
-
ogtt_value=7.8,
|
|
107
|
-
repeat_glucose_opinion=NO,
|
|
108
|
-
ogtt2_performed=NOT_APPLICABLE,
|
|
109
|
-
part_three_report_datetime=report_datetime or now,
|
|
110
|
-
reasons_unsuitable=None,
|
|
111
|
-
sys_blood_pressure=120,
|
|
112
|
-
sys_blood_pressure_one=120,
|
|
113
|
-
sys_blood_pressure_two=120,
|
|
114
|
-
unsuitable_agreed=NOT_APPLICABLE,
|
|
115
|
-
unsuitable_for_study=NO,
|
|
116
|
-
urine_bhcg_date=None,
|
|
117
|
-
urine_bhcg_performed=NOT_APPLICABLE,
|
|
118
|
-
urine_bhcg_value=NOT_APPLICABLE,
|
|
119
|
-
waist_circumference=130,
|
|
120
|
-
weight=65,
|
|
121
|
-
severe_htn=NO,
|
|
122
|
-
)
|
|
123
|
-
if fld := [f for f in part_three_fields if f not in options]:
|
|
124
|
-
raise TypeError(
|
|
125
|
-
f"Missing part three fields for meta phase {get_meta_version()}. Got {fld}."
|
|
126
|
-
)
|
|
127
|
-
return options
|
|
File without changes
|