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
@@ -0,0 +1,68 @@
1
+ # Generated by Django 5.2.7 on 2025-10-14 00:32
2
+
3
+ from django.db import migrations, models
4
+
5
+
6
+ class Migration(migrations.Migration):
7
+
8
+ dependencies = [
9
+ (
10
+ "meta_subject",
11
+ "0236_alter_historicalhivexitreview_other_current_arv_regimen_and_more",
12
+ ),
13
+ ]
14
+
15
+ operations = [
16
+ migrations.AddField(
17
+ model_name="historicalhivexitreview",
18
+ name="singleton_field",
19
+ field=models.CharField(
20
+ db_index=True,
21
+ default="",
22
+ editable=False,
23
+ help_text="auto updated for unique constraint",
24
+ max_length=50,
25
+ verbose_name="subject identifier",
26
+ ),
27
+ preserve_default=False,
28
+ ),
29
+ migrations.AddField(
30
+ model_name="hivexitreview",
31
+ name="singleton_field",
32
+ field=models.CharField(
33
+ default="",
34
+ editable=False,
35
+ help_text="auto updated for unique constraint",
36
+ max_length=50,
37
+ unique=True,
38
+ verbose_name="subject identifier",
39
+ ),
40
+ preserve_default=False,
41
+ ),
42
+ migrations.AlterField(
43
+ model_name="healtheconomicsupdate",
44
+ name="singleton_field",
45
+ field=models.CharField(
46
+ default="",
47
+ editable=False,
48
+ help_text="auto updated for unique constraint",
49
+ max_length=50,
50
+ unique=True,
51
+ verbose_name="subject identifier",
52
+ ),
53
+ preserve_default=False,
54
+ ),
55
+ migrations.AlterField(
56
+ model_name="historicalhealtheconomicsupdate",
57
+ name="singleton_field",
58
+ field=models.CharField(
59
+ db_index=True,
60
+ default="",
61
+ editable=False,
62
+ help_text="auto updated for unique constraint",
63
+ max_length=50,
64
+ verbose_name="subject identifier",
65
+ ),
66
+ preserve_default=False,
67
+ ),
68
+ ]
@@ -0,0 +1,88 @@
1
+ # Generated by Django 5.2.7 on 2025-10-14 12:56
2
+
3
+ import django.db.models.deletion
4
+ from django.db import migrations, models
5
+
6
+
7
+ class Migration(migrations.Migration):
8
+
9
+ dependencies = [
10
+ (
11
+ "meta_lists",
12
+ "0020_alter_abnormalfootappearanceobservations_extra_value_and_more",
13
+ ),
14
+ ("meta_subject", "0237_historicalhivexitreview_singleton_field_and_more"),
15
+ ]
16
+
17
+ operations = [
18
+ migrations.AddField(
19
+ model_name="historicalhivexitreview",
20
+ name="available",
21
+ field=models.CharField(
22
+ choices=[("Yes", "Yes"), ("No", "No")],
23
+ default="Yes",
24
+ max_length=25,
25
+ verbose_name="Are HIV test result and treatment information available?",
26
+ ),
27
+ ),
28
+ migrations.AddField(
29
+ model_name="historicalhivexitreview",
30
+ name="comment",
31
+ field=models.TextField(
32
+ blank=True,
33
+ default="",
34
+ help_text="May be left blank.",
35
+ verbose_name="Any other comment?",
36
+ ),
37
+ ),
38
+ migrations.AddField(
39
+ model_name="historicalhivexitreview",
40
+ name="not_available_reason",
41
+ field=models.TextField(
42
+ blank=True,
43
+ default="",
44
+ verbose_name="If not available, please explain ...",
45
+ ),
46
+ ),
47
+ migrations.AddField(
48
+ model_name="hivexitreview",
49
+ name="available",
50
+ field=models.CharField(
51
+ choices=[("Yes", "Yes"), ("No", "No")],
52
+ default="Yes",
53
+ max_length=25,
54
+ verbose_name="Are HIV test result and treatment information available?",
55
+ ),
56
+ ),
57
+ migrations.AddField(
58
+ model_name="hivexitreview",
59
+ name="comment",
60
+ field=models.TextField(
61
+ blank=True,
62
+ default="",
63
+ help_text="May be left blank.",
64
+ verbose_name="Any other comment?",
65
+ ),
66
+ ),
67
+ migrations.AddField(
68
+ model_name="hivexitreview",
69
+ name="not_available_reason",
70
+ field=models.TextField(
71
+ blank=True,
72
+ default="",
73
+ verbose_name="If not available, please explain ...",
74
+ ),
75
+ ),
76
+ migrations.AlterField(
77
+ model_name="hivexitreview",
78
+ name="current_arv_regimen",
79
+ field=models.ForeignKey(
80
+ blank=True,
81
+ null=True,
82
+ on_delete=django.db.models.deletion.PROTECT,
83
+ related_name="last_arv_regimen",
84
+ to="meta_lists.arvregimens",
85
+ verbose_name="Which antiretroviral therapy regimen is the patient currently on?",
86
+ ),
87
+ ),
88
+ ]
@@ -1,5 +1,15 @@
1
1
  from .arv_history_model_mixin import ArvHistoryModelMixin
