meta-edc 0.3.39__py3-none-any.whl → 1.4.0__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.
- meta_ae/action_items.py +38 -27
- meta_ae/admin/__init__.py +11 -0
- meta_ae/admin/ae_initial_admin.py +5 -2
- meta_ae/admin/ae_susar_admin.py +1 -1
- meta_ae/admin/death_report_admin.py +1 -1
- meta_ae/admin/modeladmin_mixins.py +14 -15
- meta_ae/baker_recipes.py +4 -6
- meta_ae/choices.py +1 -1
- meta_ae/forms/__init__.py +13 -0
- meta_ae/forms/death_report_form.py +1 -1
- meta_ae/forms/modelform_mixins.py +2 -2
- meta_ae/list_data.py +1 -1
- meta_ae/migrations/0001_initial.py +27 -27
- meta_ae/migrations/0006_aelocalreview_aesponsorreview.py +5 -5
- meta_ae/migrations/0017_auto_20221130_2257.py +1 -1
- 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_ae/templatetags/meta_ae_extras.py +4 -6
- meta_analytics/.DS_Store +0 -0
- meta_analytics/README.rst +1 -2
- meta_analytics/dataframes/__init__.py +27 -0
- meta_analytics/dataframes/constants.py +5 -2
- meta_analytics/dataframes/get_eos_df.py +16 -4
- meta_analytics/dataframes/get_glucose_df.py +166 -0
- meta_analytics/dataframes/get_glucose_fbg_df.py +26 -0
- meta_analytics/dataframes/get_glucose_fbg_ogtt_df.py +21 -0
- meta_analytics/dataframes/get_last_imp_visits_df.py +12 -10
- meta_analytics/dataframes/glucose_endpoints/__init__.py +2 -0
- meta_analytics/dataframes/glucose_endpoints/endpoint_by_date.py +125 -124
- meta_analytics/dataframes/glucose_endpoints/glucose_endpoints_by_date.py +111 -235
- 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 +9 -15
- meta_analytics/dataframes/utils.py +21 -12
- meta_analytics/get_tables.py +1 -2
- meta_analytics/tables/__init__.py +2 -0
- meta_analytics/tables/enrolled/glucose.py +2 -1
- meta_analytics/utils.py +81 -0
- meta_auth/auths.py +1 -1
- meta_consent/action_items.py +22 -3
- meta_consent/admin/__init__.py +7 -0
- meta_consent/admin/actions/__init__.py +2 -0
- meta_consent/admin/actions/create_missing_prescriptions.py +2 -2
- meta_consent/admin/list_filters.py +22 -0
- meta_consent/admin/modeladmin_mixins.py +4 -5
- meta_consent/admin/subject_consent_v1_ext_admin.py +93 -0
- meta_consent/baker_recipes.py +7 -7
- meta_consent/consents.py +15 -2
- meta_consent/constants.py +1 -0
- meta_consent/form_validators/__init__.py +2 -0
- meta_consent/forms/__init__.py +8 -0
- meta_consent/forms/subject_consent_v1_ext_form.py +47 -0
- meta_consent/forms/subject_reconsent_form.py +4 -4
- meta_consent/management/commands/create_missing_prescriptions.py +5 -3
- meta_consent/migrations/0001_initial.py +9 -9
- meta_consent/migrations/0024_historicalsubjectconsentv1.py +3 -8
- meta_consent/migrations/0026_historicalsubjectconsentv1ext_subjectconsentv1ext.py +535 -0
- meta_consent/migrations/0027_auto_20250111_0344.py +30 -0
- meta_consent/migrations/0028_historicalsubjectconsentv1ext_assessment_score_and_more.py +162 -0
- meta_consent/migrations/0029_alter_historicalsubjectconsentv1ext_agrees_to_extension_and_more.py +33 -0
- meta_consent/migrations/0030_auto_20250120_2114.py +40 -0
- meta_consent/migrations/0031_alter_historicalsubjectconsent_guardian_name_and_more.py +124 -0
- meta_consent/migrations/0032_alter_historicalsubjectconsent_device_created_and_more.py +678 -0
- meta_consent/migrations/0033_historicalsubjectconsentspfq_subjectconsentspfq.py +615 -0
- meta_consent/migrations/0034_remove_subjectconsentspfq_site_and_more.py +23 -0
- meta_consent/migrations/0035_alter_historicalsubjectconsent_consent_definition_name_and_more.py +43 -0
- meta_consent/models/__init__.py +10 -0
- meta_consent/models/model_mixins.py +1 -2
- meta_consent/models/signals.py +25 -11
- meta_consent/models/subject_consent.py +2 -2
- meta_consent/models/subject_consent_v1.py +0 -1
- meta_consent/models/subject_consent_v1_ext.py +34 -0
- meta_consent/models/subject_reconsent.py +4 -4
- meta_dashboard/navbars.py +2 -6
- meta_dashboard/patterns.py +1 -1
- meta_dashboard/templates/meta_dashboard/{bootstrap3/buttons → buttons}/eligibility_button.html +1 -1
- meta_dashboard/templates/meta_dashboard/{bootstrap3/buttons → buttons}/screening_button.html +1 -1
- meta_dashboard/templates/meta_dashboard/subject/dashboard/sidebar.html +24 -0
- meta_dashboard/templates/meta_dashboard/{bootstrap3/subject → subject}/dashboard/top_bar.html +1 -1
- meta_dashboard/templates/meta_dashboard/subject/dashboard.html +14 -0
- meta_dashboard/templatetags/meta_dashboard_extras.py +9 -14
- meta_dashboard/urls.py +5 -5
- meta_dashboard/view_utils/__init__.py +13 -0
- meta_dashboard/view_utils/subject_screening_button.py +13 -20
- 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/screening/listboard_view.py +2 -3
- 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 +19 -8
- meta_dashboard/views/subject/listboard/__init__.py +2 -0
- meta_dashboard/views/subject/listboard/listboard_view.py +2 -3
- meta_edc/__init__.py +5 -9
- meta_edc/admin.py +3 -4
- meta_edc/celery.py +2 -2
- meta_edc/celery_live.py +19 -0
- meta_edc/celery_uat.py +25 -0
- meta_edc/management/commands/update_forms_reference.py +16 -14
- meta_edc/meta_version.py +2 -2
- meta_edc/navbars.py +7 -5
- meta_edc/settings/debug.py +13 -4
- meta_edc/settings/defaults.py +55 -18
- meta_edc/settings/live.py +4 -1
- meta_edc/settings/logging.py +9 -4
- meta_edc/settings/minimal.py +4 -5
- meta_edc/settings/uat.py +3 -1
- meta_edc/templates/meta_edc/{bootstrap3/base.html → base.html} +1 -1
- meta_edc/templates/meta_edc/{bootstrap3/home.html → home.html} +2 -2
- meta_edc/urls.py +3 -1
- meta_edc/utils.py +3 -1
- meta_edc/views/__init__.py +2 -0
- meta_edc/views/home_view.py +1 -2
- meta_edc-1.4.0.dist-info/METADATA +174 -0
- {meta_edc-0.3.39.dist-info → meta_edc-1.4.0.dist-info}/RECORD +578 -586
- meta_edc-1.4.0.dist-info/WHEEL +4 -0
- meta_labs/list_data.py +2 -2
- meta_labs/reportables.py +80 -11
- meta_lists/list_data.py +13 -4
- meta_lists/migrations/0008_auto_20200528_1517.py +2 -2
- meta_lists/migrations/0019_auto_20250128_0143.py +48 -0
- meta_lists/migrations/0020_alter_abnormalfootappearanceobservations_extra_value_and_more.py +404 -0
- meta_pharmacy/admin/__init__.py +5 -0
- meta_pharmacy/admin/rx_admin.py +1 -0
- meta_pharmacy/admin/substitutions_admin.py +3 -3
- meta_pharmacy/constants.py +1 -1
- meta_pharmacy/forms/__init__.py +2 -0
- meta_pharmacy/forms/rx_form.py +0 -1
- meta_pharmacy/forms/substitutions_form.py +6 -4
- meta_pharmacy/labels/__init__.py +5 -2
- meta_pharmacy/labels/draw_label_for_subject_with_barcode.py +4 -1
- 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/management/commands/update_initial_pharmacy_data.py +4 -3
- 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/rx_label.py +0 -1
- meta_pharmacy/models/substitutions.py +4 -4
- 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/action_items.py +44 -45
- meta_prn/admin/__init__.py +16 -0
- meta_prn/admin/dm_referral_admin.py +2 -1
- meta_prn/admin/end_of_study_admin.py +26 -15
- 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 +12 -11
- meta_prn/admin/offschedule_dm_referral_admin.py +11 -10
- meta_prn/admin/offschedule_postnatal_admin.py +15 -7
- meta_prn/admin/offschedule_pregnancy_admin.py +18 -9
- meta_prn/admin/onschedule_admin.py +7 -8
- meta_prn/admin/onschedule_dm_referral_admin.py +11 -12
- 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 +10 -10
- meta_prn/choices.py +11 -7
- meta_prn/constants.py +1 -0
- meta_prn/form_validators/__init__.py +5 -0
- meta_prn/form_validators/end_of_study.py +65 -20
- meta_prn/form_validators/protocol_incident.py +1 -1
- meta_prn/forms/__init__.py +13 -0
- meta_prn/forms/dm_referral_form.py +2 -8
- meta_prn/forms/end_of_study_form.py +1 -1
- meta_prn/forms/loss_to_followup_form.py +1 -1
- meta_prn/forms/off_study_medication_form.py +2 -2
- meta_prn/forms/offschedule_form.py +25 -0
- meta_prn/forms/pregnancy_notification_form.py +15 -17
- meta_prn/list_data.py +3 -3
- 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/0034_auto_20220630_1110.py +1 -1
- meta_prn/migrations/0035_auto_20220630_1140.py +1 -1
- 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/0060_alter_onschedule_managers_and_more.py +55 -0
- meta_prn/migrations/0061_auto_20250115_2025.py +56 -0
- meta_prn/migrations/0062_alter_endofstudy_offstudy_reason_and_more.py +72 -0
- meta_prn/migrations/0063_historicaloffstudymedication_singleton_field_and_more.py +37 -0
- meta_prn/migrations/0064_auto_20250602_2143.py +18 -0
- meta_prn/migrations/0065_alter_historicaloffstudymedication_subject_identifier_and_more.py +23 -0
- meta_prn/migrations/0066_alter_historicallosstofollowup_subject_identifier_and_more.py +23 -0
- meta_prn/migrations/0067_alter_offschedule_managers_and_more.py +2557 -0
- meta_prn/migrations/0068_alter_dmreferral_referral_note_and_more.py +235 -0
- meta_prn/migrations/0069_alter_historicaloffstudymedication_singleton_field_and_more.py +37 -0
- meta_prn/models/__init__.py +20 -0
- meta_prn/models/dm_referral.py +2 -2
- meta_prn/models/end_of_study.py +28 -23
- meta_prn/models/loss_to_followup.py +8 -10
- meta_prn/models/off_study_medication.py +7 -4
- meta_prn/models/offschedule.py +4 -4
- meta_prn/models/pregnancy_notification.py +3 -5
- meta_prn/models/protocol_incident.py +5 -2
- meta_prn/models/signals.py +16 -14
- meta_prn/models/subject_transfer.py +7 -0
- meta_prn/templates/meta_prn/eos/additional_instructions.html +3 -0
- meta_prn/templates/meta_prn/offschedule/additional_instructions.html +2 -0
- meta_rando/migrations/0001_initial.py +5 -5
- meta_rando/migrations/0006_alter_historicalrandomizationlist_allocated_user_and_more.py +130 -0
- meta_rando/migrations/0007_spfqlist.py +197 -0
- meta_rando/migrations/0008_delete_spfqlist.py +16 -0
- meta_rando/models/__init__.py +1 -0
- meta_rando/{models.py → models/randomization_list.py} +3 -3
- meta_rando/randomizers.py +2 -2
- 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 +7 -7
- meta_reports/admin/dbviews/imp_substitutions_admin.py +14 -13
- 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 +7 -7
- 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/on_study_missing_values_admin/unmanaged_model_admin.py +0 -1
- meta_reports/admin/dbviews/patient_history_missing_baseline_cd4_admin.py +9 -9
- 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/endpoints_all_admin.py +0 -1
- meta_reports/admin/last_imp_refill_admin.py +33 -36
- meta_reports/admin/list_filters.py +3 -3
- meta_reports/admin/modeladmin_mixins.py +10 -17
- meta_reports/death_report.py +2 -2
- meta_reports/forms/__init__.py +2 -0
- meta_reports/forms/missing_ogtt_note_form.py +3 -4
- meta_reports/management/commands/generate_endpoints.py +5 -4
- meta_reports/migrations/0035_historicalmissingogttnote_missingogttnote.py +5 -14
- meta_reports/migrations/0054_auto_20250422_2003.py +81 -0
- meta_reports/migrations/0055_alter_glucosesummary_table.py +17 -0
- meta_reports/migrations/0056_auto_20250422_2214.py +54 -0
- meta_reports/migrations/0057_auto_20250422_2224.py +54 -0
- meta_reports/migrations/0058_auto_20250422_2232.py +54 -0
- meta_reports/migrations/0059_alter_endpoints_created_and_more.py +161 -0
- meta_reports/migrations/0060_auto_20250926_0242.py +366 -0
- meta_reports/migrations/0061_auto_20251004_0043.py +21 -0
- meta_reports/migrations/0062_auto_20251004_0106.py +21 -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 +15 -3
- meta_reports/models/dbviews/glucose_summary/view_definition.py +8 -5
- meta_reports/models/dbviews/imp_substitutions/__init__.py +2 -0
- meta_reports/models/dbviews/imp_substitutions/unmanaged_model.py +1 -2
- 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 +2 -2
- 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_lab_values/unmanged_model.py +0 -1
- meta_reports/models/dbviews/on_study_missing_values/__init__.py +2 -0
- meta_reports/models/dbviews/on_study_missing_values/qa_cases.py +19 -1
- meta_reports/models/dbviews/on_study_missing_values/unmanged_model.py +0 -1
- meta_reports/models/dbviews/patient_history_missing_baseline_cd4/__init__.py +2 -0
- meta_reports/models/dbviews/patient_history_missing_baseline_cd4/unmanaged_model.py +0 -1
- meta_reports/models/dbviews/unattended_three_in_row/__init__.py +2 -0
- meta_reports/models/dbviews/unattended_three_in_row/unmanaged_model.py +0 -1
- meta_reports/models/dbviews/unattended_three_in_row2/__init__.py +2 -0
- meta_reports/models/dbviews/unattended_three_in_row2/unmanaged_model.py +0 -1
- meta_reports/models/dbviews/unattended_two_in_row/__init__.py +2 -0
- meta_reports/models/dbviews/unattended_two_in_row/unmanaged_model.py +0 -1
- meta_reports/models/endpoints.py +8 -4
- meta_reports/models/last_imp_refill.py +2 -3
- meta_reports/pdf_report.py +2 -2
- meta_reports/tasks.py +4 -3
- meta_reports/templates/meta_reports/columns/subject_identifier_column.html +1 -1
- meta_reports/templates/meta_reports/endpoints_all_change_list_note.html +1 -1
- meta_reports/templates/meta_reports/endpoints_change_list_note.html +1 -1
- meta_reports/templates/meta_reports/last_imp_refill/changelist_note.html +13 -0
- meta_screening/admin/__init__.py +8 -0
- meta_screening/admin/fieldsets.py +13 -15
- meta_screening/admin/list_filters.py +7 -5
- meta_screening/admin/screening_part_one_admin.py +1 -3
- 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 +21 -10
- meta_screening/baker_recipes.py +18 -10
- meta_screening/calculators.py +1 -1
- meta_screening/choices.py +1 -1
- meta_screening/constants.py +1 -1
- meta_screening/eligibility/__init__.py +9 -0
- meta_screening/eligibility/eligibility.py +21 -14
- meta_screening/eligibility/eligibility_part_one.py +1 -1
- meta_screening/eligibility/eligibility_part_three/__init__.py +2 -0
- meta_screening/eligibility/eligibility_part_three/base_eligibility_part_three.py +68 -49
- meta_screening/eligibility/eligibility_part_three/eligibility_part_three_phase_three.py +14 -15
- meta_screening/eligibility/eligibility_part_two.py +1 -1
- meta_screening/form_validators/__init__.py +8 -0
- meta_screening/form_validators/screening_part_one.py +1 -1
- meta_screening/form_validators/screening_part_three.py +6 -2
- meta_screening/form_validators/screening_part_two.py +1 -1
- meta_screening/form_validators/subject_refusal.py +1 -1
- meta_screening/forms/__init__.py +20 -0
- meta_screening/forms/field_lists.py +16 -18
- 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/0012_auto_20191107_0427.py +1 -1
- 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/calculated_model_mixin.py +2 -2
- meta_screening/model_mixins/creatinine_fields_model_mixin.py +1 -1
- meta_screening/model_mixins/eligibility_model_mixin.py +6 -4
- meta_screening/model_mixins/part_one_fields_model_mixin.py +16 -19
- meta_screening/model_mixins/part_three_fields_model_mixin.py +6 -7
- meta_screening/model_mixins/part_two_fields_model_mixin.py +19 -17
- meta_screening/models/__init__.py +9 -0
- meta_screening/models/icp_referral.py +5 -5
- meta_screening/models/proxy_models.py +1 -1
- meta_screening/models/signals.py +10 -11
- meta_screening/models/subject_refusal.py +1 -1
- meta_screening/models/subject_screening.py +2 -4
- meta_subject/action_items.py +18 -14
- meta_subject/admin/__init__.py +42 -0
- meta_subject/admin/birth_outcome_admin.py +7 -9
- 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 +8 -11
- 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/fields.py +5 -5
- meta_subject/admin/fieldsets.py +5 -5
- meta_subject/admin/followup_examination_admin.py +11 -9
- meta_subject/admin/followup_vitals_admin.py +31 -6
- meta_subject/admin/glucose_admin.py +4 -8
- meta_subject/admin/glucose_fbg_admin.py +18 -11
- 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/hiv_exit_review_admin.py +55 -0
- meta_subject/admin/list_filters.py +5 -5
- meta_subject/admin/mnsi_admin.py +7 -5
- meta_subject/admin/next_appointment_admin.py +19 -0
- 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 +2 -2
- 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/choices.py +4 -3
- meta_subject/form_validators/__init__.py +15 -0
- meta_subject/form_validators/delivery_form_validator.py +3 -3
- meta_subject/form_validators/dm_endpoint_form_validator.py +3 -1
- meta_subject/form_validators/dm_followup_form_validator.py +8 -7
- meta_subject/form_validators/egfr_drop_notification_form_validator.py +1 -1
- meta_subject/form_validators/followup_examination_form_validator.py +1 -1
- meta_subject/form_validators/glucose_fbg_form_validator.py +76 -0
- meta_subject/form_validators/glucose_form_validator.py +10 -67
- meta_subject/form_validators/hiv_exit_review_form_validator.py +18 -0
- meta_subject/form_validators/mixins.py +95 -0
- meta_subject/forms/__init__.py +44 -0
- meta_subject/forms/blood_results/__init__.py +9 -0
- meta_subject/forms/blood_results/blood_results_hba1c_form.py +1 -1
- meta_subject/forms/blood_results/blood_results_rft_form.py +60 -4
- meta_subject/forms/delivery_form.py +2 -0
- 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 +27 -1
- meta_subject/forms/glucose_fbg_form.py +1 -46
- meta_subject/forms/health_economics/__init__.py +2 -0
- meta_subject/forms/hepatitis_test_form.py +1 -1
- meta_subject/forms/hiv_exit_review_form.py +13 -0
- meta_subject/forms/mixins.py +1 -1
- meta_subject/forms/next_appointment_form.py +36 -0
- meta_subject/forms/other_arv_regimens_form.py +1 -1
- meta_subject/forms/patient_history_form.py +1 -1
- meta_subject/forms/physical_exam_form.py +1 -1
- meta_subject/forms/pregnancy_update_form.py +1 -1
- meta_subject/forms/slider_widget.py +1 -1
- meta_subject/forms/study_medication_form.py +18 -12
- meta_subject/forms/subject_requisition_form.py +1 -1
- meta_subject/forms/subject_visit_missed_form.py +1 -1
- meta_subject/forms/urine_dipstick_test_form.py +1 -1
- meta_subject/forms/urine_pregnancy_form.py +1 -1
- meta_subject/management/commands/create_missing_refills.py +3 -3
- meta_subject/management/commands/create_missing_rx.py +2 -2
- meta_subject/management/commands/missed.py +20 -23
- meta_subject/metadata_rules/__init__.py +2 -0
- meta_subject/metadata_rules/metadata_rules.py +14 -0
- meta_subject/metadata_rules/predicates.py +44 -25
- 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/0107_auto_20220415_0043.py +1 -1
- meta_subject/migrations/0115_historicalegfrnotification_egfrnotification.py +5 -13
- meta_subject/migrations/0128_auto_20220720_0055.py +1 -1
- meta_subject/migrations/0131_auto_20220722_0411.py +1 -1
- meta_subject/migrations/0135_auto_20220722_2212.py +2 -1
- 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/0199_auto_20240516_0247.py +1 -1
- meta_subject/migrations/0209_remove_historicaldmdxresult_dm_diagnosis_and_more.py +1 -2
- meta_subject/migrations/0212_auto_20240827_2222.py +1 -1
- meta_subject/migrations/0216_historicalnextappointment_nextappointment.py +553 -0
- meta_subject/migrations/0217_alter_historicalnextappointment_appt_datetime_and_more.py +42 -0
- meta_subject/migrations/0218_alter_historicalnextappointment_appt_date_and_more.py +53 -0
- meta_subject/migrations/0219_remove_historicalnextappointment_allow_create_interim_and_more.py +92 -0
- meta_subject/migrations/0220_historicalbloodresultsgludummy_bloodresultsgludummy.py +825 -0
- meta_subject/migrations/0221_auto_20250402_1913.py +42 -0
- meta_subject/migrations/0222_alter_historicalstudymedication_stock_codes_and_more.py +46 -0
- meta_subject/migrations/0223_bloodresultsfbc_errors_bloodresultsgludummy_errors_and_more.py +83 -0
- meta_subject/migrations/0224_bloodresultsfbc_abnormal_summary_and_more.py +153 -0
- meta_subject/migrations/0225_followupvitals_waist_circumference_and_more.py +46 -0
- meta_subject/migrations/0226_followupvitals_waist_circumference_comment_and_more.py +97 -0
- meta_subject/migrations/0227_alter_followupvitals_waist_circumference_comment_and_more.py +97 -0
- meta_subject/migrations/0228_bloodresultshba1c_hba1c_datetime_and_more.py +2518 -0
- meta_subject/migrations/0229_alter_glucosefbg_consent_model_and_more.py +1918 -0
- meta_subject/migrations/0230_alter_historicaldelivery_action_identifier_and_more.py +1733 -0
- meta_subject/migrations/0231_alter_historicalmedicationadherence_consent_model_and_more.py +2054 -0
- meta_subject/migrations/0232_alter_patienthistory_concomitant_conditions_and_more.py +1170 -0
- meta_subject/migrations/0233_historicalspfq_spfq.py +1066 -0
- meta_subject/migrations/0234_remove_spfq_site_remove_spfq_subject_visit_and_more.py +27 -0
- meta_subject/migrations/0235_glucosefbg_endpoint_today_and_more.py +606 -0
- meta_subject/migrations/0236_alter_historicalhivexitreview_other_current_arv_regimen_and_more.py +58 -0
- meta_subject/migrations/0237_historicalhivexitreview_singleton_field_and_more.py +68 -0
- meta_subject/migrations/0238_historicalhivexitreview_available_and_more.py +88 -0
- meta_subject/model_mixins/__init__.py +10 -0
- meta_subject/model_mixins/arv_history_model_mixin.py +3 -44
- meta_subject/model_mixins/arv_review_model_mixin.py +53 -0
- meta_subject/model_mixins/search_slug_model_mixin.py +1 -2
- meta_subject/model_mixins/vitals_fields_model_mixin.py +33 -0
- meta_subject/models/__init__.py +52 -0
- meta_subject/models/birth_outcomes.py +3 -3
- meta_subject/models/blood_results/__init__.py +11 -0
- meta_subject/models/blood_results/blood_results_glu.py +29 -0
- meta_subject/models/blood_results/blood_results_hba1c.py +0 -1
- meta_subject/models/blood_results/blood_results_ins.py +0 -1
- meta_subject/models/blood_results/blood_results_lft.py +0 -1
- meta_subject/models/delivery.py +4 -6
- meta_subject/models/diabetes/__init__.py +2 -0
- meta_subject/models/diabetes/dm_endpoint.py +5 -5
- meta_subject/models/diabetes/dm_followup.py +7 -8
- meta_subject/models/diet_and_lifestyle.py +2 -2
- meta_subject/models/followup_examination.py +12 -14
- meta_subject/models/glucose.py +5 -5
- meta_subject/models/glucose_fbg.py +17 -4
- meta_subject/models/health_economics/__init__.py +2 -0
- meta_subject/models/health_economics/health_economics.py +8 -8
- meta_subject/models/health_economics/health_economics_simple.py +2 -2
- meta_subject/models/health_economics/health_economics_update.py +3 -2
- meta_subject/models/hepatitis_test.py +2 -2
- meta_subject/models/hiv_exit_review.py +44 -0
- meta_subject/models/next_appointment.py +15 -0
- meta_subject/models/other_arv_regimens_detail.py +1 -1
- meta_subject/models/patient_history.py +6 -7
- meta_subject/models/physical_exam.py +2 -2
- meta_subject/models/pregnancy_update.py +1 -1
- meta_subject/models/signals.py +15 -13
- meta_subject/models/subject_visit.py +2 -2
- meta_subject/models/todo.txt +1 -1
- meta_subject/models/urine_dipstick_test.py +2 -2
- meta_subject/models/urine_pregnancy.py +1 -1
- meta_subject/static/meta_subject/slider.css +1 -1
- meta_subject/templates/meta_subject/endpoint_review_instructions.html +1 -1
- meta_subject/templates/meta_subject/widgets/slider.html +0 -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/crfs.py +34 -1
- meta_visit_schedule/visit_schedules/phase_three/schedule.py +4 -4
- meta_visit_schedule/visit_schedules/phase_three/schedule_dm_referral.py +1 -2
- meta_visit_schedule/visit_schedules/phase_three/schedule_pregnancy.py +2 -3
- meta_ae/tests/holidays.csv +0 -15
- meta_ae/tests/tests/test_actions.py +0 -127
- meta_ae/tests/urls.py +0 -10
- meta_analytics/dataframes/enrolled/__init__.py +0 -1
- meta_analytics/dataframes/enrolled/get_glucose_df.py +0 -122
- 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/templates/meta_dashboard/bootstrap3/subject/dashboard.html +0 -11
- 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 -554
- meta_edc-0.3.39.dist-info/AUTHORS +0 -0
- meta_edc-0.3.39.dist-info/METADATA +0 -766
- meta_edc-0.3.39.dist-info/WHEEL +0 -5
- meta_edc-0.3.39.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 -16
- meta_labs/tests/urls.py +0 -4
- meta_lists/tests/__init__.py +0 -0
- meta_lists/tests/test_lists.py +0 -8
- meta_pharmacy/admin/actions.py +0 -38
- 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 -206
- 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 -216
- meta_screening/tests/options.py +0 -127
- meta_screening/tests/tests/__init__.py +0 -0
- meta_screening/tests/tests/test_forms.py +0 -397
- meta_screening/tests/tests/test_screening_part_one.py +0 -108
- meta_screening/tests/tests/test_screening_part_three.py +0 -436
- 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 -75
- meta_subject/tests/tests/test_metadata_rules.py +0 -135
- meta_subject/tests/tests/test_mnsi.py +0 -317
- 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 -173
- meta_subject/tests/tests/test_study_medication.py +0 -230
- 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 -186
- /meta_ae/templates/meta_ae/{bootstrap3/ae_initial_description.html → aeinitial_description.html} +0 -0
- /meta_dashboard/templates/meta_dashboard/{bootstrap3/buttons → buttons}/add_consent_button.html +0 -0
- /meta_dashboard/templates/meta_dashboard/{bootstrap3/buttons → buttons}/dashboard_button.html +0 -0
- /meta_dashboard/templates/meta_dashboard/{bootstrap3/buttons → buttons}/refusal_button.html +0 -0
- /meta_dashboard/templates/meta_dashboard/{bootstrap3/screening → screening}/listboard.html +0 -0
- /meta_dashboard/templates/meta_dashboard/{bootstrap3/subject → subject}/listboard.html +0 -0
- {meta_edc-0.3.39.dist-info → meta_edc-1.4.0.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,5 +1,3 @@
|
|
|
1
|
-
from typing import Tuple
|
|
2
|
-
|
|
3
1
|
from django.utils.safestring import mark_safe
|
|
4
2
|
|
|
5
3
|
from ..forms import (
|
|
@@ -20,7 +18,7 @@ from ..forms.field_lists import (
|
|
|
20
18
|
)
|
|
21
19
|
|
|
22
20
|
|
|
23
|
-
def get_part_one_fieldset(collapse=None) ->
|
|
21
|
+
def get_part_one_fieldset(collapse=None) -> tuple[str, dict]:
|
|
24
22
|
dct = {
|
|
25
23
|
"description": mark_safe( # nosec B308
|
|
26
24
|
"To be completed by the <u>study clinician</u> or the "
|
|
@@ -33,7 +31,7 @@ def get_part_one_fieldset(collapse=None) -> Tuple[str, dict]:
|
|
|
33
31
|
return "Part 1", dct
|
|
34
32
|
|
|
35
33
|
|
|
36
|
-
def get_part_two_fieldset(collapse=None) ->
|
|
34
|
+
def get_part_two_fieldset(collapse=None) -> tuple[str, dict]:
|
|
37
35
|
dct = {
|
|
38
36
|
"description": mark_safe( # nosec B308
|
|
39
37
|
"To be completed by the <u>study clinician</u> or the "
|
|
@@ -48,7 +46,7 @@ def get_part_two_fieldset(collapse=None) -> Tuple[str, dict]:
|
|
|
48
46
|
|
|
49
47
|
def get_part_three_fieldset(
|
|
50
48
|
collapse=None,
|
|
51
|
-
) ->
|
|
49
|
+
) -> tuple[str, dict]:
|
|
52
50
|
dct = {
|
|
53
51
|
"description": mark_safe( # nosec B308
|
|
54
52
|
"To be completed by the <u>study clinician</u>"
|
|
@@ -67,7 +65,7 @@ def get_part_three_glucose_fieldset(collapse=None):
|
|
|
67
65
|
return "Part 3c: Glucose Measurements (FBG / OGTT)", dct
|
|
68
66
|
|
|
69
67
|
|
|
70
|
-
def get_part_three_repeat_glucose_fieldset(collapse=None) ->
|
|
68
|
+
def get_part_three_repeat_glucose_fieldset(collapse=None) -> tuple[str, dict]:
|
|
71
69
|
fields = [
|
|
72
70
|
"repeat_glucose_performed",
|
|
73
71
|
"repeat_fasting",
|
|
@@ -87,47 +85,47 @@ def get_part_three_repeat_glucose_fieldset(collapse=None) -> Tuple[str, dict]:
|
|
|
87
85
|
return "Part 3d: Repeat Glucose Measurements (FBG / OGTT)", dct
|
|
88
86
|
|
|
89
87
|
|
|
90
|
-
def get_part_three_other_fieldset(collapse=None) ->
|
|
88
|
+
def get_part_three_other_fieldset(collapse=None) -> tuple[str, dict]:
|
|
91
89
|
dct = {"fields": part_three_other_fields}
|
|
92
90
|
if collapse:
|
|
93
91
|
dct.update(classes=("collapse",))
|
|
94
92
|
return "Part 3e: Creatinine / HbA1c", dct
|
|
95
93
|
|
|
96
94
|
|
|
97
|
-
def get_part_three_creatinine_fieldset(collapse=None) ->
|
|
95
|
+
def get_part_three_creatinine_fieldset(collapse=None) -> tuple[str, dict]:
|
|
98
96
|
dct = {"fields": part_three_creatinine_fields}
|
|
99
97
|
if collapse:
|
|
100
98
|
dct.update(classes=("collapse",))
|
|
101
99
|
return "Part 3e: Creatinine", dct
|
|
102
100
|
|
|
103
101
|
|
|
104
|
-
def get_part_three_hba1c_fieldset(collapse=None) ->
|
|
102
|
+
def get_part_three_hba1c_fieldset(collapse=None) -> tuple[str, dict]:
|
|
105
103
|
dct = {"fields": part_three_hba1c_fields}
|
|
106
104
|
if collapse:
|
|
107
105
|
dct.update(classes=("collapse",))
|
|
108
106
|
return "Part 3f: HbA1c", dct
|
|
109
107
|
|
|
110
108
|
|
|
111
|
-
def get_part_three_report_datetime_fieldset() ->
|
|
109
|
+
def get_part_three_report_datetime_fieldset() -> tuple[str, dict]:
|
|
112
110
|
dct = {"fields": ["part_three_report_datetime"]}
|
|
113
111
|
return "Part 3", dct
|
|
114
112
|
|
|
115
113
|
|
|
116
|
-
def get_part_three_vitals_fieldset(collapse=None) ->
|
|
114
|
+
def get_part_three_vitals_fieldset(collapse=None) -> tuple[str, dict]:
|
|
117
115
|
dct = {"fields": part_three_vitals_fields}
|
|
118
116
|
if collapse:
|
|
119
117
|
dct.update(classes=("collapse",))
|
|
120
118
|
return "Part 3a: Vitals", dct
|
|
121
119
|
|
|
122
120
|
|
|
123
|
-
def get_part_three_pregnancy_fieldset(collapse=None) ->
|
|
121
|
+
def get_part_three_pregnancy_fieldset(collapse=None) -> tuple[str, dict]:
|
|
124
122
|
dct = {"fields": part_three_pregnancy_fields}
|
|
125
123
|
if collapse:
|
|
126
124
|
dct.update(classes=("collapse",))
|
|
127
125
|
return "Part 3b: Pregnancy", dct
|
|
128
126
|
|
|
129
127
|
|
|
130
|
-
def get_p3_screening_appt_update_fields(collapse=None) ->
|
|
128
|
+
def get_p3_screening_appt_update_fields(collapse=None) -> tuple[str, dict]:
|
|
131
129
|
dct = {
|
|
132
130
|
"description": mark_safe( # nosec B308
|
|
133
131
|
'<span style="color:orange;font-weight:bold">IMPORTANT:</span>'
|
|
@@ -144,14 +142,14 @@ def get_p3_screening_appt_update_fields(collapse=None) -> Tuple[str, dict]:
|
|
|
144
142
|
return "Part 3 screening appointment update", dct
|
|
145
143
|
|
|
146
144
|
|
|
147
|
-
comments_fieldset:
|
|
145
|
+
comments_fieldset: tuple[str, dict] = (
|
|
148
146
|
"Additional Comments",
|
|
149
147
|
{
|
|
150
148
|
"fields": (*part_three_comment_fields,),
|
|
151
149
|
},
|
|
152
150
|
)
|
|
153
151
|
|
|
154
|
-
calculated_values_fieldset:
|
|
152
|
+
calculated_values_fieldset: tuple[str, dict] = (
|
|
155
153
|
"Calculated values",
|
|
156
154
|
{
|
|
157
155
|
"classes": ("collapse",),
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
+
from clinicedc_constants import NO, NOT_APPLICABLE, PENDING, TBD, YES
|
|
1
2
|
from django.contrib import admin
|
|
2
3
|
from django.db.models import Q
|
|
3
4
|
from edc_appointment.admin import AppointmentListFilter
|
|
4
|
-
from edc_constants.constants import NO, NOT_APPLICABLE, PENDING, TBD, YES
|
|
5
5
|
|
|
6
6
|
from ..constants import PENDING_REPEAT
|
|
7
7
|
|
|
@@ -11,13 +11,13 @@ class EligibilityPending(admin.SimpleListFilter):
|
|
|
11
11
|
|
|
12
12
|
parameter_name = "eligibility_pending"
|
|
13
13
|
|
|
14
|
-
def lookups(self, request, model_admin):
|
|
14
|
+
def lookups(self, request, model_admin): # noqa: ARG002
|
|
15
15
|
return (
|
|
16
16
|
(PENDING, "Pending"),
|
|
17
17
|
(PENDING_REPEAT, "Pending repeat GLU"),
|
|
18
18
|
)
|
|
19
19
|
|
|
20
|
-
def queryset(self, request, queryset):
|
|
20
|
+
def queryset(self, request, queryset): # noqa: ARG002
|
|
21
21
|
if self.value() == PENDING_REPEAT:
|
|
22
22
|
return queryset.filter(
|
|
23
23
|
eligible_part_one=YES,
|
|
@@ -35,6 +35,7 @@ class EligibilityPending(admin.SimpleListFilter):
|
|
|
35
35
|
p3_ltfu=NOT_APPLICABLE,
|
|
36
36
|
part_three_report_datetime__isnull=True,
|
|
37
37
|
)
|
|
38
|
+
return queryset
|
|
38
39
|
|
|
39
40
|
|
|
40
41
|
class P3LtfuListFilter(admin.SimpleListFilter):
|
|
@@ -42,13 +43,13 @@ class P3LtfuListFilter(admin.SimpleListFilter):
|
|
|
42
43
|
|
|
43
44
|
parameter_name = "p3_ltfu_custom"
|
|
44
45
|
|
|
45
|
-
def lookups(self, request, model_admin):
|
|
46
|
+
def lookups(self, request, model_admin): # noqa: ARG002
|
|
46
47
|
return (
|
|
47
48
|
(YES, "Yes"),
|
|
48
49
|
(NO, "No, lost contact"),
|
|
49
50
|
)
|
|
50
51
|
|
|
51
|
-
def queryset(self, request, queryset):
|
|
52
|
+
def queryset(self, request, queryset): # noqa: ARG002
|
|
52
53
|
if self.value() == YES:
|
|
53
54
|
return queryset.filter(
|
|
54
55
|
eligible_part_one=YES,
|
|
@@ -69,6 +70,7 @@ class P3LtfuListFilter(admin.SimpleListFilter):
|
|
|
69
70
|
| Q(eligible_part_two=TBD)
|
|
70
71
|
| Q(eligible_part_three=TBD)
|
|
71
72
|
)
|
|
73
|
+
return queryset
|
|
72
74
|
|
|
73
75
|
|
|
74
76
|
class P3ApptListFilter(AppointmentListFilter):
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
from typing import Tuple
|
|
2
|
-
|
|
3
1
|
from django.contrib import admin
|
|
4
2
|
from django_audit_fields.admin import audit_fieldset_tuple
|
|
5
3
|
from edc_sites.admin import SiteModelAdminMixin
|
|
@@ -35,7 +33,7 @@ class ScreeningPartOneAdmin(SiteModelAdminMixin, SubjectScreeningAdmin):
|
|
|
35
33
|
|
|
36
34
|
fieldsets = get_fieldsets()
|
|
37
35
|
|
|
38
|
-
readonly_fields:
|
|
36
|
+
readonly_fields: tuple[str, ...] = (
|
|
39
37
|
*part_two_fields,
|
|
40
38
|
*part_three_fields,
|
|
41
39
|
*calculated_fields,
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
from copy import deepcopy
|
|
2
|
-
from typing import Tuple
|
|
3
2
|
|
|
4
3
|
from django.contrib import admin
|
|
5
4
|
from django_audit_fields.admin import audit_fieldset_tuple
|
|
@@ -30,7 +29,7 @@ from .list_filters import EligibilityPending, P3ApptListFilter, P3LtfuListFilter
|
|
|
30
29
|
from .subject_screening_admin import SubjectScreeningAdmin
|
|
31
30
|
|
|
32
31
|
|
|
33
|
-
def get_part_two_fieldset_without_contact_number() ->
|
|
32
|
+
def get_part_two_fieldset_without_contact_number() -> tuple[str, dict]:
|
|
34
33
|
"""Remove contact number from the part 2 fields"""
|
|
35
34
|
part_two_name, part_two_dct = get_part_two_fieldset(collapse=True)
|
|
36
35
|
part_two_dct = deepcopy(part_two_dct)
|
|
@@ -76,7 +75,7 @@ class ScreeningPartThreeAdmin(SiteModelAdminMixin, SubjectScreeningAdmin):
|
|
|
76
75
|
"refused",
|
|
77
76
|
)
|
|
78
77
|
|
|
79
|
-
readonly_fields:
|
|
78
|
+
readonly_fields: tuple[str, ...] = (
|
|
80
79
|
*part_one_fields,
|
|
81
80
|
*(f for f in part_two_fields if f != "contact_number"),
|
|
82
81
|
*calculated_fields,
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
from typing import Tuple
|
|
2
|
-
|
|
3
1
|
from django.contrib import admin
|
|
4
2
|
from django_audit_fields.admin import audit_fieldset_tuple
|
|
5
3
|
from edc_sites.admin import SiteModelAdminMixin
|
|
@@ -21,12 +19,12 @@ from .fieldsets import (
|
|
|
21
19
|
from .subject_screening_admin import SubjectScreeningAdmin
|
|
22
20
|
|
|
23
21
|
|
|
24
|
-
def get_fieldsets() ->
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
22
|
+
def get_fieldsets() -> tuple[
|
|
23
|
+
tuple[str, dict],
|
|
24
|
+
tuple[str, dict],
|
|
25
|
+
tuple[str, dict],
|
|
26
|
+
tuple[str, dict],
|
|
27
|
+
tuple[str, dict],
|
|
30
28
|
]:
|
|
31
29
|
return (
|
|
32
30
|
get_part_one_fieldset(collapse=True),
|
|
@@ -39,12 +37,11 @@ def get_fieldsets() -> Tuple[
|
|
|
39
37
|
|
|
40
38
|
@admin.register(ScreeningPartTwo, site=meta_screening_admin)
|
|
41
39
|
class ScreeningPartTwoAdmin(SiteModelAdminMixin, SubjectScreeningAdmin):
|
|
42
|
-
|
|
43
40
|
form = ScreeningPartTwoForm
|
|
44
41
|
|
|
45
42
|
fieldsets = get_fieldsets()
|
|
46
43
|
|
|
47
|
-
readonly_fields:
|
|
44
|
+
readonly_fields: tuple[str, ...] = (
|
|
48
45
|
*part_one_fields,
|
|
49
46
|
*part_three_fields,
|
|
50
47
|
*calculated_fields,
|
|
@@ -17,7 +17,7 @@ class SubjectRefusalAdmin(
|
|
|
17
17
|
):
|
|
18
18
|
form = SubjectRefusalForm
|
|
19
19
|
|
|
20
|
-
autocomplete_fields =
|
|
20
|
+
autocomplete_fields = ("subject_screening",)
|
|
21
21
|
|
|
22
22
|
post_url_on_delete_name = "screening_listboard_url"
|
|
23
23
|
subject_listboard_url_name = "screening_listboard_url"
|
|
@@ -54,7 +54,7 @@ class SubjectRefusalAdmin(
|
|
|
54
54
|
"subject_screening__initials",
|
|
55
55
|
)
|
|
56
56
|
|
|
57
|
-
radio_fields = {"reason": admin.VERTICAL}
|
|
57
|
+
radio_fields = {"reason": admin.VERTICAL} # noqa: RUF012
|
|
58
58
|
|
|
59
59
|
def get_subject_dashboard_url_kwargs(self, obj):
|
|
60
60
|
return dict(screening_identifier=obj.screening_identifier)
|
|
@@ -69,5 +69,7 @@ class SubjectRefusalAdmin(
|
|
|
69
69
|
if callable(super().view_on_site):
|
|
70
70
|
url = super().view_on_site(obj)
|
|
71
71
|
else:
|
|
72
|
-
raise NoReverseMatch(
|
|
72
|
+
raise NoReverseMatch(
|
|
73
|
+
f"{e}. See subject_dashboard_url_name for {self!r}."
|
|
74
|
+
) from e
|
|
73
75
|
return url
|
|
@@ -1,11 +1,12 @@
|
|
|
1
|
+
from clinicedc_constants import YES
|
|
1
2
|
from django.contrib import admin
|
|
2
3
|
from django.template.loader import render_to_string
|
|
3
4
|
from django.urls.base import reverse
|
|
4
5
|
from django.urls.exceptions import NoReverseMatch
|
|
5
6
|
from django.utils.html import format_html
|
|
7
|
+
from django.utils.safestring import mark_safe
|
|
6
8
|
from django.utils.translation import gettext_lazy as _
|
|
7
9
|
from django_audit_fields.admin import audit_fieldset_tuple
|
|
8
|
-
from edc_constants.constants import YES
|
|
9
10
|
from edc_dashboard.url_names import url_names
|
|
10
11
|
from edc_model_admin.dashboard import ModelAdminSubjectDashboardMixin
|
|
11
12
|
from edc_model_admin.history import SimpleHistoryAdmin
|
|
@@ -30,7 +31,8 @@ class SubjectScreeningAdmin(ModelAdminSubjectDashboardMixin, SimpleHistoryAdmin)
|
|
|
30
31
|
form = SubjectScreeningForm
|
|
31
32
|
list_per_page = 15
|
|
32
33
|
post_url_on_delete_name = "screening_listboard_url"
|
|
33
|
-
subject_listboard_url_name = "screening_listboard_url"
|
|
34
|
+
subject_listboard_url_name = "screening_listboard_url" # :FIXME is this ok?
|
|
35
|
+
screening_listboard_url_name = "screening_listboard_url"
|
|
34
36
|
|
|
35
37
|
additional_instructions = (
|
|
36
38
|
"Patients must meet ALL of the inclusion criteria and NONE of the "
|
|
@@ -96,7 +98,7 @@ class SubjectScreeningAdmin(ModelAdminSubjectDashboardMixin, SimpleHistoryAdmin)
|
|
|
96
98
|
"inclusion_d",
|
|
97
99
|
)
|
|
98
100
|
|
|
99
|
-
radio_fields = {
|
|
101
|
+
radio_fields = { # noqa: RUF012
|
|
100
102
|
"acute_condition": admin.VERTICAL,
|
|
101
103
|
"acute_metabolic_acidosis": admin.VERTICAL,
|
|
102
104
|
"advised_to_fast": admin.VERTICAL,
|
|
@@ -144,11 +146,11 @@ class SubjectScreeningAdmin(ModelAdminSubjectDashboardMixin, SimpleHistoryAdmin)
|
|
|
144
146
|
"vl_undetectable": admin.VERTICAL,
|
|
145
147
|
}
|
|
146
148
|
|
|
147
|
-
def post_url_on_delete_kwargs(self, request, obj):
|
|
149
|
+
def post_url_on_delete_kwargs(self, request, obj): # noqa: ARG002
|
|
148
150
|
return {}
|
|
149
151
|
|
|
150
152
|
# TODO: this is a hack!
|
|
151
|
-
def get_post_url_on_delete_name(self, request) -> str:
|
|
153
|
+
def get_post_url_on_delete_name(self, request) -> str: # noqa: ARG002
|
|
152
154
|
return url_names.get(self.post_url_on_delete_name)
|
|
153
155
|
|
|
154
156
|
@staticmethod
|
|
@@ -160,7 +162,10 @@ class SubjectScreeningAdmin(ModelAdminSubjectDashboardMixin, SimpleHistoryAdmin)
|
|
|
160
162
|
]
|
|
161
163
|
if obj.repeat_glucose_opinion == YES:
|
|
162
164
|
data.append(f"Contact #: {obj.contact_number or '--'}")
|
|
163
|
-
return format_html(
|
|
165
|
+
return format_html(
|
|
166
|
+
"{}",
|
|
167
|
+
mark_safe("<BR>".join(data)), # noqa: S308
|
|
168
|
+
)
|
|
164
169
|
|
|
165
170
|
def reasons(self, obj=None):
|
|
166
171
|
if not obj.reasons_ineligible:
|
|
@@ -170,15 +175,21 @@ class SubjectScreeningAdmin(ModelAdminSubjectDashboardMixin, SimpleHistoryAdmin)
|
|
|
170
175
|
def eligibility_status(self, obj=None):
|
|
171
176
|
eligibility = MetaEligibility(obj, update_model=False)
|
|
172
177
|
screening_listboard_url = reverse(
|
|
173
|
-
url_names.get(self.
|
|
178
|
+
url_names.get(self.screening_listboard_url_name), args=(obj.screening_identifier,)
|
|
174
179
|
)
|
|
175
180
|
context = dict(
|
|
176
181
|
title="Go to screening listboard",
|
|
177
182
|
url=f"{screening_listboard_url}?q={obj.screening_identifier}",
|
|
178
183
|
label="Screening",
|
|
179
184
|
)
|
|
180
|
-
button = render_to_string(
|
|
181
|
-
|
|
185
|
+
button = render_to_string(
|
|
186
|
+
"edc_subject_dashboard/dashboard_button.html", context=context
|
|
187
|
+
)
|
|
188
|
+
return format_html(
|
|
189
|
+
"{button}<BR>{status}",
|
|
190
|
+
button=button,
|
|
191
|
+
status=eligibility.eligibility_status(add_urls=True),
|
|
192
|
+
)
|
|
182
193
|
|
|
183
194
|
def dashboard(self, obj=None, label=None):
|
|
184
195
|
try:
|
|
@@ -187,7 +198,7 @@ class SubjectScreeningAdmin(ModelAdminSubjectDashboardMixin, SimpleHistoryAdmin)
|
|
|
187
198
|
kwargs=self.get_subject_dashboard_url_kwargs(obj),
|
|
188
199
|
)
|
|
189
200
|
except NoReverseMatch:
|
|
190
|
-
url = reverse(
|
|
201
|
+
url = reverse(self.get_screening_listboard_url_name(), kwargs={})
|
|
191
202
|
context = dict(
|
|
192
203
|
title="Go to screening listboard",
|
|
193
204
|
url=f"{url}?q={obj.screening_identifier}",
|
meta_screening/baker_recipes.py
CHANGED
|
@@ -1,8 +1,16 @@
|
|
|
1
|
+
from clinicedc_constants import (
|
|
2
|
+
BLACK,
|
|
3
|
+
FEMALE,
|
|
4
|
+
MILLIGRAMS_PER_DECILITER,
|
|
5
|
+
MILLIMOLES_PER_LITER,
|
|
6
|
+
NO,
|
|
7
|
+
NOT_APPLICABLE,
|
|
8
|
+
NULL_STRING,
|
|
9
|
+
YES,
|
|
10
|
+
)
|
|
1
11
|
from dateutil.relativedelta import relativedelta
|
|
2
12
|
from django.contrib.sites.models import Site
|
|
3
|
-
from
|
|
4
|
-
from edc_reportable.units import MILLIGRAMS_PER_DECILITER, MILLIMOLES_PER_LITER
|
|
5
|
-
from edc_utils import get_utcnow
|
|
13
|
+
from django.utils import timezone
|
|
6
14
|
from faker import Faker
|
|
7
15
|
from model_bakery.recipe import Recipe
|
|
8
16
|
|
|
@@ -13,11 +21,11 @@ fake = Faker()
|
|
|
13
21
|
|
|
14
22
|
subjectscreening = Recipe(
|
|
15
23
|
SubjectScreening,
|
|
16
|
-
report_datetime=
|
|
24
|
+
report_datetime=timezone.now() - relativedelta(days=1),
|
|
17
25
|
screening_consent=YES,
|
|
18
26
|
hospital_identifier="111",
|
|
19
27
|
initials="ZZ",
|
|
20
|
-
subject_identifier=
|
|
28
|
+
subject_identifier=NULL_STRING,
|
|
21
29
|
gender=FEMALE,
|
|
22
30
|
age_in_years=40,
|
|
23
31
|
ethnicity=BLACK,
|
|
@@ -29,7 +37,7 @@ subjectscreening = Recipe(
|
|
|
29
37
|
staying_nearby_12=YES,
|
|
30
38
|
pregnant=NO,
|
|
31
39
|
site=Site.objects.get_current(),
|
|
32
|
-
part_two_report_datetime=
|
|
40
|
+
part_two_report_datetime=timezone.now() - relativedelta(days=1),
|
|
33
41
|
congestive_heart_failure=NO,
|
|
34
42
|
liver_disease=NO,
|
|
35
43
|
alcoholism=NO,
|
|
@@ -39,8 +47,8 @@ subjectscreening = Recipe(
|
|
|
39
47
|
acute_condition=NO,
|
|
40
48
|
metformin_sensitivity=NO,
|
|
41
49
|
advised_to_fast=YES,
|
|
42
|
-
appt_datetime=
|
|
43
|
-
part_three_report_datetime=
|
|
50
|
+
appt_datetime=timezone.now() + relativedelta(days=1),
|
|
51
|
+
part_three_report_datetime=timezone.now(),
|
|
44
52
|
weight=65,
|
|
45
53
|
height=120,
|
|
46
54
|
fasting=YES,
|
|
@@ -51,8 +59,8 @@ subjectscreening = Recipe(
|
|
|
51
59
|
creatinine_units=MILLIGRAMS_PER_DECILITER,
|
|
52
60
|
fbg_value=6.9,
|
|
53
61
|
fbg_units=MILLIMOLES_PER_LITER,
|
|
54
|
-
fbg_datetime=
|
|
55
|
-
ogtt_base_datetime=
|
|
62
|
+
fbg_datetime=timezone.now(),
|
|
63
|
+
ogtt_base_datetime=timezone.now(),
|
|
56
64
|
unsuitable_for_study=NO,
|
|
57
65
|
unsuitable_agreed=NOT_APPLICABLE,
|
|
58
66
|
vl_undetectable=YES,
|
meta_screening/calculators.py
CHANGED
meta_screening/choices.py
CHANGED
meta_screening/constants.py
CHANGED
|
@@ -6,3 +6,12 @@ from .eligibility import (
|
|
|
6
6
|
from .eligibility_part_one import EligibilityPartOne
|
|
7
7
|
from .eligibility_part_three import EligibilityPartThreePhaseThree
|
|
8
8
|
from .eligibility_part_two import EligibilityPartTwo
|
|
9
|
+
|
|
10
|
+
__all__ = [
|
|
11
|
+
"EligibilityPartOne",
|
|
12
|
+
"EligibilityPartThreePhaseThree",
|
|
13
|
+
"EligibilityPartTwo",
|
|
14
|
+
"MetaEligibility",
|
|
15
|
+
"SubjectScreeningEligibilityError",
|
|
16
|
+
"get_display_label",
|
|
17
|
+
]
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
from typing import Any
|
|
2
2
|
|
|
3
|
+
from clinicedc_constants import NO, TBD, YES
|
|
3
4
|
from django.db import models
|
|
4
5
|
from django.urls import reverse
|
|
5
6
|
from django.utils.html import format_html
|
|
6
|
-
from edc_constants.constants import NO, TBD, YES
|
|
7
7
|
from edc_utils import get_utcnow
|
|
8
8
|
|
|
9
9
|
from ..constants import EGFR_NOT_CALCULATED
|
|
@@ -16,7 +16,7 @@ class SubjectScreeningEligibilityError(Exception):
|
|
|
16
16
|
pass
|
|
17
17
|
|
|
18
18
|
|
|
19
|
-
def get_eligible_as_word(
|
|
19
|
+
def get_eligible_as_word( # noqa: PLR0913
|
|
20
20
|
obj=None,
|
|
21
21
|
eligible_part_one=None,
|
|
22
22
|
eligible_part_two=None,
|
|
@@ -90,8 +90,8 @@ class MetaEligibility:
|
|
|
90
90
|
|
|
91
91
|
"""
|
|
92
92
|
|
|
93
|
-
eligibility_values =
|
|
94
|
-
default_options = dict(
|
|
93
|
+
eligibility_values = (YES, NO, TBD)
|
|
94
|
+
default_options = dict( # noqa: RUF012
|
|
95
95
|
eligible_value_default=TBD,
|
|
96
96
|
eligible_values_list=[YES, NO, TBD],
|
|
97
97
|
is_eligible_value=YES,
|
|
@@ -99,8 +99,8 @@ class MetaEligibility:
|
|
|
99
99
|
|
|
100
100
|
def __init__(
|
|
101
101
|
self,
|
|
102
|
-
model_obj: models.Model = None,
|
|
103
|
-
defaults: dict = None,
|
|
102
|
+
model_obj: models.Model | None = None,
|
|
103
|
+
defaults: dict | None = None,
|
|
104
104
|
update_model=None,
|
|
105
105
|
):
|
|
106
106
|
self.part_one = None
|
|
@@ -162,7 +162,7 @@ class MetaEligibility:
|
|
|
162
162
|
@property
|
|
163
163
|
def is_eligible(self: Any) -> bool:
|
|
164
164
|
"""Returns True if eligible else False"""
|
|
165
|
-
return
|
|
165
|
+
return self.eligible == YES
|
|
166
166
|
|
|
167
167
|
def check_eligibility_values_or_raise(self: Any):
|
|
168
168
|
for response in [
|
|
@@ -195,15 +195,22 @@ class MetaEligibility:
|
|
|
195
195
|
args=(self.part_three.model_obj.id,),
|
|
196
196
|
)
|
|
197
197
|
status_str = format_html(
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
198
|
+
'<A href="{url_p1}">P1: {p1_eligible}</A>'
|
|
199
|
+
'<BR><A href="{url_p2}">P2: {p2_eligible}</A>'
|
|
200
|
+
'<BR><A href="{url_p3}">P3: {p3_eligible}</A><BR>',
|
|
201
|
+
url_p1=url_p1,
|
|
202
|
+
p1_eligible=self.part_one.eligible.upper(),
|
|
203
|
+
url_p2=url_p2,
|
|
204
|
+
p2_eligible=self.part_two.eligible.upper(),
|
|
205
|
+
url_p3=url_p3,
|
|
206
|
+
p3_eligible=self.part_three.eligible.upper(),
|
|
201
207
|
)
|
|
202
208
|
else:
|
|
203
|
-
status_str = (
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
209
|
+
status_str = format_html(
|
|
210
|
+
"P1: {p1_eligible}<BR>P2: {p2_eligible}<BR>P3: {p3_eligible}<BR>",
|
|
211
|
+
p1_eligible=self.part_one.eligible.upper(),
|
|
212
|
+
p2_eligible=self.part_two.eligible.upper(),
|
|
213
|
+
p3_eligible=self.part_three.eligible.upper(),
|
|
207
214
|
)
|
|
208
215
|
display_label = self.display_label
|
|
209
216
|
if "PENDING" in display_label:
|