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
@@ -3,3 +3,11 @@ from .eligibility_model_mixin import EligibilityModelMixin
3
3
  from .part_one_fields_model_mixin import PartOneFieldsModelMixin
4
4
  from .part_three_fields_model_mixin import PartThreeFieldsModelMixin
5
5
  from .part_two_fields_model_mixin import PartTwoFieldsModelMixin
6
+
7
+ __all__ = [
8
+ "CalculatedModelMixin",
9
+ "EligibilityModelMixin",
10
+ "PartOneFieldsModelMixin",
11
+ "PartThreeFieldsModelMixin",
12
+ "PartTwoFieldsModelMixin",
13
+ ]
@@ -1,7 +1,7 @@
1
+ from clinicedc_constants import MILLIMOLES_PER_LITER, TBD
1
2
  from django.db import models
2
3
  from edc_constants.choices import YES_NO_TBD
3
- from edc_constants.constants import TBD
4
- from edc_reportable.units import MICROMOLES_PER_LITER_DISPLAY, MILLIMOLES_PER_LITER
4
+ from edc_reportable.units import MICROMOLES_PER_LITER_DISPLAY
5
5
 
6
6
 
7
7
  class CalculatedModelMixin(models.Model):
@@ -1,5 +1,5 @@
1
+ from clinicedc_constants import NOT_APPLICABLE
1
2
  from django.db import models
2
- from edc_constants.constants import NOT_APPLICABLE
3
3
  from edc_lab.choices import SERUM_CREATININE_UNITS_NA
4
4
 
5
5
 
@@ -1,6 +1,6 @@
1
+ from clinicedc_constants import TBD
1
2
  from django.db import models
2
3
  from edc_constants.choices import YES_NO_TBD
3
- from edc_constants.constants import TBD
4
4
  from edc_screening.model_mixins import (
5
5
  EligibilityModelMixin as BaseEligibilityModelMixin,
6
6
  )
@@ -19,7 +19,7 @@ class EligibilityModelMixin(BaseEligibilityModelMixin):
19
19
  help_text="system calculated value",
20
20
  )
21
21
 
22
- reasons_ineligible_part_one = models.TextField(max_length=150, null=True, editable=False)
22
+ reasons_ineligible_part_one = models.TextField(max_length=150, default="", editable=False)
23
23
 
24
24
  eligible_part_two = models.CharField(
25
25
  max_length=15,
@@ -29,7 +29,7 @@ class EligibilityModelMixin(BaseEligibilityModelMixin):
29
29
  help_text="system calculated value",
30
30
  )
31
31
 
32
- reasons_ineligible_part_two = models.TextField(max_length=150, null=True, editable=False)
32
+ reasons_ineligible_part_two = models.TextField(max_length=150, default="", editable=False)
33
33
 
34
34
  eligible_part_three = models.CharField(
35
35
  max_length=15,
@@ -39,7 +39,9 @@ class EligibilityModelMixin(BaseEligibilityModelMixin):
39
39
  help_text="system calculated value",
40
40
  )
41
41
 
42
- reasons_ineligible_part_three = models.TextField(max_length=150, null=True, editable=False)
42
+ reasons_ineligible_part_three = models.TextField(
43
+ max_length=150, default="", editable=False
44
+ )
43
45
 
44
46
  def get_report_datetime_for_eligibility_datetime(self):
45
47
  return self.part_three_report_datetime
@@ -1,9 +1,8 @@
1
+ from clinicedc_constants import YES
1
2
  from django.db import models
2
- from django.utils.html import format_html
3
3
  from django.utils.safestring import mark_safe
4
4
  from django_crypto_fields.fields import EncryptedCharField
5
5
  from edc_constants.choices import SELECTION_METHOD, YES_NO, YES_NO_NA, YESDEFAULT_NO
6
- from edc_constants.constants import YES
7
6
 
8
7
  from ..choices import ETHNICITY
9
8
  from ..constants import PREG_YES_NO_NA
@@ -11,10 +10,10 @@ from ..constants import PREG_YES_NO_NA
11
10
 
12
11
  class PartOneFieldsModelMixin(models.Model):