2
+ from .arv_review_model_mixin import ArvReviewModelMixin
2
3
  from .crf_model_mixin import CrfModelMixin
3
4
  from .crf_with_action_model_mixin import CrfWithActionModelMixin
4
5
  from .search_slug_model_mixin import SearchSlugModelMixin
5
6
  from .vitals_fields_model_mixin import VitalsFieldsModelMixin
7
+
8
+ __all__ = [
9
+ "ArvHistoryModelMixin",
10
+ "ArvReviewModelMixin",
11
+ "CrfModelMixin",
12
+ "CrfWithActionModelMixin",
13
+ "SearchSlugModelMixin",
14
+ "VitalsFieldsModelMixin",
15
+ ]
@@ -1,13 +1,13 @@
1
- from django.core.validators import MaxValueValidator, MinValueValidator
2
1
  from django.db import models
3
2
  from edc_constants.choices import YES_NO
4
3
  from edc_model.models import OtherCharField
5
- from edc_reportable import CELLS_PER_MILLIMETER_CUBED_DISPLAY, COPIES_PER_MILLILITER
6
4
 
7
5
  from meta_lists.models import ArvRegimens, OiProphylaxis
8
6
 
7
+ from .arv_review_model_mixin import ArvReviewModelMixin
9
8
 
10
- class ArvHistoryModelMixin(models.Model):
9
+
10
+ class ArvHistoryModelMixin(ArvReviewModelMixin, models.Model):
11
11
  hiv_diagnosis_date = models.DateField(
12
12
  verbose_name="When was the diagnosis of HIV made?", null=True, blank=True
13
13
  )
@@ -18,47 +18,6 @@ class ArvHistoryModelMixin(models.Model):
18
18
  blank=True,
19
19
  )
20
20
 
