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,21 @@
1
+ # Generated by Django 5.2.7 on 2025-10-03 21:43
2
+
3
+ from django.db import migrations
4
+
5
+
6
+ def fix_report_models(apps, schema_editor):
7
+ note_cls = apps.get_model("edc_qareports", "Note")
8
+ note_cls.objects.filter(report_model="onstudy_missing_values_view").update(
9
+ report_model="meta_reports.onstudy_missing_values_view"
10
+ )
11
+ note_cls.objects.filter(report_model="onstudy_missing_lab_values_view").update(
12
+ report_model="meta_reports.onstudy_missing_lab_values_view"
13
+ )
14
+
15
+
16
+ class Migration(migrations.Migration):
17
+ dependencies = [
18
+ ("meta_reports", "0060_auto_20250926_0242"),
19
+ ]
20
+
21
+ operations = [migrations.RunPython(fix_report_models)]
@@ -0,0 +1,21 @@
1
+ # Generated by Django 5.2.7 on 2025-10-03 22:06
2
+
3
+ from django.db import migrations
4
+
5
+
6
+ def fix_report_models(apps, schema_editor):
7
+ note_cls = apps.get_model("edc_qareports", "Note")
8
+ note_cls.objects.filter(report_model="meta_reports.onstudy_missing_values_view").update(
9
+ report_model="meta_reports.onstudymissingvalues"
10
+ )
11
+ note_cls.objects.filter(
12
+ report_model="meta_reports.onstudy_missing_lab_values_view"
13
+ ).update(report_model="meta_reports.onstudymissinglabvalues")
14
+
15
+
16
+ class Migration(migrations.Migration):
17
+ dependencies = [
18
+ ("meta_reports", "0061_auto_20251004_0043"),
19
+ ]
20
+
21
+ operations = [migrations.RunPython(fix_report_models)]
@@ -14,3 +14,20 @@ from .dbviews import (
14
14
  from .endpoints import Endpoints
15
15
  from .endpoints_proxy import EndpointsProxy
16
16
  from .last_imp_refill import LastImpRefill
17
+
18
+ __all__ = [
19
+ "NOTE_STATUSES",
20
+ "Endpoints",
21
+ "EndpointsProxy",
22
+ "GlucoseSummary",
23
+ "ImpSubstitutions",
24
+ "LastImpRefill",
25
+ "MissingOgttNote",
26
+ "MissingScreeningOgtt",
27
+ "OnStudyMissingLabValues",
28
+ "OnStudyMissingValues",
29
+ "PatientHistoryMissingBaselineCd4",
30
+ "UnattendedThreeInRow",
31
+ "UnattendedThreeInRow2",
32
+ "UnattendedTwoInRow",
33
+ ]
@@ -7,3 +7,17 @@ from .patient_history_missing_baseline_cd4 import PatientHistoryMissingBaselineC
7
7
  from .unattended_three_in_row import UnattendedThreeInRow
8
8
  from .unattended_three_in_row2 import UnattendedThreeInRow2
9
9
  from .unattended_two_in_row import UnattendedTwoInRow
10
+
11
+ __all__ = [
12
+ "NOTE_STATUSES",
13
+ "GlucoseSummary",
14
+ "ImpSubstitutions",
15
+ "MissingOgttNote",
16
+ "MissingScreeningOgtt",
17
+ "OnStudyMissingLabValues",
18
+ "OnStudyMissingValues",
19
+ "PatientHistoryMissingBaselineCd4",
20
+ "UnattendedThreeInRow",
21
+ "UnattendedThreeInRow2",
22
+ "UnattendedTwoInRow",
23
+ ]
@@ -1,2 +1,4 @@
1
1
  from .unmanaged_model import GlucoseSummary
2
2
  from .view_definition import get_view_definition
3
+
4
+ __all__ = ["GlucoseSummary", "get_view_definition"]
@@ -1,3 +1,4 @@
1
+ from clinicedc_constants import NULL_STRING
1
2
  from django.db import models
2
3
  from django_db_views.db_view import DBView
3
4
  from edc_qareports.model_mixins import QaReportModelMixin, qa_reports_permissions
@@ -6,16 +7,25 @@ from .view_definition import get_view_definition
6
7
 
7
8
 
8
9
  class GlucoseSummary(QaReportModelMixin, DBView):
9
-
10
10
  fbg_value = models.DecimalField(max_digits=8, decimal_places=2, null=True)
11
11
 
12
+ fbg_units = models.CharField(max_length=15, default=NULL_STRING)
13
+
12
14
  fbg_datetime = models.DateTimeField(null=True)
13
15
 
14
16
  ogtt_value = models.DecimalField(max_digits=8, decimal_places=2, null=True)
15
17
 
18
+ ogtt_units = models.CharField(max_length=15, default=NULL_STRING)
19
+
16
20
  ogtt_datetime = models.DateTimeField(null=True)
17
21
 
18
- fasted = models.CharField(max_length=15, null=True)
22
+ fasted = models.CharField(max_length=15, default=NULL_STRING)
23
+
24
+ fasting_duration_delta = models.DurationField(
25
+ verbose_name="Fasting duration (hrs)", null=True
26
+ )
27
+
28
+ report_datetime = models.DateTimeField(null=True)
19
29
 
20
30
  visit_code = models.CharField(max_length=25)
21
31
 
@@ -25,11 +35,13 @@ class GlucoseSummary(QaReportModelMixin, DBView):
25
35
 
26
36
  offstudy_datetime = models.DateTimeField(null=True)
27
37
 
38
+ source = models.CharField(max_length=35, default=NULL_STRING)
39
+
28
40
  view_definition = get_view_definition()
29
41
 
30
42
  class Meta:
31
43
  managed = False
32
- db_table = "glucose_summary_view"
44
+ db_table = "meta_reports_glucosesummaryview"
33
45
  verbose_name = "Glucose Summary"
34
46
  verbose_name_plural = "Glucose Summary"
35
47
  default_permissions = qa_reports_permissions
@@ -3,22 +3,25 @@ from edc_qareports.sql_generator import SqlViewGenerator
3
3
 
4
4
  def get_view_definition() -> dict:
5
5
  subquery = """
6
- select v.subject_identifier, fbg_value, fbg_datetime, null as `ogtt_value`, null as `ogtt_datetime`,
6
+ select v.subject_identifier, fbg_value, fbg_units, fbg_datetime, null as `ogtt_value`, null as `ogtt_units`,
7
+ null as `ogtt_datetime`,
7
8
  case when fasting="fasting" then "Yes" when fasting="non_fasting" then "No" else fasting end as `fasted`,
8
- fbg.site_id, v.visit_code, v.visit_code_sequence, v.appointment_id, eos.offstudy_datetime
9
+ fbg.site_id, v.visit_code, v.visit_code_sequence, v.report_datetime, v.appointment_id, eos.offstudy_datetime,
10
+ fasting_duration_delta, "meta_subject.glucosefbg" as source
9
11
  from meta_subject_glucosefbg as fbg
10
12
  left join meta_subject_subjectvisit as v on v.id=fbg.subject_visit_id
11
13
  left join meta_prn_endofstudy as eos on v.subject_identifier=eos.subject_identifier
12
14
  UNION
13
- select v.subject_identifier, fbg_value, fbg_datetime, ogtt_value, ogtt_datetime,
15
+ select v.subject_identifier, fbg_value, fbg_units, fbg_datetime, ogtt_value, ogtt_units, ogtt_datetime,
14
16
  case when fasting="fasting" then "Yes" when fasting="non_fasting" then "No" else fasting end as `fasted`,
15
- fbg.site_id, v.visit_code, v.visit_code_sequence, v.appointment_id, eos.offstudy_datetime
17
+ fbg.site_id, v.visit_code, v.visit_code_sequence, v.report_datetime, v.appointment_id, eos.offstudy_datetime,
18
+ fasting_duration_delta, "meta_subject.glucose" as source
16
19
  from meta_subject_glucose as fbg
17
20
  left join meta_subject_subjectvisit as v on v.id=fbg.subject_visit_id
18
21
  left join meta_prn_endofstudy as eos on v.subject_identifier=eos.subject_identifier
19
22
  """ # noqa
20
23
  sql_view = SqlViewGenerator(
21
- report_model="meta_reports.glucose_summary_view",
24
+ report_model="meta_reports.glucosesummaryview",
22
25
  ordering=["subject_identifier", "site_id"],
23
26
  )
24
27
  return {
@@ -1 +1,3 @@
1
1
  from .unmanaged_model import ImpSubstitutions
2
+
3
+ __all__ = ["ImpSubstitutions"]
@@ -1,14 +1,13 @@
1
+ from clinicedc_constants import NOT_EVALUATED
1
2
  from django.db import models
2
3
  from django_db_views.db_view import DBView
3
4
  from edc_constants.choices import YES_NO_NOT_EVALUATED
4
- from edc_constants.constants import NOT_EVALUATED
5
5
  from edc_qareports.model_mixins import QaReportModelMixin, qa_reports_permissions
6
6
 
7
7
  from .view_definition import get_view_definition
8
8
 
9
9
 
10
10
  class ImpSubstitutions(QaReportModelMixin, DBView):
11
-
12
11
  original_id = models.UUIDField(null=True)
13
12
 
14
13
  sid = models.IntegerField(verbose_name="Original SID", null=True)
@@ -9,7 +9,7 @@ def get_view_definition() -> dict:
9
9
  from meta_pharmacy_substitutions as s left join meta_rando_randomizationlist as r
10
10
  on r.subject_identifier=s.subject_identifier
11
11
  order by s.subject_identifier
12
- """ # noqa
12
+ """
13
13
  sql_view = SqlViewGenerator(
14
14
  report_model="meta_reports.imp_subjectitutions_view",
15
15
  ordering=["subject_identifier", "site_id"],
@@ -1,2 +1,4 @@
1
1
  from .note_model import NOTE_STATUSES, MissingOgttNote
2
2
  from .unmanaged_model import MissingScreeningOgtt
3
+
4
+ __all__ = ["NOTE_STATUSES", "MissingOgttNote", "MissingScreeningOgtt"]
@@ -1,7 +1,7 @@
1
+ from clinicedc_constants import COMPLETE, DONE, NOT_APPLICABLE, NOT_AVAILABLE, YES
1
2
  from django.db import models
2
3
  from edc_constants.choices import YES_NO, YES_NO_NA
3
- from edc_constants.constants import COMPLETE, DONE, NOT_APPLICABLE, NOT_AVAILABLE, YES
4
- from edc_glucose.model_mixins import (
4
+ from edc_glucose.model_mixin_factories import (
5
5
  fasting_model_mixin_factory,
6
6
  ogtt_model_mixin_factory,
7
7
  )
@@ -6,7 +6,6 @@ from .view_definition import get_view_definition
6
6
 
7
7
 
8
8
  class MissingScreeningOgtt(QaReportModelMixin, DBView):
9
-
10
9
  screening_datetime = models.DateTimeField(null=True)
11
10
 
12
11
  fbg_datetime = models.DateTimeField(null=True)
@@ -23,9 +22,11 @@ class MissingScreeningOgtt(QaReportModelMixin, DBView):
23
22
 
24
23
  ogtt2_datetime = models.DateTimeField(null=True)
25
24
 
26
- repeated = models.CharField(null=True, max_length=25, help_text="repeat_glucose_performed")
25
+ repeated = models.CharField(
26
+ default="", max_length=25, help_text="repeat_glucose_performed"
27
+ )
27
28
 
28
- p3_ltfu = models.CharField(null=True, max_length=25)
29
+ p3_ltfu = models.CharField(default="", max_length=25)
29
30
 
30
31
  consented = models.BooleanField(null=True)
31
32
 
@@ -1 +1,3 @@
1
1
  from .unmanged_model import OnStudyMissingLabValues
2
+
3
+ __all__ = ["OnStudyMissingLabValues"]
@@ -1,8 +1,10 @@
1
+ import contextlib
2
+
1
3
  from edc_lab_panel.constants import FBC, LFT, LIPIDS, RFT
2
4
  from edc_lab_panel.panels import fbc_panel, lft_panel, lipids_panel, rft_panel
3
5
  from edc_qareports.sql_generator import CrfCase, RequisitionCase
4
6
 
5
- qa_cases = [
7
+ qa_cases: list[RequisitionCase | CrfCase] = [
6
8
  RequisitionCase(
7
9
  label="FBC requisitioned but not entered",
8
10
  dbtable="meta_subject_bloodresultsfbc",
@@ -32,10 +34,8 @@ qa_cases = [
32
34
  panels = {FBC: fbc_panel, RFT: rft_panel, LFT: lft_panel, LIPIDS: lipids_panel}
33
35
  for abbrev, panel in panels.items():
34
36
  for utest_id in panel.utest_ids:
35
- try:
36
- utest_id, _ = utest_id
37
- except ValueError:
38
- pass
37
+ with contextlib.suppress(ValueError):
38
+ utest_id, _ = utest_id # noqa: PLW2901
39
39
  qa_cases.append(
40
40
  CrfCase(
41
41
  label=f"{abbrev.upper()}: missing {utest_id} value/units",
@@ -45,9 +45,11 @@ for abbrev, panel in panels.items():
45
45
  )
46
46
  )
47
47
 
48
- CrfCase(
49
- label="No UREA value",
50
- dbtable="meta_subject_bloodresultsrft",
51
- label_lower="meta_subject.bloodresultsrft",
52
- where="crf.urea_value is null or crf.urea_units is null",
53
- ),
48
+ (
49
+ CrfCase(
50
+ label="No UREA value",
51
+ dbtable="meta_subject_bloodresultsrft",
52
+ label_lower="meta_subject.bloodresultsrft",
53
+ where="crf.urea_value is null or crf.urea_units is null",
54
+ ),
55
+ )
@@ -9,7 +9,6 @@ from .view_definition import get_view_definition
9
9
 
10
10
 
11
11
  class OnStudyMissingLabValues(OnStudyMissingValuesModelMixin, QaReportModelMixin, DBView):
12
-
13
12
  view_definition = get_view_definition()
14
13
 
15
14
  class Meta:
@@ -1 +1,3 @@
1
1
  from .unmanged_model import OnStudyMissingValues
2
+
3
+ __all__ = ["OnStudyMissingValues"]
@@ -1,6 +1,8 @@
1
- from edc_constants.constants import OTHER, YES
1
+ from clinicedc_constants import OTHER, YES
2
2
  from edc_qareports.sql_generator import CrfCase
3
3
 
4
+ from meta_visit_schedule.constants import MONTH36, MONTH48
5
+
4
6
  qa_cases = [
5
7
  CrfCase(
6
8
  label="No HIV Diagnosis date",
@@ -51,4 +53,20 @@ qa_cases = [
51
53
  f"and ogtt_performed='{YES}'"
52
54
  ),
53
55
  ),
56
+ CrfCase(
57
+ label="Weight",
58
+ dbtable="meta_subject_followupvitals",
59
+ label_lower="meta_subject.followupvitals",
60
+ where="(crf.weight is null and v.visit_code_sequence==0)",
61
+ ),
62
+ CrfCase(
63
+ label="Waist circumference 36/48m",
64
+ dbtable="meta_subject_followupvitals",
65
+ label_lower="meta_subject.followupvitals",
66
+ where=(
67
+ f"(crf.waist_circumference_measured=='{YES}' and crf.waist_circumference "
68
+ "is null) or (crf.waist_circumference is null and v.visit_code in "
69
+ f"['{MONTH36}','{MONTH48}'] and v.visit_code_sequence==0)"
70
+ ),
71
+ ),
54
72
  ]
@@ -9,7 +9,6 @@ from .view_definition import get_view_definition
9
9
 
10
10
 
11
11
  class OnStudyMissingValues(OnStudyMissingValuesModelMixin, QaReportModelMixin, DBView):
12
-
13
12
  view_definition = get_view_definition()
14
13
 
15
14
  class Meta:
@@ -1 +1,3 @@
1
1
  from .unmanaged_model import PatientHistoryMissingBaselineCd4
2
+
3
+ __all__ = ["PatientHistoryMissingBaselineCd4"]
@@ -6,7 +6,6 @@ from .view_definition import get_view_definition
6
6
 
7
7
 
8
8
  class PatientHistoryMissingBaselineCd4(QaReportModelMixin, DBView):
9
-
10
9
  visit_code = models.CharField(max_length=25)
11
10
 
12
11
  visit_code_sequence = models.IntegerField()
@@ -1 +1,3 @@
1
1
  from .unmanaged_model import UnattendedThreeInRow
2
+
3
+ __all__ = ["UnattendedThreeInRow"]
@@ -6,7 +6,6 @@ from .view_definition import get_view_definition
6
6
 
7
7
 
8
8
  class UnattendedThreeInRow(QaReportModelMixin, DBView):
9
-
10
9
  appt_datetime = models.DateTimeField()
11
10
 
12
11
  first_value = models.CharField(verbose_name="First", max_length=25)
@@ -1 +1,3 @@
1
1
  from .unmanaged_model import UnattendedThreeInRow2
2
+
3
+ __all__ = ["UnattendedThreeInRow2"]
@@ -6,7 +6,6 @@ from .view_definition import get_view_definition
6
6
 
7
7
 
8
8
  class UnattendedThreeInRow2(QaReportModelMixin, DBView):
9
-
10
9
  first_value = models.CharField(verbose_name="First", max_length=25)
11
10
 
12
11
  second_value = models.CharField(verbose_name="Second", max_length=25)
@@ -1 +1,3 @@
1
1
  from .unmanaged_model import UnattendedTwoInRow
2
+
3
+ __all__ = ["UnattendedTwoInRow"]
@@ -6,7 +6,6 @@ from .view_definition import get_view_definition
6
6
 
7
7
 
8
8
  class UnattendedTwoInRow(QaReportModelMixin, DBView):
9
-
10
9
  appt_datetime = models.DateTimeField()
11
10
 
12
11
  first_value = models.CharField(verbose_name="First", max_length=25)
@@ -1,3 +1,4 @@
1
+ from clinicedc_constants import NULL_STRING
1
2
  from django.db import models
2
3
  from edc_qareports.model_mixins import QaReportModelMixin, qa_reports_permissions
3
4
 
@@ -9,7 +10,7 @@ class Endpoints(QaReportModelMixin, models.Model):
9
10
 
10
11
  visit_code = models.IntegerField(null=True)
11
12
 
12
- fasting = models.CharField(max_length=10, null=True)
13
+ fasting = models.CharField(max_length=10, default=NULL_STRING)
13
14
 
14
15
  fbg_date = models.DateField(null=True)
15
16
 
@@ -17,15 +18,18 @@ class Endpoints(QaReportModelMixin, models.Model):
17
18
 
18
19
  ogtt_value = models.FloatField(null=True)
19
20
 
20
- endpoint_label = models.CharField(max_length=250, null=True)
21
+ endpoint_label = models.CharField(max_length=250, default=NULL_STRING)
21
22
 
22
23
  baseline_date = models.DateField(null=True)
23
24
 
24
25
  offstudy_date = models.DateField(null=True)
25
26
 
26
- offstudy_reason = models.CharField(max_length=250, null=True)
27
+ offstudy_reason = models.CharField(max_length=250, default=NULL_STRING)
27
28
 
28
- class Meta(QaReportModelMixin.Meta):
29
+ def __str__(self):
30
+ return f"{self.subject_identifier} {self.visit_code} {self.endpoint_label}"
31
+
32
+ class Meta(QaReportModelMixin.Meta): # noqa: DJ012
29
33
  verbose_name = "Endpoints (DM)"
30
34
  verbose_name_plural = "Endpoints (DM)"
31
35
  default_permissions = qa_reports_permissions
@@ -4,7 +4,6 @@ from edc_qareports.model_mixins import QaReportModelMixin, qa_reports_permission
4
4
 
5
5
 
6
6
  class LastImpRefill(QaReportModelMixin, models.Model):
7
-
8
7
  reference_date = models.DateField(null=True)
9
8
 
10
9
  imp_visit_code = models.FloatField(null=True)
@@ -15,7 +14,7 @@ class LastImpRefill(QaReportModelMixin, models.Model):
15
14
 
16
15
  next_appt_date = models.DateField(null=True)
17
16
 
18
- visit_code = models.CharField(max_length=15, null=True)
17
+ visit_code = models.CharField(max_length=15, default="")
19
18
 
20
19
  visit_code_sequence = models.IntegerField(null=True)
21
20
 
@@ -28,7 +27,7 @@ class LastImpRefill(QaReportModelMixin, models.Model):
28
27
  def recreate_db_view(self, **kwargs):
29
28
  raise NotImplementedError()
30
29
 
31
- class Meta(QaReportModelMixin.Meta):
30
+ class Meta(QaReportModelMixin.Meta): # noqa: DJ012
32
31
  verbose_name = "Last IMP Refill"
33
32
  verbose_name_plural = "Last IMP Refills"
34
33
  default_permissions = qa_reports_permissions
@@ -20,7 +20,7 @@ def get_weight_for_timepoint(subject_identifier=None, reference_dt=None):
20
20
 
21
21
 
22
22
  class MetaCrfPdfReport(CrfPdfReport):
23
- logo_data = {
23
+ logo_data = { # noqa: RUF012
24
24
  "app_label": "meta_edc",
25
25
  "filename": "meta_logo.png",
26
26
  "first_page": (4.0 * cm, 0.83 * cm),
@@ -34,7 +34,7 @@ class MetaCrfPdfReport(CrfPdfReport):
34
34
  subject_identifier=self.subject_identifier
35
35
  ).get_drug_assignment_display()
36
36
 
37
- def draw_demographics(self, story, **kwargs):
37
+ def draw_demographics(self, story, **kwargs): # noqa: ARG002
38
38
  model_obj = getattr(self, self.model_attr)
39
39
  weight = get_weight_for_timepoint(
40
40
  subject_identifier=self.subject_identifier,
meta_reports/tasks.py CHANGED
@@ -3,10 +3,11 @@ from celery import shared_task
3
3
 
4
4
  @shared_task
5
5
  def update_endpoints_table(subject_identifiers: list[str] | None = None):
6
- from meta_analytics.dataframes import GlucoseEndpointsByDate
6
+ from meta_analytics.dataframes import GlucoseEndpointsByDate # noqa: PLC0415
7
7
 
8
8
  if len(subject_identifiers) > 5:
9
- subject_identifiers = []
10
- cls = GlucoseEndpointsByDate(subject_identifiers=subject_identifiers)
9
+ cls = GlucoseEndpointsByDate()
10
+ else:
11
+ cls = GlucoseEndpointsByDate(subject_identifiers=subject_identifiers)
11
12
  cls.run()
12
13
  return cls.to_model()
@@ -1 +1 @@
1
- <a title="{{ title }}" href="{{ url }}?q={{ subject_identifier }}">{{ label|default:subject_identifier }}</a>
1
+ <a title="{{ title }}" href="{{ url }}?q={{ subject_identifier }}">{{ label|default:subject_identifier }}</a>
@@ -9,4 +9,4 @@ Unlike other reports, this report does not automatically update, but you can upd
9
9
  <UL>
10
10
  <LI>Place a check mark next to one or more subjects and select 'Regenerate selected report data' from the Action menu.</LI>
11
11
  <li>If you select more than 5 subjects, records for ALL subjects will be refreshed.</li>
12
- </UL>
12
+ </UL>
@@ -9,4 +9,4 @@ Unlike other reports, this report does not automatically update, but you can upd
9
9
  <UL>
10
10
  <LI>Place a check mark next to one or more subjects and select 'Regenerate selected report data' from the Action menu.</LI>
11
11
  <li>If you select more than 5 subjects, records for ALL subjects will be refreshed.</li>
12
- </UL>
12
+ </UL>
@@ -0,0 +1,13 @@
1
+ {% load i18n %}
2
+ {% trans "This report fetches the most recent Study Medication report where IMP was refilled and adds the subject's next visit. Subjects taken 'Off Schedule' are not included in this report. To update ALL rows in this report, tick at least one row and select 'Update report' action below." %}
3
+ <BR><BR>
4
+ {% trans "This report has additional search features for numeric columns" %}:
5
+ <code>days_since</code>, <code>days_until</code>, <code>imp_visit_code</code> {% trans "and" %} <code>next_visit_code</code>.
6
+ <BR><BR>
7
+ {% trans "For example, type" %}
8
+ <code>days_until>=25</code>
9
+ {% trans "in the search below to show rows for subjects who have an appointment 25 or more days from the date this report was created. You might also try typing" %}
10
+ <code>days_since>365</code> or <code>days_until<0</code>.
11
+ <BR><BR>
12
+ {% trans "This also works" %}:
13
+ <code>next_visit_code>=1060</code>.
@@ -3,3 +3,11 @@ from .screening_part_three_admin import ScreeningPartThreeAdmin
3
3
  from .screening_part_two_admin import ScreeningPartTwoAdmin
4
4
  from .subject_refusal_admin import SubjectRefusalAdmin
5
5
  from .subject_screening_admin import SubjectScreeningAdmin
6
+
7
+ __all__ = [
8
+ "ScreeningPartOneAdmin",
9
+ "ScreeningPartThreeAdmin",
10
+ "ScreeningPartTwoAdmin",
11
+ "SubjectRefusalAdmin",
12
+ "SubjectScreeningAdmin",
13
+ ]