13
12
  screening_consent = models.CharField(
14
- verbose_name=format_html(
13
+ verbose_name=mark_safe(
15
14
  "Has the subject given his/her verbal consent to be screened for "
16
15
  "the <u>META Phase 3</u> trial?"
17
- ),
16
+ ), # nosec B308
18
17
  max_length=15,
19
18
  choices=YES_NO,
20
19
  )
@@ -26,10 +25,10 @@ class PartOneFieldsModelMixin(models.Model):
26
25
  )
27
26
 
28
27
  meta_phase_two = models.CharField(
29
- verbose_name=format_html("Was the subject enrolled in the <u>META Phase 2</u> trial?"),
28
+ verbose_name=mark_safe("Was the subject enrolled in the <u>META Phase 2</u> trial?"), # nosec B308
30
29
  max_length=15,
31
30
  choices=YES_NO,
32
- null=True,
31
+ default="",
33
32
  blank=False,
34
33
  )
35
34
 
@@ -44,9 +43,9 @@ class PartOneFieldsModelMixin(models.Model):
44
43
  )
45
44
 
46
45
  art_six_months = models.CharField(
47
- verbose_name=format_html(
46
+ verbose_name=mark_safe(
48
47
  "Has the patient been on anti-retroviral therapy for <u>at least 6 months</u>"
49
- ),
48
+ ), # nosec B308
50
49
  max_length=15,
51
50
  choices=YES_NO_NA,
52
51
  )
@@ -59,10 +58,10 @@ class PartOneFieldsModelMixin(models.Model):
59
58
  )
60
59
 
61
60
  vl_undetectable = models.CharField(
62
- verbose_name=format_html(
61
+ verbose_name=mark_safe(
63
62
  "Does the patient have a viral load measure of less than 1000 copies per ml "
64
63
  "taken <u>within the last 12 months</u>"
65
- ),
64
+ ), # nosec B308
66
65
  max_length=15,
67
66
  choices=YES_NO_NA,
68
67
  )
@@ -79,20 +78,20 @@ class PartOneFieldsModelMixin(models.Model):
79
78
  ),
80
79
  max_length=15,
81
80
  choices=YES_NO,
82
- null=True,
81
+ default="",
83
82
  blank=False,
84
83
  help_text="META PHASE_TWO ONLY",
85
84
  editable=False,
86
85
  )
87
86
 
88
87
  staying_nearby_12 = models.CharField(
89
- verbose_name=format_html(
88
+ verbose_name=mark_safe(
90
89
  "Is the patient planning to remain in the catchment area "
91
90
  "for <u>at least 12 months</u>"
92
- ),
91
+ ), # nosec B308
93
92
  max_length=15,
94
93
  choices=YES_NO,
95
- null=True,
94
+ default="",
96
95
  blank=False,
97
96
  )
98
97
 
@@ -101,18 +100,16 @@ class PartOneFieldsModelMixin(models.Model):
101
100
  )
102
101
 
103
102
  continue_part_two = models.CharField(
104
- verbose_name=mark_safe( # nosec B308
105
- "Continue with <U>part two</U> of the screening process?"
106
- ),
103
+ verbose_name=mark_safe("Continue with <U>part two</U> of the screening process?"), # nosec B308
107
104
  max_length=15,
108
105
  choices=YESDEFAULT_NO,
109
106
  default=YES,
110
- help_text=mark_safe( # nosec B308
107
+ help_text=mark_safe(
111
108
  "<B>Important</B>: This response will be be automatically "
112
109
  "set to YES if:<BR><BR>"
113
110
  "- the participant meets the eligibility criteria for part one, or;<BR><BR>"
114
111
  "- the eligibility criteria for part two is already complete.<BR>"
115
- ),
112
+ ), # nosec B308
116
113
  )
117
114
 
118
115
  class Meta:
@@ -1,9 +1,9 @@
1
+ from clinicedc_constants import NOT_APPLICABLE
1
2
  from django.contrib import admin
2
3
  from django.core.validators import MaxValueValidator, MinValueValidator
3
4
  from django.db import models
4
5
  from edc_constants.choices import NO, YES_NO, YES_NO_PENDING_NA_GLUCOSE_SCREENING