21
- viral_load = models.IntegerField(
22
- verbose_name="Last viral load",
23
- validators=[MinValueValidator(0), MaxValueValidator(999999)],
24
- null=True,
25
- blank=True,
26
- help_text=COPIES_PER_MILLILITER,
27
- )
28
-
29
- viral_load_date = models.DateField(
30
- verbose_name="Date of last viral load", null=True, blank=True
31
- )
32
-
33
- cd4 = models.IntegerField(
34
- verbose_name="Last CD4",
35
- validators=[MinValueValidator(0), MaxValueValidator(3000)],
36
- null=True,
37
- blank=True,
38
- help_text=CELLS_PER_MILLIMETER_CUBED_DISPLAY,
39
- )
40
-
41
- cd4_date = models.DateField(verbose_name="Date of last CD4", null=True, blank=True)
42
-
43
- current_arv_regimen = models.ForeignKey(
44
- ArvRegimens,
45
- on_delete=models.PROTECT,
46
- related_name="current_arv_regimen",
47
- verbose_name="Which antiretroviral therapy regimen is the patient currently on?",
48
- null=True,
49
- blank=False,
50
- )
51
-
52
- other_current_arv_regimen = OtherCharField(null=True, blank=True)
53
-
54
- current_arv_regimen_start_date = models.DateField(
55
- verbose_name=(
56
- "When did the patient start this current antiretroviral therapy regimen?"
57
- ),
58
- null=True,
59
- blank=True,
60
- )
61
-
62
21
  has_previous_arv_regimen = models.CharField(
63
22
  verbose_name="Has the patient been on any previous regimen?",
64
23
  max_length=15,
@@ -0,0 +1,53 @@
1
+ from clinicedc_constants import COPIES_PER_MILLILITER, NULL_STRING
2
+ from django.core.validators import MaxValueValidator, MinValueValidator
3
+ from django.db import models
4
+ from edc_model.models import OtherCharField
5
+ from edc_reportable.units import CELLS_PER_MILLIMETER_CUBED_DISPLAY
6
+
7
+ from meta_lists.models import ArvRegimens
8
+
9
+
10
+ class ArvReviewModelMixin(models.Model):
11
+ viral_load = models.IntegerField(
12
+ verbose_name="Last viral load",
13
+ validators=[MinValueValidator(0), MaxValueValidator(999999)],
14
+ null=True,
15
+ blank=True,
16
+ help_text=COPIES_PER_MILLILITER,
17
+ )
18
+
19
+ viral_load_date = models.DateField(
20
+ verbose_name="Date of last viral load", null=True, blank=True
21
+ )
22
+
23
+ cd4 = models.IntegerField(
24
+ verbose_name="Last CD4",
25
+ validators=[MinValueValidator(0), MaxValueValidator(3000)],
26
+ null=True,
27
+ blank=True,
28
+ help_text=CELLS_PER_MILLIMETER_CUBED_DISPLAY,
29
+ )
30
+
31
+ cd4_date = models.DateField(verbose_name="Date of last CD4", null=True, blank=True)
32
+
33
+ current_arv_regimen = models.ForeignKey(
34
+ ArvRegimens,
35
+ on_delete=models.PROTECT,
36
+ related_name="current_arv_regimen",
37
+ verbose_name="Which antiretroviral therapy regimen is the patient currently on?",
38
+ null=True,
39
+ blank=False,
40
+ )
41
+
42
+ other_current_arv_regimen = OtherCharField(default=NULL_STRING, blank=True)
43
+
44
+ current_arv_regimen_start_date = models.DateField(
45
+ verbose_name=(
46
+ "When did the patient start this current antiretroviral therapy regimen?"
47
+ ),
48
+ null=True,
49
+ blank=True,
50
+ )
51
+
52
+ class Meta:
53
+ abstract = True
@@ -4,8 +4,7 @@ from edc_search.model_mixins import SearchSlugModelMixin as Base
4
4
  class SearchSlugModelMixin(Base):
5
5
  def get_search_slug_fields(self):
6
6
  fields = super().get_search_slug_fields()
7
- fields.append("subject_identifier")
8
- return fields
7
+ return *fields, "subject_identifier"
9
8
 
10
9
  class Meta:
11
10
  abstract = True
@@ -1,11 +1,44 @@
1
+ from clinicedc_constants import NO
1
2
  from django.core.validators import MaxValueValidator, MinValueValidator
2
3
  from django.db import models
4
+ from edc_constants.choices import YES_NO
3
5
  from edc_vitals.models import WeightField
4
6
 
5
7
 
6
8
  class VitalsFieldsModelMixin(models.Model):
7
9
  weight = WeightField(null=True)
8
10
 
11
+ waist_circumference_measured = models.CharField(
12
+ verbose_name="Was the patient's waist circumference measured today?",
13
+ max_length=15,
14
+ choices=YES_NO,
15
+ help_text=(
16
+ "Waist circumference may be provided at anytime "
17
+ "but is required at 36 and 48 months"
18
+ ),
19
+ default=NO,
20
+ )
21
+
22
+ waist_circumference = models.DecimalField(
23
+ verbose_name="Waist circumference",
24
+ max_digits=5,
25
+ decimal_places=1,
26
+ validators=[MinValueValidator(50.0), MaxValueValidator(175.0)],
27
+ help_text="in centimeters",
28
+ null=True,
29
+ blank=True,
30
+ )
31
+
32
+ waist_circumference_comment = models.TextField(
33
+ verbose_name="If waist circumference not measured, please explain ...",
34
+ help_text=(
35
+ "A reason not measured may be provided at anytime "
36
+ "but is required at 36 and 48 months"
37
+ ),
38
+ default="",
39
+ blank=True,
40
+ )
41
+
9
42
  # 10
10
43
  heart_rate = models.IntegerField(
11
44
  verbose_name="Heart rate:",
@@ -1,6 +1,7 @@
1
1
  from .birth_outcomes import BirthOutcomes
2
2
  from .blood_results import (
3
3
  BloodResultsFbc,
4
+ BloodResultsGluDummy,
4
5
  BloodResultsHba1c,
5
6
  BloodResultsIns,
6
7
  BloodResultsLft,
@@ -25,9 +26,11 @@ from .health_economics import (
25
26
  HealthEconomicsUpdate,
26
27
  )
27
28
  from .hepatitis_test import HepatitisTest
29
+ from .hiv_exit_review import HivExitReview
28
30
  from .malaria_test import MalariaTest
29
31
  from .medication_adherence import MedicationAdherence
30
32
  from .mnsi import Mnsi
33
+ from .next_appointment import NextAppointment
31
34
  from .other_arv_regimens import OtherArvRegimens
32
35
  from .other_arv_regimens_detail import OtherArvRegimensDetail
33
36
  from .patient_history import PatientHistory
@@ -46,3 +49,52 @@ from .subject_visit import SubjectVisit
46
49
  from .subject_visit_missed import SubjectVisitMissed
47
50
  from .urine_dipstick_test import UrineDipstickTest
48
51
  from .urine_pregnancy import UrinePregnancy
52
+
53
+ __all__ = [
54
+ "BirthOutcomes",
55
+ "BloodResultsFbc",
56
+ "BloodResultsGluDummy",
57
+ "BloodResultsHba1c",
58
+ "BloodResultsIns",
59
+ "BloodResultsLft",
60
+ "BloodResultsLipids",
61
+ "BloodResultsRft",
62
+ "Complications",
63
+ "ComplicationsGlycemia",
64
+ "ConcomitantMedication",
65
+ "Delivery",
66
+ "DietAndLifestyle",
67
+ "DmEndpoint",
68
+ "DmFollowup",
69
+ "EgfrDropNotification",
70
+ "Eq5d3l",
71
+ "FollowupExamination",
72
+ "FollowupVitals",
73
+ "Glucose",
74
+ "GlucoseFbg",
75
+ "HealthEconomics",
76
+ "HealthEconomicsSimple",
77
+ "HealthEconomicsUpdate",
78
+ "HepatitisTest",
79
+ "HivExitReview",
80
+ "MalariaTest",
81
+ "MedicationAdherence",
82
+ "Mnsi",
83
+ "NextAppointment",
84
+ "OtherArvRegimens",
85
+ "OtherArvRegimensDetail",
86
+ "PatientHistory",
87
+ "PhysicalExam",
88
+ "PregnancyUpdate",
89
+ "Sf12",
90
+ "StudyMedication",
91
+ "SubjectRequisition",
92
+ "SubjectVisit",
93
+ "SubjectVisitMissed",
94
+ "UrineDipstickTest",
95
+ "UrinePregnancy",
96
+ "study_medication_on_pre_save",
97
+ "update_glucose_endpoints_for_subject_on_post_save",
98
+ "update_pregnancy_notification_on_delivery_post_save",
99
+ "update_schedule_on_delivery_post_save",
100
+ ]
@@ -15,7 +15,7 @@ from .delivery import Delivery
15
15
  class Manager(models.Manager):
16
16
  use_in_migrations = True
17
17
 
18
- def get_by_natural_key(
18
+ def get_by_natural_key( # noqa: PLR0913
19
19
  self,
20
20
  birth_order,
21
21
  subject_identifier,
@@ -97,5 +97,5 @@ class BirthOutcomes(
97
97
  class Meta(BaseUuidModel.Meta):
98
98
  verbose_name = "Birth Outcomes"
99
99
  verbose_name_plural = "Birth Outcomes"
100
- indexes = [Index(fields=["delivery", "birth_order"])]
101
- unique_together = ["delivery", "birth_order"]
100
+ indexes = (Index(fields=["delivery", "birth_order"]),)
101
+ unique_together = ("delivery", "birth_order")
@@ -1,6 +1,17 @@
1
1
  from .blood_results_fbc import BloodResultsFbc
2
+ from .blood_results_glu import BloodResultsGluDummy
2
3
  from .blood_results_hba1c import BloodResultsHba1c
3
4
  from .blood_results_ins import BloodResultsIns
4
5
  from .blood_results_lft import BloodResultsLft
5
6
  from .blood_results_lipids import BloodResultsLipids
6
7
  from .blood_results_rft import BloodResultsRft
8
+
9
+ __all__ = [
10
+ "BloodResultsFbc",
11
+ "BloodResultsGluDummy",
12
+ "BloodResultsHba1c",
13
+ "BloodResultsIns",
14
+ "BloodResultsLft",
15
+ "BloodResultsLipids",
16
+ "BloodResultsRft",
17
+ ]
@@ -0,0 +1,29 @@
1
+ from django.db import models
2
+ from edc_lab.model_mixins import CrfWithRequisitionModelMixin, requisition_fk_options
3
+ from edc_lab_panel.panels import blood_glucose_panel
4
+ from edc_lab_results import BLOOD_RESULTS_GLU_ACTION
5
+ from edc_lab_results.model_mixins import BloodResultsModelMixin, GlucoseModelMixin
6
+ from edc_model.models import BaseUuidModel
7
+
8
+ from ...model_mixins import CrfWithActionModelMixin
9
+
10
+
11
+ # TODO: this is a IFG!!
12
+ class BloodResultsGluDummy(
13
+ CrfWithActionModelMixin,
14
+ GlucoseModelMixin,
15
+ CrfWithRequisitionModelMixin,
16
+ BloodResultsModelMixin,
17
+ BaseUuidModel,
18
+ ):
19
+ action_name = BLOOD_RESULTS_GLU_ACTION
20
+ tracking_identifier_prefix = "GL"
21
+ lab_panel = blood_glucose_panel
22
+
23
+ requisition = models.ForeignKey(
24
+ limit_choices_to={"panel__name": blood_glucose_panel.name}, **requisition_fk_options
25
+ )
26
+
27
+ class Meta(CrfWithActionModelMixin.Meta, BaseUuidModel.Meta):
28
+ verbose_name = "Blood Result: Glucose (DUMMY)"
29
+ verbose_name_plural = "Blood Results: Glucose (DUMMY)"
@@ -18,7 +18,6 @@ class BloodResultsHba1c(
18
18
  BaseUuidModel,
19
19
  ):
20
20
  action_name = BLOOD_RESULTS_HBA1C_ACTION
21
- tracking_identifier_prefix = "HA"
22
21
  lab_panel = hba1c_panel
23
22
 
24
23
  requisition = models.ForeignKey(
@@ -18,7 +18,6 @@ class BloodResultsIns(
18
18
  BaseUuidModel,
19
19
  ):
20
20
  action_name = BLOOD_RESULTS_INSULIN_ACTION
21
- tracking_identifier_prefix = "IN"
22
21
  lab_panel = insulin_panel
23
22
 
24
23
  requisition = models.ForeignKey(
@@ -31,7 +31,6 @@ class BloodResultsLft(
31
31
  BaseUuidModel,
32
32
  ):
33
33
  action_name = BLOOD_RESULTS_LFT_ACTION
34
- tracking_identifier_prefix = "LF"
35
34
  lab_panel = lft_panel
36
35
 
37
36
  requisition = models.ForeignKey(
@@ -1,12 +1,12 @@
1
1
  # TODO: urine_bhcg form (probably not necessary)
2
2
  # TODO: if pos, take of study drug and estimate
3
3
  # delivery date for the pregnancy outcomes form. See Form 25/26
4
+ from clinicedc_constants import NOT_APPLICABLE, PATIENT, YES
4
5
  from django.apps import apps as django_apps
5
6
  from django.core.validators import MaxValueValidator, MinValueValidator
6
7
  from django.db import models
7
8
  from django_crypto_fields.fields import EncryptedTextField
8
9
  from edc_constants.choices import YES_NO, YES_NO_NA
9
- from edc_constants.constants import NOT_APPLICABLE, PATIENT, YES
10
10
  from edc_model.models import BaseUuidModel
11
11
  from edc_model.validators import datetime_not_future
12
12
  from edc_model_fields.fields import OtherCharField
@@ -38,8 +38,6 @@ class Delivery(
38
38
 
39
39
  action_name = DELIVERY_ACTION
40
40
 
41
- tracking_identifier_prefix = "DL"
42
-
43
41
  report_datetime = models.DateTimeField(
44
42
  verbose_name="Report Date and Time", default=get_utcnow
45
43
  )
@@ -54,7 +52,7 @@ class Delivery(
54
52
 
55
53
  info_not_available_reason = models.TextField(
56
54
  verbose_name="If the report was not available, please explain?",
57
- null=True,
55
+ default="",
58
56
  blank=True,
59
57
  )
60
58
 
@@ -112,7 +110,7 @@ class Delivery(
112
110
  "please give name of the facility"
113
111
  ),
114
112
  max_length=150,
115
- null=True,
113
+ default="",
116
114
  blank=True,
117
115
  )
118
116
 
@@ -162,4 +160,4 @@ class Delivery(
162
160
  class Meta(CrfWithActionModelMixin.Meta, BaseUuidModel.Meta):
163
161
  verbose_name = "Delivery"
164
162
  verbose_name_plural = "Delivery"
165
- unique_together = ["subject_visit", "delivery_datetime"]
163
+ unique_together = ("subject_visit", "delivery_datetime")
@@ -1,2 +1,4 @@
1
1
  from .dm_endpoint import DmEndpoint
2
2
  from .dm_followup import DmFollowup
3
+
4
+ __all__ = ["DmEndpoint", "DmFollowup"]
@@ -1,6 +1,6 @@
1
+ from clinicedc_constants import QUESTION_RETIRED
1
2
  from django.db import models
2
3
  from edc_constants.choices import YES_NO, YES_NO_RETIRED
3
- from edc_constants.constants import QUESTION_RETIRED
4
4
  from edc_model.models import BaseUuidModel
5
5
  from edc_model_fields.fields import OtherCharField
6
6
 
@@ -16,7 +16,7 @@ class DmEndpoint(CrfModelMixin, BaseUuidModel):
16
16
  verbose_name="Was the patient referred because the diabetes endpoint was reached?",
17
17
  max_length=15,
18
18
  choices=YES_NO,
19
- null=True,
19
+ default="",
20
20
  blank=False,
21
21
  help_text="If YES, the EDC will check for the patient on the Endpoints report.",
22
22
  )
@@ -32,7 +32,7 @@ class DmEndpoint(CrfModelMixin, BaseUuidModel):
32
32
  )
33
33
 
34
34
  # retired
35
- dx_initiated_by_other = OtherCharField(null=True, blank=True)
35
+ dx_initiated_by_other = OtherCharField(blank=True)
36
36
 
37
37
  # retired
38
38
  dx_tmg = models.CharField(
@@ -50,11 +50,11 @@ class DmEndpoint(CrfModelMixin, BaseUuidModel):
50
50
  # retired
51
51
  dx_no_tmg_reason = models.TextField(
52
52
  verbose_name="If NO, please explain why this case was not discussed with the TMG",
53
- null=True,
53
+ default="",
54
54
  blank=True,
55
55
  )
56
56
 
57
- comments = models.TextField(verbose_name="Any other comments", null=True, blank=True)
57
+ comments = models.TextField(verbose_name="Any other comments", default="", blank=True)
58
58
 
59
59
  class Meta(CrfModelMixin.Meta, BaseUuidModel.Meta):
60
60
  verbose_name = "Diabetes endpoint"
@@ -1,10 +1,10 @@
1
+ from clinicedc_constants import NOT_APPLICABLE, QUESTION_RETIRED
1
2
  from django.core.validators import MaxValueValidator, MinValueValidator
2
3
  from django.db import models
3
- from django.utils.html import format_html
4
+ from django.utils.safestring import mark_safe
4
5
  from edc_action_item.models import ActionItem
5
6
  from edc_adherence.choices import MISSED_PILLS
6
7
  from edc_constants.choices import YES_NO, YES_NO_NA
7
- from edc_constants.constants import NOT_APPLICABLE, QUESTION_RETIRED
8
8
  from edc_model.models import BaseUuidModel
9
9
  from edc_model_fields.fields import OtherCharField
10
10
 
@@ -22,7 +22,6 @@ from ...model_mixins import CrfWithActionModelMixin
22
22
 
23
23
 
24
24
  class DmFollowup(CrfWithActionModelMixin, BaseUuidModel):
25
-
26
25
  action_name = DM_FOLLOWUP_ACTION
27
26
 
28
27
  referral_date = models.DateField(
@@ -63,7 +62,7 @@ class DmFollowup(CrfWithActionModelMixin, BaseUuidModel):
63
62
  facility_attended = models.CharField(
64
63
  verbose_name="If 'Yes', please give the name of the facility you attended",
65
64
  max_length=50,
66
- null=True,
65
+ default="",
67
66
  blank=True,
68
67
  )
69
68
 
@@ -181,15 +180,15 @@ class DmFollowup(CrfWithActionModelMixin, BaseUuidModel):
181
180
  verbose_name="Visual score",
182
181
  max_length=3,
183
182
  help_text="%",
184
- null=True,
183
+ default="",
185
184
  blank=True,
186
185
  )
187
186
 
188
187
  visual_score_confirmed = models.IntegerField(
189
- verbose_name=format_html(
188
+ verbose_name=mark_safe(
190
189
  "<B><font color='orange'>Interviewer</font></B>: "
191
190
  "please transcribe the score indicated from above."
192
- ),
191
+ ), # nosec B308
193
192
  validators=[MinValueValidator(0), MaxValueValidator(100)],
194
193
  help_text="%",
195
194
  null=True,
@@ -200,7 +199,7 @@ class DmFollowup(CrfWithActionModelMixin, BaseUuidModel):
200
199
  verbose_name="When was the last time you missed your study pill?",
201
200
  max_length=25,
202
201
  choices=MISSED_PILLS,
203
- null=True,
202
+ default="",
204
203
  blank=True,
205
204
  )
206
205
 
@@ -8,11 +8,11 @@ from ..model_mixins import CrfModelMixin
8
8
  class DietAndLifestyle(CrfModelMixin, BaseUuidModel):
9
9
  diet_and_lifestyle = models.CharField(
10
10
  verbose_name=(
11
- "Has the participant received the META3 " "approved diet and lifetsyle counseling?"
11
+ "Has the participant received the META3 approved diet and lifetsyle counseling?"
12
12
  ),
13
13
  max_length=15,
14
14
  choices=YES_NO,
15
- null=True,
15
+ default="",
16
16
  blank=False,
17
17
  help_text="This response is not criteria for eligibility",
18
18
  )