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.
Files changed (637) hide show
  1. meta_ae/action_items.py +38 -27
  2. meta_ae/admin/__init__.py +11 -0
  3. meta_ae/admin/ae_initial_admin.py +5 -2
  4. meta_ae/admin/ae_susar_admin.py +1 -1
  5. meta_ae/admin/death_report_admin.py +1 -1
  6. meta_ae/admin/modeladmin_mixins.py +14 -15
  7. meta_ae/baker_recipes.py +4 -6
  8. meta_ae/choices.py +1 -1
  9. meta_ae/forms/__init__.py +13 -0
  10. meta_ae/forms/death_report_form.py +1 -1
  11. meta_ae/forms/modelform_mixins.py +2 -2
  12. meta_ae/list_data.py +1 -1
  13. meta_ae/migrations/0001_initial.py +27 -27
  14. meta_ae/migrations/0006_aelocalreview_aesponsorreview.py +5 -5
  15. meta_ae/migrations/0017_auto_20221130_2257.py +1 -1
  16. meta_ae/migrations/0022_historicalhospitalization_hospitalization.py +5 -13
  17. meta_ae/migrations/0023_alter_aefollowup_action_identifier_and_more.py +2017 -0
  18. meta_ae/model_mixins/__init__.py +2 -0
  19. meta_ae/model_mixins/ae_review_model_mixin.py +6 -6
  20. meta_ae/model_mixins/death_report_model_mixin.py +3 -3
  21. meta_ae/models/__init__.py +13 -0
  22. meta_ae/models/hospitalization.py +3 -3
  23. meta_ae/pdf_reports/__init__.py +2 -0
  24. meta_ae/templatetags/meta_ae_extras.py +4 -6
  25. meta_analytics/.DS_Store +0 -0
  26. meta_analytics/README.rst +1 -2
  27. meta_analytics/dataframes/__init__.py +27 -0
  28. meta_analytics/dataframes/constants.py +5 -2
  29. meta_analytics/dataframes/get_eos_df.py +16 -4
  30. meta_analytics/dataframes/get_glucose_df.py +166 -0
  31. meta_analytics/dataframes/get_glucose_fbg_df.py +26 -0
  32. meta_analytics/dataframes/get_glucose_fbg_ogtt_df.py +21 -0
  33. meta_analytics/dataframes/get_last_imp_visits_df.py +12 -10
  34. meta_analytics/dataframes/glucose_endpoints/__init__.py +2 -0
  35. meta_analytics/dataframes/glucose_endpoints/endpoint_by_date.py +125 -124
  36. meta_analytics/dataframes/glucose_endpoints/glucose_endpoints_by_date.py +111 -235
  37. meta_analytics/dataframes/screening/__init__.py +2 -0
  38. meta_analytics/dataframes/screening/get_glucose_tested_only_df.py +1 -2
  39. meta_analytics/dataframes/screening/get_screening_df.py +9 -15
  40. meta_analytics/dataframes/utils.py +21 -12
  41. meta_analytics/get_tables.py +1 -2
  42. meta_analytics/tables/__init__.py +2 -0
  43. meta_analytics/tables/enrolled/glucose.py +2 -1
  44. meta_analytics/utils.py +81 -0
  45. meta_auth/auths.py +1 -1
  46. meta_consent/action_items.py +22 -3
  47. meta_consent/admin/__init__.py +7 -0
  48. meta_consent/admin/actions/__init__.py +2 -0
  49. meta_consent/admin/actions/create_missing_prescriptions.py +2 -2
  50. meta_consent/admin/list_filters.py +22 -0
  51. meta_consent/admin/modeladmin_mixins.py +4 -5
  52. meta_consent/admin/subject_consent_v1_ext_admin.py +93 -0
  53. meta_consent/baker_recipes.py +7 -7
  54. meta_consent/consents.py +15 -2
  55. meta_consent/constants.py +1 -0
  56. meta_consent/form_validators/__init__.py +2 -0
  57. meta_consent/forms/__init__.py +8 -0
  58. meta_consent/forms/subject_consent_v1_ext_form.py +47 -0
  59. meta_consent/forms/subject_reconsent_form.py +4 -4
  60. meta_consent/management/commands/create_missing_prescriptions.py +5 -3
  61. meta_consent/migrations/0001_initial.py +9 -9
  62. meta_consent/migrations/0024_historicalsubjectconsentv1.py +3 -8
  63. meta_consent/migrations/0026_historicalsubjectconsentv1ext_subjectconsentv1ext.py +535 -0
  64. meta_consent/migrations/0027_auto_20250111_0344.py +30 -0
  65. meta_consent/migrations/0028_historicalsubjectconsentv1ext_assessment_score_and_more.py +162 -0
  66. meta_consent/migrations/0029_alter_historicalsubjectconsentv1ext_agrees_to_extension_and_more.py +33 -0
  67. meta_consent/migrations/0030_auto_20250120_2114.py +40 -0
  68. meta_consent/migrations/0031_alter_historicalsubjectconsent_guardian_name_and_more.py +124 -0
  69. meta_consent/migrations/0032_alter_historicalsubjectconsent_device_created_and_more.py +678 -0
  70. meta_consent/migrations/0033_historicalsubjectconsentspfq_subjectconsentspfq.py +615 -0
  71. meta_consent/migrations/0034_remove_subjectconsentspfq_site_and_more.py +23 -0
  72. meta_consent/migrations/0035_alter_historicalsubjectconsent_consent_definition_name_and_more.py +43 -0
  73. meta_consent/models/__init__.py +10 -0
  74. meta_consent/models/model_mixins.py +1 -2
  75. meta_consent/models/signals.py +25 -11
  76. meta_consent/models/subject_consent.py +2 -2
  77. meta_consent/models/subject_consent_v1.py +0 -1
  78. meta_consent/models/subject_consent_v1_ext.py +34 -0
  79. meta_consent/models/subject_reconsent.py +4 -4
  80. meta_dashboard/navbars.py +2 -6
  81. meta_dashboard/patterns.py +1 -1
  82. meta_dashboard/templates/meta_dashboard/{bootstrap3/buttons → buttons}/eligibility_button.html +1 -1
  83. meta_dashboard/templates/meta_dashboard/{bootstrap3/buttons → buttons}/screening_button.html +1 -1
  84. meta_dashboard/templates/meta_dashboard/subject/dashboard/sidebar.html +24 -0
  85. meta_dashboard/templates/meta_dashboard/{bootstrap3/subject → subject}/dashboard/top_bar.html +1 -1
  86. meta_dashboard/templates/meta_dashboard/subject/dashboard.html +14 -0
  87. meta_dashboard/templatetags/meta_dashboard_extras.py +9 -14
  88. meta_dashboard/urls.py +5 -5
  89. meta_dashboard/view_utils/__init__.py +13 -0
  90. meta_dashboard/view_utils/subject_screening_button.py +13 -20
  91. meta_dashboard/views/__init__.py +8 -0
  92. meta_dashboard/views/ae/__init__.py +2 -0
  93. meta_dashboard/views/ae/ae_listboard_view.py +1 -1
  94. meta_dashboard/views/ae/death_report_listboard_view.py +1 -1
  95. meta_dashboard/views/screening/__init__.py +2 -0
  96. meta_dashboard/views/screening/listboard_view.py +2 -3
  97. meta_dashboard/views/subject/__init__.py +2 -0
  98. meta_dashboard/views/subject/dashboard/__init__.py +2 -0
  99. meta_dashboard/views/subject/dashboard/dashboard_view.py +19 -8
  100. meta_dashboard/views/subject/listboard/__init__.py +2 -0
  101. meta_dashboard/views/subject/listboard/listboard_view.py +2 -3
  102. meta_edc/__init__.py +5 -9
  103. meta_edc/admin.py +3 -4
  104. meta_edc/celery.py +2 -2
  105. meta_edc/celery_live.py +19 -0
  106. meta_edc/celery_uat.py +25 -0
  107. meta_edc/management/commands/update_forms_reference.py +16 -14
  108. meta_edc/meta_version.py +2 -2
  109. meta_edc/navbars.py +7 -5
  110. meta_edc/settings/debug.py +13 -4
  111. meta_edc/settings/defaults.py +55 -18
  112. meta_edc/settings/live.py +4 -1
  113. meta_edc/settings/logging.py +9 -4
  114. meta_edc/settings/minimal.py +4 -5
  115. meta_edc/settings/uat.py +3 -1
  116. meta_edc/templates/meta_edc/{bootstrap3/base.html → base.html} +1 -1
  117. meta_edc/templates/meta_edc/{bootstrap3/home.html → home.html} +2 -2
  118. meta_edc/urls.py +3 -1
  119. meta_edc/utils.py +3 -1
  120. meta_edc/views/__init__.py +2 -0
  121. meta_edc/views/home_view.py +1 -2
  122. meta_edc-1.4.0.dist-info/METADATA +174 -0
  123. {meta_edc-0.3.39.dist-info → meta_edc-1.4.0.dist-info}/RECORD +578 -586
  124. meta_edc-1.4.0.dist-info/WHEEL +4 -0
  125. meta_labs/list_data.py +2 -2
  126. meta_labs/reportables.py +80 -11
  127. meta_lists/list_data.py +13 -4
  128. meta_lists/migrations/0008_auto_20200528_1517.py +2 -2
  129. meta_lists/migrations/0019_auto_20250128_0143.py +48 -0
  130. meta_lists/migrations/0020_alter_abnormalfootappearanceobservations_extra_value_and_more.py +404 -0
  131. meta_pharmacy/admin/__init__.py +5 -0
  132. meta_pharmacy/admin/rx_admin.py +1 -0
  133. meta_pharmacy/admin/substitutions_admin.py +3 -3
  134. meta_pharmacy/constants.py +1 -1
  135. meta_pharmacy/forms/__init__.py +2 -0
  136. meta_pharmacy/forms/rx_form.py +0 -1
  137. meta_pharmacy/forms/substitutions_form.py +6 -4
  138. meta_pharmacy/labels/__init__.py +5 -2
  139. meta_pharmacy/labels/draw_label_for_subject_with_barcode.py +4 -1
  140. meta_pharmacy/labels/draw_label_with_test_data.py +2 -2
  141. meta_pharmacy/labels/label_data.py +1 -2
  142. meta_pharmacy/labels/print_sheets.py +4 -6
  143. meta_pharmacy/management/commands/update_initial_pharmacy_data.py +4 -3
  144. meta_pharmacy/migrations/0002_initial.py +7 -20
  145. meta_pharmacy/migrations/0003_auto_20240909_2335.py +3 -2
  146. meta_pharmacy/migrations/0006_lotnumber_label.py +5 -14
  147. meta_pharmacy/migrations/0008_remove_lotnumber_medication_and_more.py +5 -6
  148. meta_pharmacy/migrations/0010_alter_historicallabeldata_device_created_and_more.py +382 -0
  149. meta_pharmacy/models/__init__.py +7 -0
  150. meta_pharmacy/models/label_data.py +4 -5
  151. meta_pharmacy/models/rx_label.py +0 -1
  152. meta_pharmacy/models/substitutions.py +4 -4
  153. meta_pharmacy/prepare_meta_pharmacy.py +1 -1
  154. meta_pharmacy/utils/__init__.py +2 -0
  155. meta_pharmacy/utils/update_initial_pharmacy_data.py +1 -1
  156. meta_prn/action_items.py +44 -45
  157. meta_prn/admin/__init__.py +16 -0
  158. meta_prn/admin/dm_referral_admin.py +2 -1
  159. meta_prn/admin/end_of_study_admin.py +26 -15
  160. meta_prn/admin/loss_to_followup_admin.py +3 -2
  161. meta_prn/admin/off_study_medication_admin.py +5 -6
  162. meta_prn/admin/offschedule_admin.py +12 -11
  163. meta_prn/admin/offschedule_dm_referral_admin.py +11 -10
  164. meta_prn/admin/offschedule_postnatal_admin.py +15 -7
  165. meta_prn/admin/offschedule_pregnancy_admin.py +18 -9
  166. meta_prn/admin/onschedule_admin.py +7 -8
  167. meta_prn/admin/onschedule_dm_referral_admin.py +11 -12
  168. meta_prn/admin/pregnancy_notification_admin.py +5 -6
  169. meta_prn/admin/protocol_incident_admin.py +1 -1
  170. meta_prn/admin/subject_transfer_admin.py +1 -1
  171. meta_prn/baker_recipes.py +10 -10
  172. meta_prn/choices.py +11 -7
  173. meta_prn/constants.py +1 -0
  174. meta_prn/form_validators/__init__.py +5 -0
  175. meta_prn/form_validators/end_of_study.py +65 -20
  176. meta_prn/form_validators/protocol_incident.py +1 -1
  177. meta_prn/forms/__init__.py +13 -0
  178. meta_prn/forms/dm_referral_form.py +2 -8
  179. meta_prn/forms/end_of_study_form.py +1 -1
  180. meta_prn/forms/loss_to_followup_form.py +1 -1
  181. meta_prn/forms/off_study_medication_form.py +2 -2
  182. meta_prn/forms/offschedule_form.py +25 -0
  183. meta_prn/forms/pregnancy_notification_form.py +15 -17
  184. meta_prn/list_data.py +3 -3
  185. meta_prn/migrations/0001_initial.py +25 -25
  186. meta_prn/migrations/0017_auto_20220307_1929.py +5 -5
  187. meta_prn/migrations/0018_auto_20220309_2106.py +9 -9
  188. meta_prn/migrations/0021_auto_20220316_2147.py +13 -13
  189. meta_prn/migrations/0022_auto_20220318_0133.py +9 -9
  190. meta_prn/migrations/0032_historicalegfrnotification_egfrnotification.py +5 -13
  191. meta_prn/migrations/0034_auto_20220630_1110.py +1 -1
  192. meta_prn/migrations/0035_auto_20220630_1140.py +1 -1
  193. meta_prn/migrations/0038_alter_endofstudy_delivery_date_and_more.py +5 -13
  194. meta_prn/migrations/0041_endofstudy_transfer_date_and_more.py +5 -13
  195. meta_prn/migrations/0057_historicalonscheduledmreferral_and_more.py +13 -38
  196. meta_prn/migrations/0060_alter_onschedule_managers_and_more.py +55 -0
  197. meta_prn/migrations/0061_auto_20250115_2025.py +56 -0
  198. meta_prn/migrations/0062_alter_endofstudy_offstudy_reason_and_more.py +72 -0
  199. meta_prn/migrations/0063_historicaloffstudymedication_singleton_field_and_more.py +37 -0
  200. meta_prn/migrations/0064_auto_20250602_2143.py +18 -0
  201. meta_prn/migrations/0065_alter_historicaloffstudymedication_subject_identifier_and_more.py +23 -0
  202. meta_prn/migrations/0066_alter_historicallosstofollowup_subject_identifier_and_more.py +23 -0
  203. meta_prn/migrations/0067_alter_offschedule_managers_and_more.py +2557 -0
  204. meta_prn/migrations/0068_alter_dmreferral_referral_note_and_more.py +235 -0
  205. meta_prn/migrations/0069_alter_historicaloffstudymedication_singleton_field_and_more.py +37 -0
  206. meta_prn/models/__init__.py +20 -0
  207. meta_prn/models/dm_referral.py +2 -2
  208. meta_prn/models/end_of_study.py +28 -23
  209. meta_prn/models/loss_to_followup.py +8 -10
  210. meta_prn/models/off_study_medication.py +7 -4
  211. meta_prn/models/offschedule.py +4 -4
  212. meta_prn/models/pregnancy_notification.py +3 -5
  213. meta_prn/models/protocol_incident.py +5 -2
  214. meta_prn/models/signals.py +16 -14
  215. meta_prn/models/subject_transfer.py +7 -0
  216. meta_prn/templates/meta_prn/eos/additional_instructions.html +3 -0
  217. meta_prn/templates/meta_prn/offschedule/additional_instructions.html +2 -0
  218. meta_rando/migrations/0001_initial.py +5 -5
  219. meta_rando/migrations/0006_alter_historicalrandomizationlist_allocated_user_and_more.py +130 -0
  220. meta_rando/migrations/0007_spfqlist.py +197 -0
  221. meta_rando/migrations/0008_delete_spfqlist.py +16 -0
  222. meta_rando/models/__init__.py +1 -0
  223. meta_rando/{models.py → models/randomization_list.py} +3 -3
  224. meta_rando/randomizers.py +2 -2
  225. meta_reports/__init__.py +2 -0
  226. meta_reports/admin/__init__.py +16 -0
  227. meta_reports/admin/dbviews/__init__.py +13 -0
  228. meta_reports/admin/dbviews/glucose_summary_admin.py +7 -7
  229. meta_reports/admin/dbviews/imp_substitutions_admin.py +14 -13
  230. meta_reports/admin/dbviews/missing_screening_ogtt_admin/__init__.py +5 -0
  231. meta_reports/admin/dbviews/missing_screening_ogtt_admin/note_model_admin.py +27 -3
  232. meta_reports/admin/dbviews/missing_screening_ogtt_admin/unmanaged_model_admin.py +7 -7
  233. meta_reports/admin/dbviews/on_study_missing_lab_values_admin/__init__.py +2 -0
  234. meta_reports/admin/dbviews/on_study_missing_lab_values_admin/unmanaged_model_admin.py +0 -3
  235. meta_reports/admin/dbviews/on_study_missing_values_admin/__init__.py +2 -0
  236. meta_reports/admin/dbviews/on_study_missing_values_admin/unmanaged_model_admin.py +0 -1
  237. meta_reports/admin/dbviews/patient_history_missing_baseline_cd4_admin.py +9 -9
  238. meta_reports/admin/dbviews/unattended_three_in_row2_admin.py +6 -6
  239. meta_reports/admin/dbviews/unattended_three_in_row_admin.py +5 -5
  240. meta_reports/admin/dbviews/unattended_two_in_row_admin.py +5 -5
  241. meta_reports/admin/endpoints_admin.py +1 -1
  242. meta_reports/admin/endpoints_all_admin.py +0 -1
  243. meta_reports/admin/last_imp_refill_admin.py +33 -36
  244. meta_reports/admin/list_filters.py +3 -3
  245. meta_reports/admin/modeladmin_mixins.py +10 -17
  246. meta_reports/death_report.py +2 -2
  247. meta_reports/forms/__init__.py +2 -0
  248. meta_reports/forms/missing_ogtt_note_form.py +3 -4
  249. meta_reports/management/commands/generate_endpoints.py +5 -4
  250. meta_reports/migrations/0035_historicalmissingogttnote_missingogttnote.py +5 -14
  251. meta_reports/migrations/0054_auto_20250422_2003.py +81 -0
  252. meta_reports/migrations/0055_alter_glucosesummary_table.py +17 -0
  253. meta_reports/migrations/0056_auto_20250422_2214.py +54 -0
  254. meta_reports/migrations/0057_auto_20250422_2224.py +54 -0
  255. meta_reports/migrations/0058_auto_20250422_2232.py +54 -0
  256. meta_reports/migrations/0059_alter_endpoints_created_and_more.py +161 -0
  257. meta_reports/migrations/0060_auto_20250926_0242.py +366 -0
  258. meta_reports/migrations/0061_auto_20251004_0043.py +21 -0
  259. meta_reports/migrations/0062_auto_20251004_0106.py +21 -0
  260. meta_reports/models/__init__.py +17 -0
  261. meta_reports/models/dbviews/__init__.py +14 -0
  262. meta_reports/models/dbviews/glucose_summary/__init__.py +2 -0
  263. meta_reports/models/dbviews/glucose_summary/unmanaged_model.py +15 -3
  264. meta_reports/models/dbviews/glucose_summary/view_definition.py +8 -5
  265. meta_reports/models/dbviews/imp_substitutions/__init__.py +2 -0
  266. meta_reports/models/dbviews/imp_substitutions/unmanaged_model.py +1 -2
  267. meta_reports/models/dbviews/imp_substitutions/view_definition.py +1 -1
  268. meta_reports/models/dbviews/missing_screening_ogtt/__init__.py +2 -0
  269. meta_reports/models/dbviews/missing_screening_ogtt/note_model.py +2 -2
  270. meta_reports/models/dbviews/missing_screening_ogtt/unmanaged_model.py +4 -3
  271. meta_reports/models/dbviews/on_study_missing_lab_values/__init__.py +2 -0
  272. meta_reports/models/dbviews/on_study_missing_lab_values/qa_cases.py +13 -11
  273. meta_reports/models/dbviews/on_study_missing_lab_values/unmanged_model.py +0 -1
  274. meta_reports/models/dbviews/on_study_missing_values/__init__.py +2 -0
  275. meta_reports/models/dbviews/on_study_missing_values/qa_cases.py +19 -1
  276. meta_reports/models/dbviews/on_study_missing_values/unmanged_model.py +0 -1
  277. meta_reports/models/dbviews/patient_history_missing_baseline_cd4/__init__.py +2 -0
  278. meta_reports/models/dbviews/patient_history_missing_baseline_cd4/unmanaged_model.py +0 -1
  279. meta_reports/models/dbviews/unattended_three_in_row/__init__.py +2 -0
  280. meta_reports/models/dbviews/unattended_three_in_row/unmanaged_model.py +0 -1
  281. meta_reports/models/dbviews/unattended_three_in_row2/__init__.py +2 -0
  282. meta_reports/models/dbviews/unattended_three_in_row2/unmanaged_model.py +0 -1
  283. meta_reports/models/dbviews/unattended_two_in_row/__init__.py +2 -0
  284. meta_reports/models/dbviews/unattended_two_in_row/unmanaged_model.py +0 -1
  285. meta_reports/models/endpoints.py +8 -4
  286. meta_reports/models/last_imp_refill.py +2 -3
  287. meta_reports/pdf_report.py +2 -2
  288. meta_reports/tasks.py +4 -3
  289. meta_reports/templates/meta_reports/columns/subject_identifier_column.html +1 -1
  290. meta_reports/templates/meta_reports/endpoints_all_change_list_note.html +1 -1
  291. meta_reports/templates/meta_reports/endpoints_change_list_note.html +1 -1
  292. meta_reports/templates/meta_reports/last_imp_refill/changelist_note.html +13 -0
  293. meta_screening/admin/__init__.py +8 -0
  294. meta_screening/admin/fieldsets.py +13 -15
  295. meta_screening/admin/list_filters.py +7 -5
  296. meta_screening/admin/screening_part_one_admin.py +1 -3
  297. meta_screening/admin/screening_part_three_admin.py +2 -3
  298. meta_screening/admin/screening_part_two_admin.py +7 -10
  299. meta_screening/admin/subject_refusal_admin.py +5 -3
  300. meta_screening/admin/subject_screening_admin.py +21 -10
  301. meta_screening/baker_recipes.py +18 -10
  302. meta_screening/calculators.py +1 -1
  303. meta_screening/choices.py +1 -1
  304. meta_screening/constants.py +1 -1
  305. meta_screening/eligibility/__init__.py +9 -0
  306. meta_screening/eligibility/eligibility.py +21 -14
  307. meta_screening/eligibility/eligibility_part_one.py +1 -1
  308. meta_screening/eligibility/eligibility_part_three/__init__.py +2 -0
  309. meta_screening/eligibility/eligibility_part_three/base_eligibility_part_three.py +68 -49
  310. meta_screening/eligibility/eligibility_part_three/eligibility_part_three_phase_three.py +14 -15
  311. meta_screening/eligibility/eligibility_part_two.py +1 -1
  312. meta_screening/form_validators/__init__.py +8 -0
  313. meta_screening/form_validators/screening_part_one.py +1 -1
  314. meta_screening/form_validators/screening_part_three.py +6 -2
  315. meta_screening/form_validators/screening_part_two.py +1 -1
  316. meta_screening/form_validators/subject_refusal.py +1 -1
  317. meta_screening/forms/__init__.py +20 -0
  318. meta_screening/forms/field_lists.py +16 -18
  319. meta_screening/forms/screening_part_one_form.py +2 -2
  320. meta_screening/forms/screening_part_three_form.py +5 -3
  321. meta_screening/forms/screening_part_two_form.py +1 -5
  322. meta_screening/forms/subject_refusal_form.py +0 -4
  323. meta_screening/forms/subject_screening_form.py +0 -4
  324. meta_screening/migrations/0001_initial.py +15 -15
  325. meta_screening/migrations/0010_auto_20191106_0828.py +5 -5
  326. meta_screening/migrations/0012_auto_20191107_0427.py +1 -1
  327. meta_screening/migrations/0068_alter_historicalscreeningpartone_acute_condition_and_more.py +1579 -0
  328. meta_screening/model_mixins/__init__.py +8 -0
  329. meta_screening/model_mixins/calculated_model_mixin.py +2 -2
  330. meta_screening/model_mixins/creatinine_fields_model_mixin.py +1 -1
  331. meta_screening/model_mixins/eligibility_model_mixin.py +6 -4
  332. meta_screening/model_mixins/part_one_fields_model_mixin.py +16 -19
  333. meta_screening/model_mixins/part_three_fields_model_mixin.py +6 -7
  334. meta_screening/model_mixins/part_two_fields_model_mixin.py +19 -17
  335. meta_screening/models/__init__.py +9 -0
  336. meta_screening/models/icp_referral.py +5 -5
  337. meta_screening/models/proxy_models.py +1 -1
  338. meta_screening/models/signals.py +10 -11
  339. meta_screening/models/subject_refusal.py +1 -1
  340. meta_screening/models/subject_screening.py +2 -4
  341. meta_subject/action_items.py +18 -14
  342. meta_subject/admin/__init__.py +42 -0
  343. meta_subject/admin/birth_outcome_admin.py +7 -9
  344. meta_subject/admin/blood_results/__init__.py +9 -0
  345. meta_subject/admin/blood_results/blood_results_fbc_admin.py +1 -1
  346. meta_subject/admin/blood_results/blood_results_hba1c_admin.py +1 -1
  347. meta_subject/admin/blood_results/blood_results_ins_admin.py +1 -1
  348. meta_subject/admin/blood_results/blood_results_lft_admin.py +1 -1
  349. meta_subject/admin/blood_results/blood_results_lipids_admin.py +1 -1
  350. meta_subject/admin/blood_results/blood_results_rft_admin.py +3 -5
  351. meta_subject/admin/complications_glycemia_admin.py +1 -1
  352. meta_subject/admin/delivery_admin.py +8 -11
  353. meta_subject/admin/diabetes/__init__.py +2 -0
  354. meta_subject/admin/diabetes/dm_endpoint_admin.py +2 -2
  355. meta_subject/admin/diabetes/dm_followup_admin.py +3 -2
  356. meta_subject/admin/egfr_drop_notification_admin.py +1 -1
  357. meta_subject/admin/fields.py +5 -5
  358. meta_subject/admin/fieldsets.py +5 -5
  359. meta_subject/admin/followup_examination_admin.py +11 -9
  360. meta_subject/admin/followup_vitals_admin.py +31 -6
  361. meta_subject/admin/glucose_admin.py +4 -8
  362. meta_subject/admin/glucose_fbg_admin.py +18 -11
  363. meta_subject/admin/health_economics/__init__.py +2 -0
  364. meta_subject/admin/health_economics/health_economics_simple_admin.py +1 -1
  365. meta_subject/admin/health_economics/health_economics_update_admin.py +1 -1
  366. meta_subject/admin/hepatitis_test_admin.py +1 -1
  367. meta_subject/admin/hiv_exit_review_admin.py +55 -0
  368. meta_subject/admin/list_filters.py +5 -5
  369. meta_subject/admin/mnsi_admin.py +7 -5
  370. meta_subject/admin/next_appointment_admin.py +19 -0
  371. meta_subject/admin/other_arv_regimens_admin.py +3 -3
  372. meta_subject/admin/patient_history_admin.py +4 -4
  373. meta_subject/admin/physical_exam_admin.py +1 -1
  374. meta_subject/admin/pregnancy_update_admin.py +1 -1
  375. meta_subject/admin/study_medication_admin.py +8 -15
  376. meta_subject/admin/subject_requisition_admin.py +2 -2
  377. meta_subject/admin/subject_visit_admin.py +1 -1
  378. meta_subject/admin/subject_visit_missed_admin.py +1 -1
  379. meta_subject/admin/urine_dipstick_test_admin.py +1 -1
  380. meta_subject/admin/urine_pregnancy_admin.py +1 -1
  381. meta_subject/baker_recipes.py +15 -15
  382. meta_subject/choices.py +4 -3
  383. meta_subject/form_validators/__init__.py +15 -0
  384. meta_subject/form_validators/delivery_form_validator.py +3 -3
  385. meta_subject/form_validators/dm_endpoint_form_validator.py +3 -1
  386. meta_subject/form_validators/dm_followup_form_validator.py +8 -7
  387. meta_subject/form_validators/egfr_drop_notification_form_validator.py +1 -1
  388. meta_subject/form_validators/followup_examination_form_validator.py +1 -1
  389. meta_subject/form_validators/glucose_fbg_form_validator.py +76 -0
  390. meta_subject/form_validators/glucose_form_validator.py +10 -67
  391. meta_subject/form_validators/hiv_exit_review_form_validator.py +18 -0
  392. meta_subject/form_validators/mixins.py +95 -0
  393. meta_subject/forms/__init__.py +44 -0
  394. meta_subject/forms/blood_results/__init__.py +9 -0
  395. meta_subject/forms/blood_results/blood_results_hba1c_form.py +1 -1
  396. meta_subject/forms/blood_results/blood_results_rft_form.py +60 -4
  397. meta_subject/forms/delivery_form.py +2 -0
  398. meta_subject/forms/diabetes/__init__.py +2 -0
  399. meta_subject/forms/diabetes/dm_followup_form.py +2 -2
  400. meta_subject/forms/followup_vitals_form.py +27 -1
  401. meta_subject/forms/glucose_fbg_form.py +1 -46
  402. meta_subject/forms/health_economics/__init__.py +2 -0
  403. meta_subject/forms/hepatitis_test_form.py +1 -1
  404. meta_subject/forms/hiv_exit_review_form.py +13 -0
  405. meta_subject/forms/mixins.py +1 -1
  406. meta_subject/forms/next_appointment_form.py +36 -0
  407. meta_subject/forms/other_arv_regimens_form.py +1 -1
  408. meta_subject/forms/patient_history_form.py +1 -1
  409. meta_subject/forms/physical_exam_form.py +1 -1
  410. meta_subject/forms/pregnancy_update_form.py +1 -1
  411. meta_subject/forms/slider_widget.py +1 -1
  412. meta_subject/forms/study_medication_form.py +18 -12
  413. meta_subject/forms/subject_requisition_form.py +1 -1
  414. meta_subject/forms/subject_visit_missed_form.py +1 -1
  415. meta_subject/forms/urine_dipstick_test_form.py +1 -1
  416. meta_subject/forms/urine_pregnancy_form.py +1 -1
  417. meta_subject/management/commands/create_missing_refills.py +3 -3
  418. meta_subject/management/commands/create_missing_rx.py +2 -2
  419. meta_subject/management/commands/missed.py +20 -23
  420. meta_subject/metadata_rules/__init__.py +2 -0
  421. meta_subject/metadata_rules/metadata_rules.py +14 -0
  422. meta_subject/metadata_rules/predicates.py +44 -25
  423. meta_subject/migrations/0001_initial.py +61 -61
  424. meta_subject/migrations/0002_auto_20191021_0353.py +5 -5
  425. meta_subject/migrations/0012_auto_20200118_2334.py +5 -5
  426. meta_subject/migrations/0014_auto_20200120_1622.py +5 -5
  427. meta_subject/migrations/0018_coronakap_historicalcoronakap.py +5 -5
  428. meta_subject/migrations/0033_auto_20200516_2356.py +5 -5
  429. meta_subject/migrations/0038_auto_20200520_0020.py +5 -5
  430. meta_subject/migrations/0040_auto_20200527_2155.py +1 -1
  431. meta_subject/migrations/0045_auto_20200530_1801.py +1 -1
  432. meta_subject/migrations/0051_auto_20200617_2117.py +5 -5
  433. meta_subject/migrations/0063_auto_20210715_0337.py +5 -5
  434. meta_subject/migrations/0066_auto_20210721_0335.py +9 -9
  435. meta_subject/migrations/0067_auto_20210726_0340.py +5 -5
  436. meta_subject/migrations/0068_auto_20210728_1809.py +5 -5
  437. meta_subject/migrations/0072_auto_20210805_1545.py +7 -7
  438. meta_subject/migrations/0073_auto_20210809_0055.py +5 -5
  439. meta_subject/migrations/0077_auto_20210809_2323.py +3 -3
  440. meta_subject/migrations/0082_auto_20210823_1612.py +3 -3
  441. meta_subject/migrations/0083_auto_20210823_1620.py +3 -3
  442. meta_subject/migrations/0088_auto_20210924_0027.py +5 -5
  443. meta_subject/migrations/0090_auto_20210924_0424.py +5 -5
  444. meta_subject/migrations/0093_auto_20211117_0352.py +5 -5
  445. meta_subject/migrations/0095_auto_20220128_1719.py +5 -5
  446. meta_subject/migrations/0098_auto_20220309_2106.py +5 -5
  447. meta_subject/migrations/0101_auto_20220316_2147.py +13 -13
  448. meta_subject/migrations/0107_auto_20220415_0043.py +1 -1
  449. meta_subject/migrations/0115_historicalegfrnotification_egfrnotification.py +5 -13
  450. meta_subject/migrations/0128_auto_20220720_0055.py +1 -1
  451. meta_subject/migrations/0131_auto_20220722_0411.py +1 -1
  452. meta_subject/migrations/0135_auto_20220722_2212.py +2 -1
  453. meta_subject/migrations/0164_dmreferralfollowup_historicaldmreferralfollowup.py +5 -5
  454. meta_subject/migrations/0172_remove_historicalbloodresultsglu_action_item_and_more.py +1 -2
  455. meta_subject/migrations/0177_alter_bloodresultslft_alp_value_and_more.py +1 -2
  456. meta_subject/migrations/0178_historicalhealtheconomicsupdate_and_more.py +5 -14
  457. meta_subject/migrations/0186_healtheconomicsupdate_singleton_field_and_more.py +1 -2
  458. meta_subject/migrations/0187_dmdiagnosis_historicaldmdiagnosis_dmdxresult_and_more.py +5 -14
  459. meta_subject/migrations/0188_historicaldmdxresult_dmdxresult.py +5 -14
  460. meta_subject/migrations/0199_auto_20240516_0247.py +1 -1
  461. meta_subject/migrations/0209_remove_historicaldmdxresult_dm_diagnosis_and_more.py +1 -2
  462. meta_subject/migrations/0212_auto_20240827_2222.py +1 -1
  463. meta_subject/migrations/0216_historicalnextappointment_nextappointment.py +553 -0
  464. meta_subject/migrations/0217_alter_historicalnextappointment_appt_datetime_and_more.py +42 -0
  465. meta_subject/migrations/0218_alter_historicalnextappointment_appt_date_and_more.py +53 -0
  466. meta_subject/migrations/0219_remove_historicalnextappointment_allow_create_interim_and_more.py +92 -0
  467. meta_subject/migrations/0220_historicalbloodresultsgludummy_bloodresultsgludummy.py +825 -0
  468. meta_subject/migrations/0221_auto_20250402_1913.py +42 -0
  469. meta_subject/migrations/0222_alter_historicalstudymedication_stock_codes_and_more.py +46 -0
  470. meta_subject/migrations/0223_bloodresultsfbc_errors_bloodresultsgludummy_errors_and_more.py +83 -0
  471. meta_subject/migrations/0224_bloodresultsfbc_abnormal_summary_and_more.py +153 -0
  472. meta_subject/migrations/0225_followupvitals_waist_circumference_and_more.py +46 -0
  473. meta_subject/migrations/0226_followupvitals_waist_circumference_comment_and_more.py +97 -0
  474. meta_subject/migrations/0227_alter_followupvitals_waist_circumference_comment_and_more.py +97 -0
  475. meta_subject/migrations/0228_bloodresultshba1c_hba1c_datetime_and_more.py +2518 -0
  476. meta_subject/migrations/0229_alter_glucosefbg_consent_model_and_more.py +1918 -0
  477. meta_subject/migrations/0230_alter_historicaldelivery_action_identifier_and_more.py +1733 -0
  478. meta_subject/migrations/0231_alter_historicalmedicationadherence_consent_model_and_more.py +2054 -0
  479. meta_subject/migrations/0232_alter_patienthistory_concomitant_conditions_and_more.py +1170 -0
  480. meta_subject/migrations/0233_historicalspfq_spfq.py +1066 -0
  481. meta_subject/migrations/0234_remove_spfq_site_remove_spfq_subject_visit_and_more.py +27 -0
  482. meta_subject/migrations/0235_glucosefbg_endpoint_today_and_more.py +606 -0
  483. meta_subject/migrations/0236_alter_historicalhivexitreview_other_current_arv_regimen_and_more.py +58 -0
  484. meta_subject/migrations/0237_historicalhivexitreview_singleton_field_and_more.py +68 -0
  485. meta_subject/migrations/0238_historicalhivexitreview_available_and_more.py +88 -0
  486. meta_subject/model_mixins/__init__.py +10 -0
  487. meta_subject/model_mixins/arv_history_model_mixin.py +3 -44
  488. meta_subject/model_mixins/arv_review_model_mixin.py +53 -0
  489. meta_subject/model_mixins/search_slug_model_mixin.py +1 -2
  490. meta_subject/model_mixins/vitals_fields_model_mixin.py +33 -0
  491. meta_subject/models/__init__.py +52 -0
  492. meta_subject/models/birth_outcomes.py +3 -3
  493. meta_subject/models/blood_results/__init__.py +11 -0
  494. meta_subject/models/blood_results/blood_results_glu.py +29 -0
  495. meta_subject/models/blood_results/blood_results_hba1c.py +0 -1
  496. meta_subject/models/blood_results/blood_results_ins.py +0 -1
  497. meta_subject/models/blood_results/blood_results_lft.py +0 -1
  498. meta_subject/models/delivery.py +4 -6
  499. meta_subject/models/diabetes/__init__.py +2 -0
  500. meta_subject/models/diabetes/dm_endpoint.py +5 -5
  501. meta_subject/models/diabetes/dm_followup.py +7 -8
  502. meta_subject/models/diet_and_lifestyle.py +2 -2
  503. meta_subject/models/followup_examination.py +12 -14
  504. meta_subject/models/glucose.py +5 -5
  505. meta_subject/models/glucose_fbg.py +17 -4
  506. meta_subject/models/health_economics/__init__.py +2 -0
  507. meta_subject/models/health_economics/health_economics.py +8 -8
  508. meta_subject/models/health_economics/health_economics_simple.py +2 -2
  509. meta_subject/models/health_economics/health_economics_update.py +3 -2
  510. meta_subject/models/hepatitis_test.py +2 -2
  511. meta_subject/models/hiv_exit_review.py +44 -0
  512. meta_subject/models/next_appointment.py +15 -0
  513. meta_subject/models/other_arv_regimens_detail.py +1 -1
  514. meta_subject/models/patient_history.py +6 -7
  515. meta_subject/models/physical_exam.py +2 -2
  516. meta_subject/models/pregnancy_update.py +1 -1
  517. meta_subject/models/signals.py +15 -13
  518. meta_subject/models/subject_visit.py +2 -2
  519. meta_subject/models/todo.txt +1 -1
  520. meta_subject/models/urine_dipstick_test.py +2 -2
  521. meta_subject/models/urine_pregnancy.py +1 -1
  522. meta_subject/static/meta_subject/slider.css +1 -1
  523. meta_subject/templates/meta_subject/endpoint_review_instructions.html +1 -1
  524. meta_subject/templates/meta_subject/widgets/slider.html +0 -1
  525. meta_visit_schedule/visit_schedules/__init__.py +2 -0
  526. meta_visit_schedule/visit_schedules/phase_three/__init__.py +2 -0
  527. meta_visit_schedule/visit_schedules/phase_three/crfs.py +34 -1
  528. meta_visit_schedule/visit_schedules/phase_three/schedule.py +4 -4
  529. meta_visit_schedule/visit_schedules/phase_three/schedule_dm_referral.py +1 -2
  530. meta_visit_schedule/visit_schedules/phase_three/schedule_pregnancy.py +2 -3
  531. meta_ae/tests/holidays.csv +0 -15
  532. meta_ae/tests/tests/test_actions.py +0 -127
  533. meta_ae/tests/urls.py +0 -10
  534. meta_analytics/dataframes/enrolled/__init__.py +0 -1
  535. meta_analytics/dataframes/enrolled/get_glucose_df.py +0 -122
  536. meta_analytics/tests/__init__.py +0 -0
  537. meta_analytics/tests/test_endpoints_by_date.py +0 -94
  538. meta_consent/tests/__init__.py +0 -0
  539. meta_consent/tests/holidays.csv +0 -15
  540. meta_consent/tests/tests/__init__.py +0 -0
  541. meta_consent/tests/tests/test_form_validators.py +0 -110
  542. meta_consent/tests/tests/test_subject_consent.py +0 -10
  543. meta_consent/tests/urls.py +0 -17
  544. meta_dashboard/templates/meta_dashboard/bootstrap3/subject/dashboard.html +0 -11
  545. meta_dashboard/tests/__init__.py +0 -0
  546. meta_dashboard/tests/admin.py +0 -22
  547. meta_dashboard/tests/holidays.csv +0 -15
  548. meta_dashboard/tests/tests/__init__.py +0 -0
  549. meta_dashboard/tests/urls.py +0 -55
  550. meta_edc/tests/__init__.py +0 -0
  551. meta_edc/tests/tests/__init__.py +0 -0
  552. meta_edc/tests/tests/test_endpoints.py +0 -554
  553. meta_edc-0.3.39.dist-info/AUTHORS +0 -0
  554. meta_edc-0.3.39.dist-info/METADATA +0 -766
  555. meta_edc-0.3.39.dist-info/WHEEL +0 -5
  556. meta_edc-0.3.39.dist-info/top_level.txt +0 -20
  557. meta_labs/tests/__init__.py +0 -0
  558. meta_labs/tests/test_labs.py +0 -27
  559. meta_labs/tests/test_reportables.py +0 -16
  560. meta_labs/tests/urls.py +0 -4
  561. meta_lists/tests/__init__.py +0 -0
  562. meta_lists/tests/test_lists.py +0 -8
  563. meta_pharmacy/admin/actions.py +0 -38
  564. meta_prn/tests/__init__.py +0 -0
  565. meta_prn/tests/tests/__init__.py +0 -0
  566. meta_prn/tests/tests/test_actions.py +0 -97
  567. meta_prn/tests/tests/test_dm_referral.py +0 -206
  568. meta_prn/tests/tests/test_manager_order.py +0 -14
  569. meta_prn/tests/tests/test_pregnancy_notification.py +0 -93
  570. meta_prn/tests/urls.py +0 -10
  571. meta_rando/tests/__init__.py +0 -0
  572. meta_rando/tests/tests/__init__.py +0 -0
  573. meta_rando/tests/tests/test_randomizers.py +0 -57
  574. meta_reports/tests/__init__.py +0 -0
  575. meta_reports/tests/test_reports.py +0 -35
  576. meta_reports/tests/test_sql_gen.py +0 -5
  577. meta_reports/tests/urls.py +0 -4
  578. meta_screening/offline_models.py +0 -3
  579. meta_screening/tests/__init__.py +0 -0
  580. meta_screening/tests/holidays.csv +0 -15
  581. meta_screening/tests/meta_test_case_mixin.py +0 -216
  582. meta_screening/tests/options.py +0 -127
  583. meta_screening/tests/tests/__init__.py +0 -0
  584. meta_screening/tests/tests/test_forms.py +0 -397
  585. meta_screening/tests/tests/test_screening_part_one.py +0 -108
  586. meta_screening/tests/tests/test_screening_part_three.py +0 -436
  587. meta_screening/tests/tests/test_screening_part_two.py +0 -84
  588. meta_sites/tests/__init__.py +0 -0
  589. meta_sites/tests/test_sites.py +0 -12
  590. meta_sites/tests/urls.py +0 -4
  591. meta_stats/__init__.py +0 -0
  592. meta_stats/incidence.py +0 -16
  593. meta_stats/models.py +0 -0
  594. meta_stats/tests/__init__.py +0 -0
  595. meta_stats/tests/tests/__init__.py +0 -0
  596. meta_stats/tests/tests/test_incidence.py +0 -10
  597. meta_subject/tests/__init__.py +0 -0
  598. meta_subject/tests/holidays.csv +0 -15
  599. meta_subject/tests/tests/__init__.py +0 -0
  600. meta_subject/tests/tests/test_egfr.py +0 -234
  601. meta_subject/tests/tests/test_fixes.py +0 -64
  602. meta_subject/tests/tests/test_followup.py +0 -52
  603. meta_subject/tests/tests/test_manager_order.py +0 -11
  604. meta_subject/tests/tests/test_medication_adherence.py +0 -75
  605. meta_subject/tests/tests/test_metadata_rules.py +0 -135
  606. meta_subject/tests/tests/test_mnsi.py +0 -317
  607. meta_subject/tests/tests/test_patient_history_form.py +0 -74
  608. meta_subject/tests/tests/test_physical_exam.py +0 -84
  609. meta_subject/tests/tests/test_sf12.py +0 -173
  610. meta_subject/tests/tests/test_study_medication.py +0 -230
  611. meta_subject/tests/urls.py +0 -24
  612. meta_visit_schedule/tests/__init__.py +0 -0
  613. meta_visit_schedule/tests/tests/__init__.py +0 -0
  614. meta_visit_schedule/tests/tests/test_schedule.py +0 -181
  615. meta_visit_schedule/tests/urls.py +0 -4
  616. tests/__init__.py +0 -0
  617. tests/etc/randomization_list.csv +0 -241
  618. tests/etc/randomization_list_phase_three.csv +0 -241
  619. tests/etc/user-aes-local.key +0 -0
  620. tests/etc/user-aes-restricted.key +0 -1
  621. tests/etc/user-rsa-local-private.pem +0 -27
  622. tests/etc/user-rsa-local-public.pem +0 -9
  623. tests/etc/user-rsa-restricted-private.pem +0 -27
  624. tests/etc/user-rsa-restricted-public.pem +0 -9
  625. tests/etc/user-salt-local.key +0 -0
  626. tests/etc/user-salt-restricted.key +0 -0
  627. tests/holidays.csv +0 -15
  628. tests/test_settings.py +0 -186
  629. /meta_ae/templates/meta_ae/{bootstrap3/ae_initial_description.html → aeinitial_description.html} +0 -0
  630. /meta_dashboard/templates/meta_dashboard/{bootstrap3/buttons → buttons}/add_consent_button.html +0 -0
  631. /meta_dashboard/templates/meta_dashboard/{bootstrap3/buttons → buttons}/dashboard_button.html +0 -0
  632. /meta_dashboard/templates/meta_dashboard/{bootstrap3/buttons → buttons}/refusal_button.html +0 -0
  633. /meta_dashboard/templates/meta_dashboard/{bootstrap3/screening → screening}/listboard.html +0 -0
  634. /meta_dashboard/templates/meta_dashboard/{bootstrap3/subject → subject}/listboard.html +0 -0
  635. {meta_edc-0.3.39.dist-info → meta_edc-1.4.0.dist-info/licenses}/LICENSE +0 -0
  636. /meta_ae/tests/__init__.py → /meta_subject/management/__init__py.py +0 -0
  637. /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) -> Tuple[str, dict]:
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) -> Tuple[str, dict]:
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
- ) -> Tuple[str, dict]:
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) -> Tuple[str, dict]:
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) -> Tuple[str, dict]:
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) -> Tuple[str, dict]:
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) -> Tuple[str, dict]:
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() -> Tuple[str, dict]:
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) -> Tuple[str, dict]:
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) -> Tuple[str, dict]:
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) -> Tuple[str, dict]:
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: Tuple[str, dict] = (
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: Tuple[str, dict] = (
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: Tuple[str, ...] = (
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() -> Tuple[str, dict]:
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: Tuple[str, ...] = (
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() -> Tuple[
25
- Tuple[str, dict],
26
- Tuple[str, dict],
27
- Tuple[str, dict],
28
- Tuple[str, dict],
29
- Tuple[str, dict],
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: Tuple[str, ...] = (
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 = ["subject_screening"]
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(f"{e}. See subject_dashboard_url_name for {repr(self)}.")
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("<BR>".join(data))
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.subject_listboard_url_name), args=(obj.screening_identifier,)
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("dashboard_button.html", context=context)
181
- return format_html(button + "<BR>" + eligibility.eligibility_status(add_urls=True))
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(url_names.get("screening_listboard_url"), kwargs={})
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}",
@@ -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 edc_constants.constants import BLACK, FEMALE, NO, NOT_APPLICABLE, YES
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=get_utcnow() - relativedelta(days=1),
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=None,
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=get_utcnow() - relativedelta(days=1),
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=get_utcnow() + relativedelta(days=1),
43
- part_three_report_datetime=get_utcnow(),
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=get_utcnow(),
55
- ogtt_base_datetime=get_utcnow(),
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,
@@ -1,4 +1,4 @@
1
- from edc_constants.constants import NO, TBD, YES
1
+ from clinicedc_constants import NO, TBD, YES
2
2
 
3
3
 
4
4
  def calculate_inclusion_field_values_phase_two(obj):
meta_screening/choices.py CHANGED
@@ -1,4 +1,4 @@
1
- from edc_constants.constants import BLACK, NO, NOT_APPLICABLE, OTHER, PENDING, YES
1
+ from clinicedc_constants import BLACK, NO, NOT_APPLICABLE, OTHER, PENDING, YES
2
2
 
3
3
  ETHNICITY = ((BLACK, "Black"), (OTHER, "Other"))
4
4
 
@@ -1,4 +1,4 @@
1
- from edc_constants.constants import NO, NOT_APPLICABLE, YES
1
+ from clinicedc_constants import NO, NOT_APPLICABLE, YES
2
2
 
3
3
  BMI_FBG_OGTT_INCOMPLETE = "BMI/FBG/OGTT incomplete"
4
4
  BMI_FBG_OGTT = "BMI/FBG/OGTT"
@@ -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 = [YES, NO, TBD]
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 True if self.eligible == YES else False
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
- f'<A href="{url_p1}">P1: {self.part_one.eligible.upper()}</A><BR>'
199
- f'<A href="{url_p2}">P2: {self.part_two.eligible.upper()}</A><BR>'
200
- f'<A href="{url_p3}">P3: {self.part_three.eligible.upper()}</A><BR>'
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
- f"P1: {self.part_one.eligible.upper()}<BR>"
205
- f"P2: {self.part_two.eligible.upper()}<BR>"
206
- f"P3: {self.part_three.eligible.upper()}<BR>"
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:
@@ -1,4 +1,4 @@
1
- from edc_constants.constants import FEMALE, MALE, NO, NOT_APPLICABLE, YES
1
+ from clinicedc_constants import FEMALE, MALE, NO, NOT_APPLICABLE, YES
2
2
  from edc_screening.fc import FC
3
3
  from edc_screening.screening_eligibility import ScreeningEligibility
4
4
 
@@ -1 +1,3 @@
1
1
  from .eligibility_part_three_phase_three import EligibilityPartThreePhaseThree
2
+
3
+ __all__ = ["EligibilityPartThreePhaseThree"]