5
- from edc_constants.constants import NOT_APPLICABLE
6
- from edc_glucose.model_mixins import (
6
+ from edc_glucose.model_mixin_factories import (
7
7
  fasting_model_mixin_factory,
8
8
  fbg_model_mixin_factory,
9
9
  ogtt_model_mixin_factory,
@@ -94,14 +94,13 @@ class PartThreeFieldsModelMixin(
94
94
  ):
95
95
  repeat_glucose_opinion = models.CharField(
96
96
  verbose_name=(
97
- "In opinion of the clinician, " "should the glucose measurements be repeated?"
97
+ "In opinion of the clinician, should the glucose measurements be repeated?"
98
98
  ),
99
99
  max_length=15,
100
100
  choices=YES_NO,
101
101
  default=NO,
102
102
  help_text=(
103
- "If repeated, must be at least 3 days "
104
- "after the first glucose measures (FBG, OGTT)"
103
+ "If repeated, must be at least 3 days after the first glucose measures (FBG, OGTT)"
105
104
  ),
106
105
  )
107
106
 
@@ -124,7 +123,7 @@ class PartThreeFieldsModelMixin(
124
123
  verbose_name="Units (creatinine)",
125
124
  max_length=15,
126
125
  choices=SERUM_CREATININE_UNITS,
127
- null=True,
126
+ default="",
128
127
  blank=True,
129
128
  )
130
129
 
@@ -180,5 +179,5 @@ class PartThreeFieldsModelMixin(
180
179
  def p3_repeat_appt(self):
181
180
  return self.repeat_appt_datetime
182
181
 
183
- class Meta:
182
+ class Meta: # noqa: DJ012
184
183
  abstract = True
@@ -1,7 +1,7 @@
1
+ from clinicedc_constants import NO, NOT_APPLICABLE
1
2
  from django.contrib import admin
2
3
  from django.db import models
3
4
  from edc_constants.choices import POS_NEG_NA, YES_NO, YES_NO_NA
4
- from edc_constants.constants import NO, NOT_APPLICABLE
5
5
 
6
6
  from ..choices import YES_NO_NOT_ELIGIBLE, YES_PENDING_NA
7
7
  from ..constants import PREG_YES_NO_NA
@@ -40,7 +40,7 @@ class PartTwoFieldsModelMixin(models.Model):
40
40
  ),
41
41
  max_length=15,
42
42
  choices=YES_NO,
43
- null=True,
43
+ default="",
44
44
  blank=False,
45
45
  )
46
46
 
@@ -48,7 +48,7 @@ class PartTwoFieldsModelMixin(models.Model):
48
48
  verbose_name="Is there clinical evidence of liver disease",
49
49
  max_length=15,
50
50
  choices=YES_NO,
51
- null=True,
51
+ default="",
52
52
  blank=False,
53
53
  help_text=(
54
54
  "Evidence of chronic liver disease: Jaundice, pruritus, "
@@ -62,7 +62,7 @@ class PartTwoFieldsModelMixin(models.Model):
62
62
  ),
63
63
  max_length=15,
64
64
  choices=YES_NO,
65
- null=True,
65
+ default="",
66
66
  blank=False,
67
67
  help_text=(
68
68
  "Evidence of alcoholism or acute alcohol intoxication: "
@@ -77,7 +77,7 @@ class PartTwoFieldsModelMixin(models.Model):
77
77
  ),
78
78
  max_length=15,
79
79
  choices=YES_NO,
80
- null=True,
80
+ default="",
81
81
  blank=False,
82
82
  help_text="lactic acidosis and/or diabetic ketoacidosis",
83
83
  )
@@ -88,7 +88,7 @@ class PartTwoFieldsModelMixin(models.Model):
88
88
  ),
89
89
  max_length=15,
90
90
  choices=YES_NO,
91
- null=True,
91
+ default="",
92
92
  blank=False,
93
93
  )
94
94
 
@@ -98,7 +98,7 @@ class PartTwoFieldsModelMixin(models.Model):
98
98
  ),
99
99
  max_length=15,
100
100
  choices=YES_NO,
101
- null=True,
101
+ default="",
102
102
  blank=False,
103
103
  help_text=(
104
104
  "Including: decompensated heart failure, respiratory failure, "
@@ -113,7 +113,7 @@ class PartTwoFieldsModelMixin(models.Model):
113
113
  ),
114
114
  max_length=15,
115
115
  choices=YES_NO,
116
- null=True,
116
+ default="",
117
117
  blank=False,
118
118
  )
119
119
 
@@ -124,7 +124,7 @@ class PartTwoFieldsModelMixin(models.Model):
124
124
  ),
125
125
  max_length=15,
126
126
  choices=YES_NO,
127
- null=True,
127
+ default="",
128
128
  blank=False,
129
129
  help_text=(
130
130
  "For example: Magnesium stearate, sodium carboxymethylcellulose, hypromellose"
@@ -135,7 +135,7 @@ class PartTwoFieldsModelMixin(models.Model):
135
135
  verbose_name="Is the patient known to have diabetes?",
136
136
  max_length=15,
137
137
  choices=YES_NO,
138
- null=True,
138
+ default="",
139
139
  blank=False,
140
140
  )
141
141
 
@@ -143,7 +143,7 @@ class PartTwoFieldsModelMixin(models.Model):
143
143
  verbose_name="Is the patient known to be taking anti-diabetic medications?",
144
144
  max_length=15,
145
145
  choices=YES_NO,
146
- null=True,
146
+ default="",
147
147
  blank=False,
148
148
  )
149
149
 
@@ -191,9 +191,9 @@ class PartTwoFieldsModelMixin(models.Model):
191
191
  choices=YES_PENDING_NA,
192
192
  default=NOT_APPLICABLE,
193
193
  help_text=(
194
- "Only applicable if the patient missed the appointment for the second stage "
195
- "of screening (P3), several attempts have been made to contact the patient, "
196
- "and the patient has not started P3. See above"
194
+ "Only applicable if the patient missed the appointment for the second "
195
+ "stage of screening (P3), several attempts have been made to contact the "
196
+ "patient, and the patient has not started P3. See above"
197
197
  ),
198
198
  )
199
199
 
@@ -201,12 +201,14 @@ class PartTwoFieldsModelMixin(models.Model):
201
201
  verbose_name="Date decision made",
202
202
  null=True,
203
203
  blank=True,
204
- help_text="Must be after the appointment date for the second stage of screening (P3)",
204
+ help_text=(
205
+ "Must be after the appointment date for the second stage of screening (P3)"
206
+ ),
205
207
  )
206
208
 
207
209
  p3_ltfu_comment = models.TextField(
208
210
  verbose_name="Provide any additional comments on this decision (or leave blank)",
209
- null=True,
211
+ default="",
210
212
  blank=True,
211
213
  )
212
214
 
@@ -214,5 +216,5 @@ class PartTwoFieldsModelMixin(models.Model):
214
216
  def p3_appt(self):
215
217
  return self.appt_datetime
216
218
 
217
- class Meta:
219
+ class Meta: # noqa: DJ012
218
220
  abstract = True
@@ -3,3 +3,12 @@ from .proxy_models import ScreeningPartOne, ScreeningPartThree, ScreeningPartTwo
3
3
  from .signals import update_p3_ltfu_on_post_save
4
4
  from .subject_refusal import SubjectRefusal
5
5
  from .subject_screening import SubjectScreening
6
+
7
+ __all__ = [
8
+ "ScreeningPartOne",
9
+ "ScreeningPartThree",
10
+ "ScreeningPartTwo",
11
+ "SubjectRefusal",
12
+ "SubjectScreening",
13
+ "update_p3_ltfu_on_post_save",
14
+ ]
@@ -21,7 +21,7 @@ class IcpReferralManager(models.Manager):
21
21
 
22
22
 
23
23
  class IcpReferral(SiteModelMixin, BaseUuidModel):
24
- """ "Not used"""
24
+ """Not used"""
25
25
 
26
26
  subject_screening = models.OneToOneField(
27
27
  SubjectScreening, null=True, on_delete=models.PROTECT
@@ -91,7 +91,7 @@ class IcpReferral(SiteModelMixin, BaseUuidModel):
91
91
 
92
92
  referred_datetime = models.DateTimeField(null=True, help_text="Date and time of referral")
93
93
 
94
- referral_reasons = models.TextField(null=True)
94
+ referral_reasons = models.TextField(default="")
95
95
 
96
96
  objects = IcpReferralManager()
97
97
 
@@ -102,17 +102,17 @@ class IcpReferral(SiteModelMixin, BaseUuidModel):
102
102
  def save(self, *args, **kwargs):
103
103
  try:
104
104
  SubjectScreening.objects.get(screening_identifier=self.screening_identifier)
105
- except ObjectDoesNotExist:
105
+ except ObjectDoesNotExist as e:
106
106
  raise IcpReferralError(
107
107
  f"Invalid META screening identifier. Got {self.screening_identifier}"
108
- )
108
+ ) from e
109
109
  super().save(*args, **kwargs)
110
110
 
111
111
  def __str__(self):
112
112
  return f"{self.screening_identifier} {self.gender} {self.age_in_years}"
113
113
 
114
114
  def natural_key(self):
115
- return (self.screening_identifier,) # noqa
115
+ return (self.screening_identifier,)
116
116
 
117
117
  class Meta:
118
118
  pass
@@ -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
  from meta_consent.consents import consent_v1
4
4
 
@@ -1,6 +1,6 @@
1
+ from clinicedc_constants import NOT_APPLICABLE, NULL_STRING
1
2
  from django.db.models.signals import post_save
2
3
  from django.dispatch import receiver
3
- from edc_constants.constants import NOT_APPLICABLE
4
4
 
5
5
  from .proxy_models import ScreeningPartThree
6
6
 
@@ -11,14 +11,13 @@ from .proxy_models import ScreeningPartThree
11
11
  sender=ScreeningPartThree,
12
12
  dispatch_uid="update_p3_ltfu_on_post_save",
13
13
  )
14
- def update_p3_ltfu_on_post_save(sender, instance, raw, created, **kwargs):
14
+ def update_p3_ltfu_on_post_save(sender, instance, raw, created, **kwargs): # noqa: ARG001
15
15
  """ """
16
- if not raw:
17
- if instance.p3_ltfu != NOT_APPLICABLE and instance.part_three_report_datetime:
18
- msg = "[auto-updated p3 submitted]"
19
- instance.p3_ltfu = NOT_APPLICABLE
20
- instance.p3_ltfu_date = None
21
- instance.p3_ltfu_comment = (
22
- f"{msg} {instance.p3_ltfu_comment.replace(msg, '') or ''}".strip()
23
- )
24
- instance.save_base(update_fields=["p3_ltfu", "p3_ltfu_date", "p3_ltfu_comment"])
16
+ if not raw and instance.p3_ltfu != NOT_APPLICABLE and instance.part_three_report_datetime:
17
+ msg = "[auto-updated p3 submitted]"
18
+ instance.p3_ltfu = NOT_APPLICABLE
19
+ instance.p3_ltfu_date = None
20
+ instance.p3_ltfu_comment = (
21
+ f"{msg} {instance.p3_ltfu_comment.replace(msg, NULL_STRING) or NULL_STRING}"
22
+ ).strip()
23
+ instance.save_base(update_fields=["p3_ltfu", "p3_ltfu_date", "p3_ltfu_comment"])
@@ -58,7 +58,7 @@ class SubjectRefusal(NonUniqueSubjectIdentifierModelMixin, SiteModelMixin, BaseU
58
58
  return (self.subject_identifier,)
59
59
 
60
60
  def get_search_slug_fields(self):
61
- return ["screening_identifier", "subject_identifier"]
61
+ return "screening_identifier", "subject_identifier"
62
62
 
63
63
  class Meta:
64
64
  verbose_name = "Subject Refusal"
@@ -1,8 +1,8 @@
1
+ from clinicedc_constants import PENDING, QUESTION_RETIRED
1
2
  from django.contrib.sites.models import Site
2
3
  from django.core.validators import RegexValidator
3
4
  from django.db import models
4
5
  from django_crypto_fields.fields import EncryptedCharField
5
- from edc_constants.constants import PENDING, QUESTION_RETIRED
6
6
  from edc_model.models import BaseUuidModel
7
7
  from edc_screening.model_mixins import ScreeningModelMixin
8
8
  from edc_screening.screening_identifier import (
@@ -10,8 +10,6 @@ from edc_screening.screening_identifier import (
10
10
  )
11
11
  from edc_utils import get_utcnow
12
12
 
13
- from meta_consent.consents import consent_v1
14
-
15
13
  from ..model_mixins import (
16
14
  CalculatedModelMixin,
17
15
  EligibilityModelMixin,
@@ -39,7 +37,7 @@ class SubjectScreening(
39
37
  BaseUuidModel,
40
38
  ):
41
39
  identifier_cls = ScreeningIdentifier
42
- consent_definitions = [consent_v1]
40
+ # consent_definitions = [consent_v1]
43
41
 
44
42
  contact_number = EncryptedCharField(
45
43
  validators=[RegexValidator(r"^[0-9\-\(\)\ ]+$", message="Enter a valid number")],
@@ -1,8 +1,9 @@
1
+ from clinicedc_constants import GRADE3, GRADE4, HIGH_PRIORITY, NEW, NONE, POS, YES
1
2
  from django.apps import apps as django_apps
2
- from edc_action_item import Action, ActionWithNotification, site_action_items
3
- from edc_action_item.site_action_items import AlreadyRegistered
3
+ from edc_action_item.action import Action
4
+ from edc_action_item.action_with_notification import ActionWithNotification
5
+ from edc_action_item.site_action_items import AlreadyRegistered, site_action_items
4
6
  from edc_adverse_event.constants import AE_INITIAL_ACTION
5
- from edc_constants.constants import HIGH_PRIORITY, NEW, NONE, POS, YES
6
7
  from edc_egfr.constants import EGFR_DROP_NOTIFICATION_ACTION
7
8
  from edc_lab_results.action_items import (
8
9
  BloodResultsFbcAction,
@@ -10,11 +11,13 @@ from edc_lab_results.action_items import (
10
11
  BloodResultsLftAction,
11
12
  BloodResultsLipidsAction,
12
13
  )
14
+ from edc_lab_results.action_items import (
15
+ BloodResultsGluAction as BaseBloodResultsGluAction,
16
+ )
13
17
  from edc_lab_results.action_items import (
14
18
  BloodResultsRftAction as BaseBloodResultsRftAction,
15
19
  )
16
20
  from edc_ltfu.constants import LTFU_ACTION
17
- from edc_reportable import GRADE3, GRADE4
18
21
  from edc_visit_schedule.constants import OFFSCHEDULE_ACTION
19
22
  from edc_visit_schedule.utils import is_baseline
20
23
  from edc_visit_tracking.constants import MISSED_VISIT
@@ -88,8 +91,7 @@ class FollowupExaminationAction(Action):
88
91
  self.reference_obj.symptoms_g3.exclude(name=NONE).count() > 0
89
92
  or self.reference_obj.symptoms_g4.exclude(name=NONE).count() > 0
90
93
  or self.reference_obj.any_other_problems_sae_grade in [GRADE3, GRADE4]
91
- or self.reference_obj.lactic_acidosis == YES
92
- or self.reference_obj.hepatomegaly == YES
94
+ or YES in (self.reference_obj.lactic_acidosis, self.reference_obj.hepatomegaly)
93
95
  ) and not is_baseline(instance=self.reference_obj.subject_visit):
94
96
  next_actions.append(AE_INITIAL_ACTION)
95
97
  return next_actions
@@ -122,27 +124,30 @@ class BloodResultsRftAction(BaseBloodResultsRftAction):
122
124
  return next_actions
123
125
 
124
126
 
127
+ class BloodResultsGluAction(BaseBloodResultsGluAction):
128
+ reference_model = "meta_subject.bloodresultsgludummy"
129
+
130
+
125
131
  class DeliveryAction(ActionWithNotification):
126
132
  name = DELIVERY_ACTION
127
133
  display_name = "Submit Delivery Form"
128
134
  notification_display_name = "Delivery Form"
129
- parent_action_names = [PREGNANCY_NOTIFICATION_ACTION]
135
+ parent_action_names = (PREGNANCY_NOTIFICATION_ACTION,)
130
136
  reference_model = "meta_subject.delivery"
131
137
  show_link_to_changelist = True
132
- show_link_to_add = True
138
+ show_link_to_add = False
133
139
  admin_site_name = "meta_subject_admin"
134
140
  priority = HIGH_PRIORITY
135
141
 
136
142
  def get_next_actions(self):
137
- next_actions = [OFFSCHEDULE_PREGNANCY_ACTION]
138
- return next_actions
143
+ return [OFFSCHEDULE_PREGNANCY_ACTION]
139
144
 
140
145
 
141
146
  class EgfrDropNotificationAction(ActionWithNotification):
142
147
  name = EGFR_DROP_NOTIFICATION_ACTION
143
148
  display_name = "eGFR drop warning"
144
149
  notification_display_name = "eGFR drop warning"
145
- parent_action_names = []
150
+ parent_action_names = ()
146
151
  reference_model = "meta_subject.egfrdropnotification"
147
152
  show_link_to_changelist = True
148
153
  show_link_to_add = True
@@ -157,7 +162,7 @@ class DmFollowAction(ActionWithNotification):
157
162
  name = DM_FOLLOWUP_ACTION
158
163
  display_name = "Diabetes Followup"
159
164
  notification_display_name = "Diabetes Followup"
160
- parent_action_names = [DM_REFFERAL_ACTION]
165
+ parent_action_names = (DM_REFFERAL_ACTION,)
161
166
  reference_model = "meta_subject.dmfollowup"
162
167
  show_link_to_changelist = True
163
168
  show_link_to_add = False
@@ -168,8 +173,7 @@ class DmFollowAction(ActionWithNotification):
168
173
  priority = HIGH_PRIORITY
169
174
 
170
175
  def get_next_actions(self):
171
- next_actions = [OFFSCHEDULE_DM_REFERRAL_ACTION]
172
- return next_actions
176
+ return [OFFSCHEDULE_DM_REFERRAL_ACTION]
173
177
 
174
178
 
175
179
  def register_actions():
@@ -19,9 +19,11 @@ from .glucose_admin import GlucoseAdmin
19
19
  from .glucose_fbg_admin import GlucoseFbgAdmin
20
20
  from .health_economics import HealthEconomicsSimpleAdmin, HealthEconomicsUpdateAdmin
21
21
  from .hepatitis_test_admin import HepatitisTestAdmin
22
+ from .hiv_exit_review_admin import HivExitReviewAdmin
22
23
  from .malaria_test_admin import MalariaTestAdmin
23
24
  from .medication_adherence_admin import MedicationAdherenceAdmin
24
25
  from .mnsi_admin import MnsiAdmin
26
+ from .next_appointment_admin import NextAppointmentAdmin
25
27
  from .other_arv_regimens_admin import OtherArvRegimensAdmin
26
28
  from .patient_history_admin import PatientHistoryAdmin
27
29
  from .physical_exam_admin import PhysicalExamAdmin
@@ -33,3 +35,43 @@ from .subject_visit_admin import SubjectVisitAdmin
33
35
  from .subject_visit_missed_admin import SubjectVisitMissedAdmin
34
36
  from .urine_dipstick_test_admin import UrineDipstickTestAdmin
35
37
  from .urine_pregnancy_admin import UrinePregnancyAdmin
38
+
39
+ __all__ = [
40
+ "ArvRegimensAdmin",
41
+ "BirthOutcomesAdmin",
42
+ "BloodResultsFbcAdmin",
43
+ "BloodResultsLftAdmin",
44
+ "BloodResultsLipidsAdmin",
45
+ "BloodResultsRftAdmin",
46
+ "ComplicationsAdmin",
47
+ "ComplicationsGlycemiaAdmin",
48
+ "ConcomitantMedicationAdmin",
49
+ "DeliveryAdmin",
50
+ "DmEndpointAdmin",
51
+ "DmFollowupAdmin",
52
+ "EgfrDropNotificationAdmin",
53
+ "Eq5d3lAdmin",
54
+ "FollowupExaminationAdmin",
55
+ "FollowupVitalsAdmin",
56
+ "GlucoseAdmin",
57
+ "GlucoseFbgAdmin",
58
+ "HealthEconomicsSimpleAdmin",
59
+ "HealthEconomicsUpdateAdmin",
60
+ "HepatitisTestAdmin",
61
+ "HivExitReviewAdmin",
62
+ "MalariaTestAdmin",
63
+ "MedicationAdherenceAdmin",
64
+ "MnsiAdmin",
65
+ "NextAppointmentAdmin",
66
+ "OtherArvRegimensAdmin",
67
+ "PatientHistoryAdmin",
68
+ "PhysicalExamAdmin",
69
+ "PregnancyUpdateAdmin",
70
+ "Sf12Admin",
71
+ "StudyMedicationAdmin",
72
+ "SubjectRequisitionAdmin",
73
+ "SubjectVisitAdmin",
74
+ "SubjectVisitMissedAdmin",
75
+ "UrineDipstickTestAdmin",
76
+ "UrinePregnancyAdmin",
77
+ ]