meta-edc 1.1.8__py3-none-any.whl → 1.1.12__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.

Potentially problematic release.


This version of meta-edc might be problematic. Click here for more details.

Files changed (475) hide show
  1. meta_ae/action_items.py +2 -1
  2. meta_ae/admin/__init__.py +11 -0
  3. meta_ae/admin/ae_susar_admin.py +1 -1
  4. meta_ae/admin/death_report_admin.py +1 -1
  5. meta_ae/admin/modeladmin_mixins.py +10 -12
  6. meta_ae/baker_recipes.py +3 -3
  7. meta_ae/forms/__init__.py +13 -0
  8. meta_ae/forms/modelform_mixins.py +2 -2
  9. meta_ae/migrations/0001_initial.py +27 -27
  10. meta_ae/migrations/0006_aelocalreview_aesponsorreview.py +5 -5
  11. meta_ae/migrations/0022_historicalhospitalization_hospitalization.py +5 -13
  12. meta_ae/migrations/0023_alter_aefollowup_action_identifier_and_more.py +2017 -0
  13. meta_ae/model_mixins/__init__.py +2 -0
  14. meta_ae/model_mixins/ae_review_model_mixin.py +6 -6
  15. meta_ae/model_mixins/death_report_model_mixin.py +3 -3
  16. meta_ae/models/__init__.py +13 -0
  17. meta_ae/models/hospitalization.py +3 -3
  18. meta_ae/pdf_reports/__init__.py +2 -0
  19. meta_analytics/.DS_Store +0 -0
  20. meta_analytics/dataframes/__init__.py +24 -0
  21. meta_analytics/dataframes/get_eos_df.py +1 -2
  22. meta_analytics/dataframes/get_glucose_df.py +6 -7
  23. meta_analytics/dataframes/get_glucose_fbg_df.py +2 -3
  24. meta_analytics/dataframes/get_glucose_fbg_ogtt_df.py +1 -2
  25. meta_analytics/dataframes/get_last_imp_visits_df.py +5 -6
  26. meta_analytics/dataframes/glucose_endpoints/__init__.py +2 -0
  27. meta_analytics/dataframes/glucose_endpoints/endpoint_by_date.py +13 -20
  28. meta_analytics/dataframes/glucose_endpoints/glucose_endpoints_by_date.py +9 -10
  29. meta_analytics/dataframes/screening/__init__.py +2 -0
  30. meta_analytics/dataframes/screening/get_glucose_tested_only_df.py +1 -2
  31. meta_analytics/dataframes/screening/get_screening_df.py +6 -10
  32. meta_analytics/dataframes/utils.py +3 -8
  33. meta_analytics/get_tables.py +1 -2
  34. meta_analytics/tables/__init__.py +2 -0
  35. meta_consent/action_items.py +2 -1
  36. meta_consent/admin/__init__.py +6 -0
  37. meta_consent/admin/actions/__init__.py +2 -0
  38. meta_consent/admin/actions/create_missing_prescriptions.py +1 -1
  39. meta_consent/admin/list_filters.py +2 -2
  40. meta_consent/admin/modeladmin_mixins.py +3 -4
  41. meta_consent/admin/subject_consent_v1_ext_admin.py +2 -2
  42. meta_consent/baker_recipes.py +7 -8
  43. meta_consent/form_validators/__init__.py +2 -0
  44. meta_consent/forms/__init__.py +7 -0
  45. meta_consent/forms/subject_consent_v1_ext_form.py +2 -3
  46. meta_consent/forms/subject_reconsent_form.py +4 -4
  47. meta_consent/management/commands/create_missing_prescriptions.py +4 -2
  48. meta_consent/migrations/0001_initial.py +9 -9
  49. meta_consent/migrations/0024_historicalsubjectconsentv1.py +3 -8
  50. meta_consent/migrations/0026_historicalsubjectconsentv1ext_subjectconsentv1ext.py +5 -14
  51. meta_consent/migrations/0032_alter_historicalsubjectconsent_device_created_and_more.py +678 -0
  52. meta_consent/models/__init__.py +9 -0
  53. meta_consent/models/model_mixins.py +1 -2
  54. meta_consent/models/signals.py +9 -10
  55. meta_consent/models/subject_consent.py +1 -1
  56. meta_consent/models/subject_reconsent.py +3 -3
  57. meta_dashboard/patterns.py +1 -1
  58. meta_dashboard/templatetags/meta_dashboard_extras.py +1 -1
  59. meta_dashboard/view_utils/__init__.py +7 -0
  60. meta_dashboard/view_utils/subject_screening_button.py +9 -16
  61. meta_dashboard/views/__init__.py +8 -0
  62. meta_dashboard/views/ae/__init__.py +2 -0
  63. meta_dashboard/views/ae/ae_listboard_view.py +1 -1
  64. meta_dashboard/views/ae/death_report_listboard_view.py +1 -1
  65. meta_dashboard/views/screening/__init__.py +2 -0
  66. meta_dashboard/views/subject/__init__.py +2 -0
  67. meta_dashboard/views/subject/dashboard/__init__.py +2 -0
  68. meta_dashboard/views/subject/dashboard/dashboard_view.py +1 -1
  69. meta_dashboard/views/subject/listboard/__init__.py +2 -0
  70. meta_edc/__init__.py +5 -9
  71. meta_edc/celery.py +1 -1
  72. meta_edc/celery_live.py +1 -1
  73. meta_edc/celery_uat.py +1 -1
  74. meta_edc/management/commands/update_forms_reference.py +10 -12
  75. meta_edc/settings/debug.py +5 -4
  76. meta_edc/settings/defaults.py +18 -3
  77. meta_edc/settings/live.py +3 -1
  78. meta_edc/settings/logging.py +9 -4
  79. meta_edc/settings/minimal.py +4 -5
  80. meta_edc/settings/uat.py +3 -1
  81. meta_edc/views/__init__.py +2 -0
  82. meta_edc-1.1.12.dist-info/METADATA +174 -0
  83. {meta_edc-1.1.8.dist-info → meta_edc-1.1.12.dist-info}/RECORD +413 -526
  84. meta_edc-1.1.12.dist-info/WHEEL +4 -0
  85. meta_lists/migrations/0020_alter_abnormalfootappearanceobservations_extra_value_and_more.py +404 -0
  86. meta_pharmacy/admin/__init__.py +5 -0
  87. meta_pharmacy/admin/substitutions_admin.py +2 -2
  88. meta_pharmacy/forms/__init__.py +2 -0
  89. meta_pharmacy/forms/substitutions_form.py +6 -4
  90. meta_pharmacy/labels/__init__.py +4 -2
  91. meta_pharmacy/labels/draw_label_for_subject_with_barcode.py +1 -2
  92. meta_pharmacy/labels/draw_label_with_test_data.py +2 -2
  93. meta_pharmacy/labels/label_data.py +1 -2
  94. meta_pharmacy/labels/print_sheets.py +4 -6
  95. meta_pharmacy/migrations/0002_initial.py +7 -20
  96. meta_pharmacy/migrations/0003_auto_20240909_2335.py +3 -2
  97. meta_pharmacy/migrations/0006_lotnumber_label.py +5 -14
  98. meta_pharmacy/migrations/0008_remove_lotnumber_medication_and_more.py +5 -6
  99. meta_pharmacy/migrations/0010_alter_historicallabeldata_device_created_and_more.py +382 -0
  100. meta_pharmacy/models/__init__.py +7 -0
  101. meta_pharmacy/models/label_data.py +4 -5
  102. meta_pharmacy/models/substitutions.py +3 -3
  103. meta_pharmacy/prepare_meta_pharmacy.py +1 -1
  104. meta_pharmacy/utils/__init__.py +2 -0
  105. meta_pharmacy/utils/update_initial_pharmacy_data.py +1 -1
  106. meta_prn/admin/__init__.py +16 -0
  107. meta_prn/admin/dm_referral_admin.py +2 -1
  108. meta_prn/admin/end_of_study_admin.py +6 -7
  109. meta_prn/admin/loss_to_followup_admin.py +3 -2
  110. meta_prn/admin/off_study_medication_admin.py +5 -6
  111. meta_prn/admin/offschedule_admin.py +5 -6
  112. meta_prn/admin/offschedule_dm_referral_admin.py +6 -6
  113. meta_prn/admin/offschedule_postnatal_admin.py +7 -7
  114. meta_prn/admin/offschedule_pregnancy_admin.py +8 -7
  115. meta_prn/admin/onschedule_admin.py +7 -8
  116. meta_prn/admin/onschedule_dm_referral_admin.py +6 -7
  117. meta_prn/admin/pregnancy_notification_admin.py +5 -6
  118. meta_prn/admin/protocol_incident_admin.py +1 -1
  119. meta_prn/admin/subject_transfer_admin.py +1 -1
  120. meta_prn/baker_recipes.py +4 -4
  121. meta_prn/form_validators/__init__.py +5 -0
  122. meta_prn/form_validators/end_of_study.py +2 -2
  123. meta_prn/forms/__init__.py +13 -0
  124. meta_prn/migrations/0001_initial.py +25 -25
  125. meta_prn/migrations/0017_auto_20220307_1929.py +5 -5
  126. meta_prn/migrations/0018_auto_20220309_2106.py +9 -9
  127. meta_prn/migrations/0021_auto_20220316_2147.py +13 -13
  128. meta_prn/migrations/0022_auto_20220318_0133.py +9 -9
  129. meta_prn/migrations/0032_historicalegfrnotification_egfrnotification.py +5 -13
  130. meta_prn/migrations/0038_alter_endofstudy_delivery_date_and_more.py +5 -13
  131. meta_prn/migrations/0041_endofstudy_transfer_date_and_more.py +5 -13
  132. meta_prn/migrations/0057_historicalonscheduledmreferral_and_more.py +13 -38
  133. meta_prn/migrations/0067_alter_offschedule_managers_and_more.py +2557 -0
  134. meta_prn/models/__init__.py +20 -0
  135. meta_prn/models/offschedule.py +4 -4
  136. meta_prn/models/protocol_incident.py +1 -1
  137. meta_prn/models/subject_transfer.py +8 -0
  138. meta_rando/migrations/0001_initial.py +5 -5
  139. meta_rando/migrations/0006_alter_historicalrandomizationlist_allocated_user_and_more.py +130 -0
  140. meta_reports/__init__.py +2 -0
  141. meta_reports/admin/__init__.py +16 -0
  142. meta_reports/admin/dbviews/__init__.py +13 -0
  143. meta_reports/admin/dbviews/glucose_summary_admin.py +6 -6
  144. meta_reports/admin/dbviews/imp_substitutions_admin.py +12 -11
  145. meta_reports/admin/dbviews/missing_screening_ogtt_admin/__init__.py +5 -0
  146. meta_reports/admin/dbviews/missing_screening_ogtt_admin/note_model_admin.py +27 -3
  147. meta_reports/admin/dbviews/missing_screening_ogtt_admin/unmanaged_model_admin.py +6 -6
  148. meta_reports/admin/dbviews/on_study_missing_lab_values_admin/__init__.py +2 -0
  149. meta_reports/admin/dbviews/on_study_missing_lab_values_admin/unmanaged_model_admin.py +0 -3
  150. meta_reports/admin/dbviews/on_study_missing_values_admin/__init__.py +2 -0
  151. meta_reports/admin/dbviews/patient_history_missing_baseline_cd4_admin.py +8 -8
  152. meta_reports/admin/dbviews/unattended_three_in_row2_admin.py +6 -6
  153. meta_reports/admin/dbviews/unattended_three_in_row_admin.py +5 -5
  154. meta_reports/admin/dbviews/unattended_two_in_row_admin.py +5 -5
  155. meta_reports/admin/endpoints_admin.py +1 -1
  156. meta_reports/admin/last_imp_refill_admin.py +9 -9
  157. meta_reports/admin/list_filters.py +2 -2
  158. meta_reports/admin/modeladmin_mixins.py +9 -16
  159. meta_reports/death_report.py +1 -1
  160. meta_reports/forms/__init__.py +2 -0
  161. meta_reports/forms/missing_ogtt_note_form.py +2 -3
  162. meta_reports/management/commands/generate_endpoints.py +5 -4
  163. meta_reports/migrations/0035_historicalmissingogttnote_missingogttnote.py +5 -14
  164. meta_reports/migrations/0059_alter_endpoints_created_and_more.py +161 -0
  165. meta_reports/models/__init__.py +17 -0
  166. meta_reports/models/dbviews/__init__.py +14 -0
  167. meta_reports/models/dbviews/glucose_summary/__init__.py +2 -0
  168. meta_reports/models/dbviews/glucose_summary/unmanaged_model.py +4 -5
  169. meta_reports/models/dbviews/imp_substitutions/__init__.py +2 -0
  170. meta_reports/models/dbviews/imp_substitutions/view_definition.py +1 -1
  171. meta_reports/models/dbviews/missing_screening_ogtt/__init__.py +2 -0
  172. meta_reports/models/dbviews/missing_screening_ogtt/note_model.py +1 -1
  173. meta_reports/models/dbviews/missing_screening_ogtt/unmanaged_model.py +4 -3
  174. meta_reports/models/dbviews/on_study_missing_lab_values/__init__.py +2 -0
  175. meta_reports/models/dbviews/on_study_missing_lab_values/qa_cases.py +13 -11
  176. meta_reports/models/dbviews/on_study_missing_values/__init__.py +2 -0
  177. meta_reports/models/dbviews/on_study_missing_values/qa_cases.py +18 -0
  178. meta_reports/models/dbviews/patient_history_missing_baseline_cd4/__init__.py +2 -0
  179. meta_reports/models/dbviews/unattended_three_in_row/__init__.py +2 -0
  180. meta_reports/models/dbviews/unattended_three_in_row2/__init__.py +2 -0
  181. meta_reports/models/dbviews/unattended_two_in_row/__init__.py +2 -0
  182. meta_reports/models/endpoints.py +4 -4
  183. meta_reports/models/last_imp_refill.py +2 -3
  184. meta_reports/pdf_report.py +2 -2
  185. meta_reports/tasks.py +1 -1
  186. meta_screening/admin/__init__.py +8 -0
  187. meta_screening/admin/fieldsets.py +13 -14
  188. meta_screening/admin/list_filters.py +6 -4
  189. meta_screening/admin/screening_part_one_admin.py +1 -2
  190. meta_screening/admin/screening_part_three_admin.py +2 -3
  191. meta_screening/admin/screening_part_two_admin.py +7 -10
  192. meta_screening/admin/subject_refusal_admin.py +5 -3
  193. meta_screening/admin/subject_screening_admin.py +4 -4
  194. meta_screening/baker_recipes.py +9 -9
  195. meta_screening/eligibility/__init__.py +9 -0
  196. meta_screening/eligibility/eligibility.py +7 -7
  197. meta_screening/eligibility/eligibility_part_three/__init__.py +2 -0
  198. meta_screening/eligibility/eligibility_part_three/base_eligibility_part_three.py +8 -8
  199. meta_screening/eligibility/eligibility_part_three/eligibility_part_three_phase_three.py +13 -14
  200. meta_screening/form_validators/__init__.py +8 -0
  201. meta_screening/forms/__init__.py +20 -0
  202. meta_screening/forms/field_lists.py +16 -17
  203. meta_screening/forms/screening_part_one_form.py +2 -2
  204. meta_screening/forms/screening_part_three_form.py +5 -3
  205. meta_screening/forms/screening_part_two_form.py +1 -5
  206. meta_screening/forms/subject_refusal_form.py +0 -4
  207. meta_screening/forms/subject_screening_form.py +0 -4
  208. meta_screening/migrations/0001_initial.py +15 -15
  209. meta_screening/migrations/0010_auto_20191106_0828.py +5 -5
  210. meta_screening/migrations/0068_alter_historicalscreeningpartone_acute_condition_and_more.py +1579 -0
  211. meta_screening/model_mixins/__init__.py +8 -0
  212. meta_screening/model_mixins/eligibility_model_mixin.py +5 -3
  213. meta_screening/model_mixins/part_one_fields_model_mixin.py +5 -9
  214. meta_screening/model_mixins/part_three_fields_model_mixin.py +5 -6
  215. meta_screening/model_mixins/part_two_fields_model_mixin.py +18 -16
  216. meta_screening/models/__init__.py +9 -0
  217. meta_screening/models/icp_referral.py +5 -5
  218. meta_screening/models/signals.py +10 -11
  219. meta_screening/models/subject_refusal.py +1 -1
  220. meta_screening/models/subject_screening.py +1 -3
  221. meta_subject/action_items.py +13 -15
  222. meta_subject/admin/__init__.py +39 -0
  223. meta_subject/admin/birth_outcome_admin.py +4 -8
  224. meta_subject/admin/blood_results/__init__.py +9 -0
  225. meta_subject/admin/blood_results/blood_results_fbc_admin.py +1 -1
  226. meta_subject/admin/blood_results/blood_results_hba1c_admin.py +1 -1
  227. meta_subject/admin/blood_results/blood_results_ins_admin.py +1 -1
  228. meta_subject/admin/blood_results/blood_results_lft_admin.py +1 -1
  229. meta_subject/admin/blood_results/blood_results_lipids_admin.py +1 -1
  230. meta_subject/admin/blood_results/blood_results_rft_admin.py +3 -5
  231. meta_subject/admin/complications_glycemia_admin.py +1 -1
  232. meta_subject/admin/delivery_admin.py +7 -10
  233. meta_subject/admin/diabetes/__init__.py +2 -0
  234. meta_subject/admin/diabetes/dm_endpoint_admin.py +2 -2
  235. meta_subject/admin/diabetes/dm_followup_admin.py +3 -2
  236. meta_subject/admin/egfr_drop_notification_admin.py +1 -1
  237. meta_subject/admin/followup_examination_admin.py +10 -9
  238. meta_subject/admin/followup_vitals_admin.py +4 -5
  239. meta_subject/admin/glucose_admin.py +2 -4
  240. meta_subject/admin/glucose_fbg_admin.py +1 -3
  241. meta_subject/admin/health_economics/__init__.py +2 -0
  242. meta_subject/admin/health_economics/health_economics_simple_admin.py +1 -1
  243. meta_subject/admin/health_economics/health_economics_update_admin.py +1 -1
  244. meta_subject/admin/hepatitis_test_admin.py +1 -1
  245. meta_subject/admin/list_filters.py +1 -1
  246. meta_subject/admin/mnsi_admin.py +7 -5
  247. meta_subject/admin/other_arv_regimens_admin.py +3 -3
  248. meta_subject/admin/patient_history_admin.py +4 -4
  249. meta_subject/admin/physical_exam_admin.py +1 -1
  250. meta_subject/admin/pregnancy_update_admin.py +1 -1
  251. meta_subject/admin/study_medication_admin.py +8 -15
  252. meta_subject/admin/subject_requisition_admin.py +1 -1
  253. meta_subject/admin/subject_visit_admin.py +1 -1
  254. meta_subject/admin/subject_visit_missed_admin.py +1 -1
  255. meta_subject/admin/urine_dipstick_test_admin.py +1 -1
  256. meta_subject/admin/urine_pregnancy_admin.py +1 -1
  257. meta_subject/baker_recipes.py +15 -15
  258. meta_subject/form_validators/__init__.py +11 -0
  259. meta_subject/form_validators/delivery_form_validator.py +2 -3
  260. meta_subject/form_validators/dm_endpoint_form_validator.py +1 -1
  261. meta_subject/form_validators/dm_followup_form_validator.py +7 -6
  262. meta_subject/form_validators/glucose_form_validator.py +3 -5
  263. meta_subject/forms/__init__.py +41 -0
  264. meta_subject/forms/blood_results/__init__.py +9 -0
  265. meta_subject/forms/blood_results/blood_results_rft_form.py +1 -2
  266. meta_subject/forms/diabetes/__init__.py +2 -0
  267. meta_subject/forms/diabetes/dm_followup_form.py +2 -2
  268. meta_subject/forms/followup_vitals_form.py +3 -8
  269. meta_subject/forms/health_economics/__init__.py +2 -0
  270. meta_subject/forms/next_appointment_form.py +2 -3
  271. meta_subject/forms/slider_widget.py +1 -1
  272. meta_subject/forms/study_medication_form.py +11 -8
  273. meta_subject/management/commands/create_missing_refills.py +3 -3
  274. meta_subject/management/commands/create_missing_rx.py +1 -1
  275. meta_subject/management/commands/missed.py +20 -23
  276. meta_subject/metadata_rules/__init__.py +2 -0
  277. meta_subject/metadata_rules/predicates.py +25 -32
  278. meta_subject/migrations/0001_initial.py +61 -61
  279. meta_subject/migrations/0002_auto_20191021_0353.py +5 -5
  280. meta_subject/migrations/0012_auto_20200118_2334.py +5 -5
  281. meta_subject/migrations/0014_auto_20200120_1622.py +5 -5
  282. meta_subject/migrations/0018_coronakap_historicalcoronakap.py +5 -5
  283. meta_subject/migrations/0033_auto_20200516_2356.py +5 -5
  284. meta_subject/migrations/0038_auto_20200520_0020.py +5 -5
  285. meta_subject/migrations/0040_auto_20200527_2155.py +1 -1
  286. meta_subject/migrations/0045_auto_20200530_1801.py +1 -1
  287. meta_subject/migrations/0051_auto_20200617_2117.py +5 -5
  288. meta_subject/migrations/0063_auto_20210715_0337.py +5 -5
  289. meta_subject/migrations/0066_auto_20210721_0335.py +9 -9
  290. meta_subject/migrations/0067_auto_20210726_0340.py +5 -5
  291. meta_subject/migrations/0068_auto_20210728_1809.py +5 -5
  292. meta_subject/migrations/0072_auto_20210805_1545.py +7 -7
  293. meta_subject/migrations/0073_auto_20210809_0055.py +5 -5
  294. meta_subject/migrations/0077_auto_20210809_2323.py +3 -3
  295. meta_subject/migrations/0082_auto_20210823_1612.py +3 -3
  296. meta_subject/migrations/0083_auto_20210823_1620.py +3 -3
  297. meta_subject/migrations/0088_auto_20210924_0027.py +5 -5
  298. meta_subject/migrations/0090_auto_20210924_0424.py +5 -5
  299. meta_subject/migrations/0093_auto_20211117_0352.py +5 -5
  300. meta_subject/migrations/0095_auto_20220128_1719.py +5 -5
  301. meta_subject/migrations/0098_auto_20220309_2106.py +5 -5
  302. meta_subject/migrations/0101_auto_20220316_2147.py +13 -13
  303. meta_subject/migrations/0115_historicalegfrnotification_egfrnotification.py +5 -13
  304. meta_subject/migrations/0164_dmreferralfollowup_historicaldmreferralfollowup.py +5 -5
  305. meta_subject/migrations/0172_remove_historicalbloodresultsglu_action_item_and_more.py +1 -2
  306. meta_subject/migrations/0177_alter_bloodresultslft_alp_value_and_more.py +1 -2
  307. meta_subject/migrations/0178_historicalhealtheconomicsupdate_and_more.py +5 -14
  308. meta_subject/migrations/0186_healtheconomicsupdate_singleton_field_and_more.py +1 -2
  309. meta_subject/migrations/0187_dmdiagnosis_historicaldmdiagnosis_dmdxresult_and_more.py +5 -14
  310. meta_subject/migrations/0188_historicaldmdxresult_dmdxresult.py +5 -14
  311. meta_subject/migrations/0209_remove_historicaldmdxresult_dm_diagnosis_and_more.py +1 -2
  312. meta_subject/migrations/0216_historicalnextappointment_nextappointment.py +5 -6
  313. meta_subject/migrations/0220_historicalbloodresultsgludummy_bloodresultsgludummy.py +5 -14
  314. meta_subject/migrations/0227_alter_followupvitals_waist_circumference_comment_and_more.py +97 -0
  315. meta_subject/migrations/0228_bloodresultshba1c_hba1c_datetime_and_more.py +9297 -0
  316. meta_subject/model_mixins/__init__.py +8 -0
  317. meta_subject/model_mixins/search_slug_model_mixin.py +1 -2
  318. meta_subject/model_mixins/vitals_fields_model_mixin.py +1 -1
  319. meta_subject/models/__init__.py +48 -0
  320. meta_subject/models/birth_outcomes.py +3 -3
  321. meta_subject/models/blood_results/__init__.py +11 -0
  322. meta_subject/models/delivery.py +3 -3
  323. meta_subject/models/diabetes/__init__.py +2 -0
  324. meta_subject/models/diabetes/dm_endpoint.py +4 -4
  325. meta_subject/models/diabetes/dm_followup.py +3 -4
  326. meta_subject/models/diet_and_lifestyle.py +2 -2
  327. meta_subject/models/followup_examination.py +11 -11
  328. meta_subject/models/glucose.py +4 -4
  329. meta_subject/models/glucose_fbg.py +2 -3
  330. meta_subject/models/health_economics/__init__.py +2 -0
  331. meta_subject/models/health_economics/health_economics.py +7 -7
  332. meta_subject/models/health_economics/health_economics_update.py +2 -1
  333. meta_subject/models/hepatitis_test.py +2 -2
  334. meta_subject/models/other_arv_regimens_detail.py +1 -1
  335. meta_subject/models/patient_history.py +5 -6
  336. meta_subject/models/physical_exam.py +2 -2
  337. meta_subject/models/pregnancy_update.py +1 -1
  338. meta_subject/models/signals.py +14 -12
  339. meta_subject/models/subject_visit.py +1 -1
  340. meta_subject/models/urine_dipstick_test.py +1 -1
  341. meta_subject/models/urine_pregnancy.py +1 -1
  342. meta_visit_schedule/visit_schedules/__init__.py +2 -0
  343. meta_visit_schedule/visit_schedules/phase_three/__init__.py +2 -0
  344. meta_visit_schedule/visit_schedules/phase_three/schedule.py +2 -2
  345. meta_visit_schedule/visit_schedules/phase_three/schedule_dm_referral.py +1 -2
  346. meta_visit_schedule/visit_schedules/phase_three/schedule_pregnancy.py +1 -2
  347. meta_ae/tests/holidays.csv +0 -15
  348. meta_ae/tests/tests/test_actions.py +0 -126
  349. meta_ae/tests/urls.py +0 -10
  350. meta_analytics/dataframes/glucose_endpoints/utils.py +0 -0
  351. meta_analytics/notebooks/anu.ipynb +0 -95
  352. meta_analytics/notebooks/appointment_planning.ipynb +0 -329
  353. meta_analytics/notebooks/arvs.ipynb +0 -103
  354. meta_analytics/notebooks/cleaning/__init__.py +0 -0
  355. meta_analytics/notebooks/cleaning/consent_v1_ext.ipynb +0 -227
  356. meta_analytics/notebooks/cleaning/offschedule_eos.ipynb +0 -353
  357. meta_analytics/notebooks/dsmc/renal_dysfunction.ipynb +0 -435
  358. meta_analytics/notebooks/endpoints/meta_endpoints_by_date.ipynb +0 -656
  359. meta_analytics/notebooks/followup_examination.ipynb +0 -141
  360. meta_analytics/notebooks/hba1c.ipynb +0 -136
  361. meta_analytics/notebooks/hiv_regimens.ipynb +0 -429
  362. meta_analytics/notebooks/incidence.ipynb +0 -232
  363. meta_analytics/notebooks/liver.ipynb +0 -389
  364. meta_analytics/notebooks/magreth.ipynb +0 -645
  365. meta_analytics/notebooks/monitoring_report.ipynb +0 -1834
  366. meta_analytics/notebooks/pharmacy.ipynb +0 -1061
  367. meta_analytics/notebooks/pharmacy_stock_202410.ipynb +0 -306
  368. meta_analytics/notebooks/qa.ipynb +0 -273
  369. meta_analytics/notebooks/steering.ipynb +0 -61
  370. meta_analytics/notebooks/undiagnosed/meta3_screening_consort_chart.ipynb +0 -1176
  371. meta_analytics/notebooks/undiagnosed/meta3_screening_undiagnosed.ipynb +0 -519
  372. meta_analytics/notebooks/undiagnosed/meta_screening_table2.ipynb +0 -964
  373. meta_analytics/notebooks/undiagnosed/screen_undiagnosed_or.ipynb +0 -296
  374. meta_analytics/notebooks/undiagnosed/screening.ipynb +0 -273
  375. meta_analytics/notebooks/undiagnosed/screening2.ipynb +0 -958
  376. meta_analytics/notebooks/undiagnosed/screening_undiagnosed_20241002.ipynb +0 -958
  377. meta_analytics/notebooks/ven.ipynb +0 -191
  378. meta_analytics/notebooks/vitals.ipynb +0 -263
  379. meta_analytics/tests/__init__.py +0 -0
  380. meta_analytics/tests/test_endpoints_by_date.py +0 -94
  381. meta_consent/tests/__init__.py +0 -0
  382. meta_consent/tests/holidays.csv +0 -15
  383. meta_consent/tests/tests/__init__.py +0 -0
  384. meta_consent/tests/tests/test_form_validators.py +0 -110
  385. meta_consent/tests/tests/test_subject_consent.py +0 -10
  386. meta_consent/tests/urls.py +0 -17
  387. meta_dashboard/tests/__init__.py +0 -0
  388. meta_dashboard/tests/admin.py +0 -22
  389. meta_dashboard/tests/holidays.csv +0 -15
  390. meta_dashboard/tests/tests/__init__.py +0 -0
  391. meta_dashboard/tests/urls.py +0 -55
  392. meta_edc/tests/__init__.py +0 -0
  393. meta_edc/tests/tests/__init__.py +0 -0
  394. meta_edc/tests/tests/test_endpoints.py +0 -555
  395. meta_edc-1.1.8.dist-info/METADATA +0 -767
  396. meta_edc-1.1.8.dist-info/WHEEL +0 -5
  397. meta_edc-1.1.8.dist-info/licenses/AUTHORS.rst +0 -8
  398. meta_edc-1.1.8.dist-info/top_level.txt +0 -20
  399. meta_labs/tests/__init__.py +0 -0
  400. meta_labs/tests/test_labs.py +0 -27
  401. meta_labs/tests/test_reportables.py +0 -70
  402. meta_labs/tests/urls.py +0 -4
  403. meta_lists/tests/__init__.py +0 -0
  404. meta_lists/tests/test_lists.py +0 -8
  405. meta_pharmacy/notebooks/pharmacy.ipynb +0 -41
  406. meta_prn/tests/__init__.py +0 -0
  407. meta_prn/tests/tests/__init__.py +0 -0
  408. meta_prn/tests/tests/test_actions.py +0 -97
  409. meta_prn/tests/tests/test_dm_referral.py +0 -203
  410. meta_prn/tests/tests/test_eos_events.py +0 -134
  411. meta_prn/tests/tests/test_manager_order.py +0 -14
  412. meta_prn/tests/tests/test_pregnancy_notification.py +0 -93
  413. meta_prn/tests/urls.py +0 -10
  414. meta_rando/tests/__init__.py +0 -0
  415. meta_rando/tests/tests/__init__.py +0 -0
  416. meta_rando/tests/tests/test_randomizers.py +0 -57
  417. meta_reports/tests/__init__.py +0 -0
  418. meta_reports/tests/test_reports.py +0 -35
  419. meta_reports/tests/test_sql_gen.py +0 -5
  420. meta_reports/tests/urls.py +0 -4
  421. meta_screening/offline_models.py +0 -3
  422. meta_screening/tests/__init__.py +0 -0
  423. meta_screening/tests/holidays.csv +0 -15
  424. meta_screening/tests/meta_test_case_mixin.py +0 -234
  425. meta_screening/tests/options.py +0 -127
  426. meta_screening/tests/tests/__init__.py +0 -0
  427. meta_screening/tests/tests/test_forms.py +0 -404
  428. meta_screening/tests/tests/test_screening_part_one.py +0 -108
  429. meta_screening/tests/tests/test_screening_part_three.py +0 -433
  430. meta_screening/tests/tests/test_screening_part_two.py +0 -84
  431. meta_sites/tests/__init__.py +0 -0
  432. meta_sites/tests/test_sites.py +0 -12
  433. meta_sites/tests/urls.py +0 -4
  434. meta_stats/__init__.py +0 -0
  435. meta_stats/incidence.py +0 -16
  436. meta_stats/models.py +0 -0
  437. meta_stats/tests/__init__.py +0 -0
  438. meta_stats/tests/tests/__init__.py +0 -0
  439. meta_stats/tests/tests/test_incidence.py +0 -10
  440. meta_subject/tests/__init__.py +0 -0
  441. meta_subject/tests/holidays.csv +0 -15
  442. meta_subject/tests/tests/__init__.py +0 -0
  443. meta_subject/tests/tests/test_egfr.py +0 -234
  444. meta_subject/tests/tests/test_fixes.py +0 -64
  445. meta_subject/tests/tests/test_followup.py +0 -52
  446. meta_subject/tests/tests/test_manager_order.py +0 -11
  447. meta_subject/tests/tests/test_medication_adherence.py +0 -79
  448. meta_subject/tests/tests/test_metadata_rules.py +0 -135
  449. meta_subject/tests/tests/test_mnsi.py +0 -341
  450. meta_subject/tests/tests/test_next_appointment.py +0 -231
  451. meta_subject/tests/tests/test_patient_history_form.py +0 -74
  452. meta_subject/tests/tests/test_physical_exam.py +0 -84
  453. meta_subject/tests/tests/test_sf12.py +0 -161
  454. meta_subject/tests/tests/test_study_medication.py +0 -229
  455. meta_subject/tests/urls.py +0 -24
  456. meta_visit_schedule/tests/__init__.py +0 -0
  457. meta_visit_schedule/tests/tests/__init__.py +0 -0
  458. meta_visit_schedule/tests/tests/test_schedule.py +0 -181
  459. meta_visit_schedule/tests/urls.py +0 -4
  460. tests/__init__.py +0 -0
  461. tests/etc/randomization_list.csv +0 -241
  462. tests/etc/randomization_list_phase_three.csv +0 -241
  463. tests/etc/user-aes-local.key +0 -0
  464. tests/etc/user-aes-restricted.key +0 -1
  465. tests/etc/user-rsa-local-private.pem +0 -27
  466. tests/etc/user-rsa-local-public.pem +0 -9
  467. tests/etc/user-rsa-restricted-private.pem +0 -27
  468. tests/etc/user-rsa-restricted-public.pem +0 -9
  469. tests/etc/user-salt-local.key +0 -0
  470. tests/etc/user-salt-restricted.key +0 -0
  471. tests/holidays.csv +0 -15
  472. tests/test_settings.py +0 -185
  473. {meta_edc-1.1.8.dist-info → meta_edc-1.1.12.dist-info}/licenses/LICENSE +0 -0
  474. /meta_ae/tests/__init__.py → /meta_subject/management/__init__py.py +0 -0
  475. /meta_ae/tests/tests/__init__.py → /meta_subject/management/commands/__init__py.py +0 -0
@@ -1,433 +0,0 @@
1
- from copy import deepcopy
2
- from decimal import Decimal
3
-
4
- from dateutil.relativedelta import relativedelta
5
- from django.test import TestCase
6
- from edc_constants.constants import FEMALE, NO, NOT_APPLICABLE, POS, TBD, YES
7
- from edc_reportable import MICROMOLES_PER_LITER, MILLIMOLES_PER_LITER
8
- from edc_reportable.utils import convert_units
9
- from edc_utils.date import get_utcnow
10
-
11
- from meta_screening.constants import (
12
- EGFR_LT_45,
13
- EGFR_NOT_CALCULATED,
14
- FBG_OGTT,
15
- FBG_OGTT_INCOMPLETE,
16
- NORMAL_FBG_OGTT,
17
- )
18
- from meta_screening.models import ScreeningPartOne, ScreeningPartThree, ScreeningPartTwo
19
-
20
- from ..options import (
21
- get_part_one_eligible_options,
22
- get_part_three_eligible_options,
23
- get_part_two_eligible_options,
24
- )
25
-
26
-
27
- class TestScreeningPartThree(TestCase):
28
- def setUp(self):
29
- """Complete parts one and two first ..."""
30
- part_one_eligible_options = deepcopy(get_part_one_eligible_options())
31
- part_two_eligible_options = deepcopy(get_part_two_eligible_options())
32
- obj = ScreeningPartOne(**part_one_eligible_options)
33
- obj.save()
34
- obj.refresh_from_db()
35
- self.screening_identifier = obj.screening_identifier
36
-
37
- obj = ScreeningPartTwo.objects.get(screening_identifier=self.screening_identifier)
38
- for k, v in part_two_eligible_options.items():
39
- getattr(obj, k)
40
- setattr(obj, k, v)
41
- obj.save()
42
- obj.refresh_from_db()
43
-
44
- # assert eligible for part one criteria
45
- self.assertEqual(obj.eligible_part_one, YES)
46
- self.assertIsNone(obj.reasons_ineligible_part_one)
47
-
48
- # assert eligible for part two criteria
49
- self.assertEqual(obj.eligible_part_two, YES)
50
- self.assertIsNone(obj.reasons_ineligible_part_two)
51
-
52
- # assert eligiblility to be determined for part three
53
- self.assertEqual(obj.eligible_part_three, TBD)
54
- self.assertIsNotNone(obj.reasons_ineligible_part_three)
55
-
56
- self.assertFalse(obj.eligible)
57
- self.assertFalse(obj.consented)
58
-
59
- def get_screening_part_three_obj(self):
60
- """Returns an SubjectScreening obj.
61
-
62
- Remember this is just a proxy model for SubjectScreening.
63
- """
64
- return ScreeningPartThree.objects.get(
65
- screening_identifier=self.screening_identifier,
66
- )
67
-
68
- def test_eligible_part_three_defaults_phase_three(self):
69
- part_three_eligible_options = deepcopy(get_part_three_eligible_options())
70
- part_three_eligible_options["fbg_value"] = 6.9
71
- part_three_eligible_options["ogtt_value"] = 7.8
72
- self._test_eligible(part_three_eligible_options)
73
-
74
- def _test_eligible(self, part_three_eligible_options):
75
- obj = self.get_screening_part_three_obj()
76
- for k, v in part_three_eligible_options.items():
77
- setattr(obj, k, v)
78
- obj.save()
79
- self.assertIsNone(obj.reasons_ineligible_part_three)
80
- self.assertEqual(obj.eligible_part_three, YES)
81
-
82
- def test_eligible_datetime_does_not_change_on_resave(self):
83
- obj = self.get_screening_part_three_obj()
84
- part_three_eligible_options = deepcopy(get_part_three_eligible_options())
85
- for k, v in part_three_eligible_options.items():
86
- setattr(obj, k, v)
87
- obj.save()
88
- obj.refresh_from_db()
89
- eligibility_datetime = obj.eligibility_datetime
90
- obj.save()
91
- obj.refresh_from_db()
92
- self.assertEqual(eligibility_datetime, obj.eligibility_datetime)
93
-
94
- def test_eligible2_phase_three(self):
95
- obj = self.get_screening_part_three_obj()
96
- part_three_eligible_options = deepcopy(get_part_three_eligible_options())
97
- for k, v in part_three_eligible_options.items():
98
- setattr(obj, k, v)
99
- obj.save()
100
- obj.refresh_from_db()
101
-
102
- self.assertEqual(obj.converted_ogtt_value, obj.ogtt_value)
103
-
104
- self.assertIsNone(obj.reasons_ineligible_part_three)
105
- self.assertEqual(obj.eligible_part_three, YES)
106
- obj.severe_htn = YES
107
- obj.save()
108
- obj.refresh_from_db()
109
- self.assertIn("Severe HTN", obj.reasons_ineligible_part_three)
110
- self.assertEqual(obj.eligible_part_three, NO)
111
- obj.severe_htn = NO
112
- obj.save()
113
- obj.refresh_from_db()
114
- self.assertIsNone(obj.reasons_ineligible_part_three)
115
- self.assertEqual(obj.eligible_part_three, YES)
116
-
117
- def test_eligible2_phase_three_missing_ogtt(self):
118
- obj = self.get_screening_part_three_obj()
119
- part_three_eligible_options = deepcopy(get_part_three_eligible_options())
120
- for k, v in part_three_eligible_options.items():
121
- setattr(obj, k, v)
122
- obj.ogtt_base_datetime = None
123
- obj.ogtt_datetime = None
124
- obj.ogtt_units = None
125
- obj.ogtt_value = None
126
- obj.save()
127
- obj.refresh_from_db()
128
- self._test_eligible2(obj, FBG_OGTT_INCOMPLETE, FBG_OGTT)
129
-
130
- def test_eligible2_phase_three_ogtt2_not_performed_is_ok(self):
131
- obj = self.get_screening_part_three_obj()
132
- part_three_eligible_options = deepcopy(get_part_three_eligible_options())
133
- for k, v in part_three_eligible_options.items():
134
- setattr(obj, k, v)
135
- obj.save()
136
- obj.refresh_from_db()
137
- obj.save()
138
- obj.refresh_from_db()
139
-
140
- self.assertEqual(obj.eligible_part_three, YES)
141
-
142
- def test_eligible2_phase_three_repeat_ogtt2_updates_converted(self):
143
- obj = self.get_screening_part_three_obj()
144
- part_three_eligible_options = deepcopy(get_part_three_eligible_options())
145
- for k, v in part_three_eligible_options.items():
146
- setattr(obj, k, v)
147
- obj.save()
148
- obj.refresh_from_db()
149
-
150
- obj.repeat_glucose_opinion = YES
151
- obj.ogtt2_base_datetime = obj.ogtt_base_datetime + relativedelta(days=3)
152
- obj.ogtt2_datetime = obj.ogtt_datetime + relativedelta(days=3)
153
- obj.ogtt2_units = obj.ogtt_units
154
- obj.ogtt2_value = 6.9
155
- obj.save()
156
- obj.refresh_from_db()
157
-
158
- self.assertEqual(obj.converted_ogtt_value, obj.ogtt_value)
159
- self.assertEqual(obj.converted_ogtt2_value, obj.ogtt2_value)
160
-
161
- def test_eligible2_phase_three_by_repeat_ogtt(self):
162
- obj = self.get_screening_part_three_obj()
163
- part_three_eligible_options = deepcopy(get_part_three_eligible_options())
164
-
165
- for k, v in part_three_eligible_options.items():
166
- setattr(obj, k, v)
167
- obj.save()
168
- obj.refresh_from_db()
169
-
170
- # eligible by single OGTT
171
- self.assertIsNone(obj.reasons_ineligible_part_three)
172
- self.assertEqual(obj.eligible_part_three, YES)
173
-
174
- # repeat OGTT, result in range
175
- # cannot just repeat OGTT2
176
- obj.repeat_glucose_opinion = YES
177
- obj.ogtt2_base_datetime = obj.ogtt_base_datetime + relativedelta(days=3)
178
- obj.ogtt2_datetime = obj.ogtt_datetime + relativedelta(days=3)
179
- obj.ogtt2_units = obj.ogtt_units
180
- obj.ogtt2_value = Decimal("8.1000")
181
- obj.save()
182
- obj.refresh_from_db()
183
-
184
- self.assertEqual(obj.converted_ogtt_value, obj.ogtt_value)
185
- self.assertEqual(obj.converted_ogtt2_value, obj.ogtt2_value)
186
- self.assertIsNotNone(obj.reasons_ineligible_part_three)
187
- self.assertEqual(obj.eligible_part_three, TBD)
188
-
189
- # also repeat the FBG
190
- obj.fbg2_datetime = obj.ogtt_datetime + relativedelta(days=3)
191
- obj.fbg2_units = obj.fbg_units
192
- obj.fbg2_value = Decimal("6.1000")
193
- obj.save()
194
- obj.refresh_from_db()
195
-
196
- self.assertEqual(obj.converted_ogtt_value, obj.ogtt_value)
197
- self.assertEqual(obj.converted_ogtt2_value, obj.ogtt2_value)
198
- self.assertIsNone(obj.reasons_ineligible_part_three)
199
- self.assertEqual(obj.eligible_part_three, YES)
200
-
201
- # repeat OGTT, result too low
202
- obj.ogtt2_value = Decimal("5.5000")
203
- obj.save()
204
- obj.refresh_from_db()
205
-
206
- self.assertEqual(obj.converted_ogtt_value, obj.ogtt_value)
207
- self.assertEqual(obj.converted_ogtt2_value, obj.ogtt2_value)
208
- # still eligible because the FBG qualifies
209
- self.assertEqual(obj.eligible_part_three, YES)
210
- self.assertIsNone(obj.reasons_ineligible_part_three)
211
-
212
- # repeat FBG, result too low
213
- obj.fbg2_value = Decimal("5.5000")
214
- obj.save()
215
- obj.refresh_from_db()
216
-
217
- self.assertEqual(obj.converted_fbg_value, obj.fbg_value)
218
- self.assertEqual(obj.converted_fbg2_value, obj.fbg2_value)
219
- self.assertEqual(obj.converted_ogtt_value, obj.ogtt_value)
220
- self.assertEqual(obj.converted_ogtt2_value, obj.ogtt2_value)
221
- # not eligible because the FBG2 and OGTT2 do not qualify
222
- self.assertEqual(obj.eligible_part_three, NO)
223
- self.assertIsNotNone(obj.reasons_ineligible_part_three)
224
- self.assertIn(NORMAL_FBG_OGTT, obj.reasons_ineligible_part_three)
225
-
226
- obj.ogtt2_value = Decimal("7.9000")
227
- obj.save()
228
- obj.refresh_from_db()
229
-
230
- self.assertEqual(obj.converted_fbg_value, obj.fbg_value)
231
- self.assertEqual(obj.converted_fbg2_value, obj.fbg2_value)
232
- self.assertEqual(obj.converted_ogtt_value, obj.ogtt_value)
233
- self.assertEqual(obj.converted_ogtt2_value, obj.ogtt2_value)
234
- self.assertEqual(obj.eligible_part_three, YES)
235
- self.assertIsNone(obj.reasons_ineligible_part_three)
236
-
237
- def _test_eligible2(self, obj, incomplete_reason: str, ineligible_reason: str):
238
- self.assertIsNone(obj.reasons_ineligible_part_one)
239
- self.assertEqual(obj.eligible_part_one, YES)
240
- self.assertIsNone(obj.reasons_ineligible_part_two)
241
- self.assertEqual(obj.eligible_part_two, YES)
242
-
243
- self.assertEqual(obj.reasons_ineligible_part_three, incomplete_reason)
244
- self.assertEqual(obj.eligible_part_three, TBD)
245
- self.assertFalse(obj.eligible)
246
- self.assertFalse(obj.consented)
247
-
248
- obj.hba1c_performed = YES
249
- obj.hba1c_value = 7.0
250
- obj.creatinine_performed = NO
251
- obj.save()
252
-
253
- self.assertEqual(obj.reasons_ineligible_part_three, incomplete_reason)
254
- self.assertEqual(obj.eligible_part_three, TBD)
255
- self.assertFalse(obj.eligible)
256
- self.assertFalse(obj.consented)
257
-
258
- obj.creatinine_performed = YES
259
- obj.creatinine_value = 50
260
- obj.creatinine_units = MICROMOLES_PER_LITER
261
- obj.save()
262
-
263
- self.assertEqual(obj.reasons_ineligible_part_three, incomplete_reason)
264
- self.assertEqual(obj.eligible_part_three, TBD)
265
- self.assertFalse(obj.eligible)
266
- self.assertFalse(obj.consented)
267
-
268
- obj.fasting = NO
269
- obj.save()
270
-
271
- self.assertEqual(obj.reasons_ineligible_part_three, incomplete_reason)
272
- self.assertEqual(obj.eligible_part_three, TBD)
273
- self.assertFalse(obj.eligible)
274
- self.assertFalse(obj.consented)
275
-
276
- obj.fasting = YES
277
- obj.fasting_duration_str = "8h"
278
- obj.fbg_value = 6.9
279
- obj.fbg_units = MILLIMOLES_PER_LITER
280
- obj.fbg_datetime = get_utcnow()
281
- obj.save()
282
-
283
- self.assertEqual(obj.reasons_ineligible_part_three, incomplete_reason)
284
- self.assertEqual(obj.eligible_part_three, TBD)
285
- self.assertFalse(obj.eligible)
286
- self.assertFalse(obj.consented)
287
-
288
- obj.ogtt_base_datetime = get_utcnow()
289
- obj.ogtt_value = 3.0
290
- obj.ogtt_units = MICROMOLES_PER_LITER
291
- obj.ogtt_datetime = get_utcnow()
292
- obj.save()
293
-
294
- obj.refresh_from_db()
295
- obj.ogtt_value = convert_units(
296
- label="glucose",
297
- value=3.0,
298
- units_from=MICROMOLES_PER_LITER,
299
- units_to=MILLIMOLES_PER_LITER,
300
- )
301
- obj.ogtt_units = MILLIMOLES_PER_LITER
302
- obj.save()
303
-
304
- self.assertEqual(obj.eligible_part_three, YES)
305
- self.assertTrue(obj.eligible)
306
- self.assertFalse(obj.consented)
307
-
308
- obj.ogtt_base_datetime = get_utcnow()
309
- obj.ogtt_value = 7.8
310
- obj.ogtt_units = MILLIMOLES_PER_LITER
311
- obj.ogtt_datetime = get_utcnow()
312
- obj.save()
313
-
314
- self.assertFalse(obj.reasons_ineligible_part_three)
315
- self.assertEqual(obj.eligible_part_three, YES)
316
- self.assertTrue(obj.eligible)
317
- self.assertFalse(obj.consented)
318
-
319
- def test_yes_eligible_egfr_not_calculated_phase_three(self):
320
- """Is eligible, since phase three will allow for EGFR to be considered
321
- late exclusion.
322
- """
323
- fbg_value = 6.9
324
- ogtt_value = 7.8
325
- obj = self._test_egfr_not_calculated(fbg_value, ogtt_value)
326
- self.assertNotIn(EGFR_NOT_CALCULATED, obj.reasons_ineligible_part_three or "")
327
- self.assertEqual(obj.eligible_part_three, YES)
328
- self.assertTrue(obj.eligible)
329
- self.assertFalse(obj.consented)
330
-
331
- def _test_egfr_not_calculated(self, fbg_value, ogtt_value):
332
- obj = self.get_screening_part_three_obj()
333
- self.assertEqual(obj.eligible_part_one, YES)
334
- self.assertFalse(obj.reasons_ineligible_part_one)
335
- self.assertEqual(obj.eligible_part_two, YES)
336
- self.assertFalse(obj.reasons_ineligible_part_two)
337
-
338
- obj.fbg_value = fbg_value
339
- obj.ogtt_value = ogtt_value
340
-
341
- obj.part_three_report_datetime = get_utcnow()
342
- obj.weight = 65
343
- obj.height = 110
344
- obj.hba1c_performed = YES
345
- obj.hba1c_value = 7.0
346
- obj.creatinine_performed = NO
347
- obj.fasting = YES
348
- obj.fasting_duration_str = "8h"
349
- obj.fbg_units = MILLIMOLES_PER_LITER
350
- obj.fbg_datetime = get_utcnow()
351
- obj.ogtt_base_datetime = get_utcnow()
352
- obj.ogtt_units = MILLIMOLES_PER_LITER
353
- obj.ogtt_datetime = get_utcnow()
354
- obj.severe_htn = NO
355
- obj.save()
356
- return obj
357
-
358
- def test_not_eligible_egfr_less_than_45_phase_three(self):
359
- fbg_value = 6.9
360
- ogtt_value = 7.8
361
- self._test_not_eligible_egfr_less_than_45(fbg_value, ogtt_value)
362
-
363
- def _test_not_eligible_egfr_less_than_45(self, fbg_value, ogtt_value):
364
- obj = self.get_screening_part_three_obj()
365
- self.assertEqual(obj.eligible_part_one, YES)
366
- self.assertFalse(obj.reasons_ineligible_part_one)
367
- self.assertEqual(obj.eligible_part_two, YES)
368
- self.assertFalse(obj.reasons_ineligible_part_two)
369
-
370
- obj.fbg_value = fbg_value
371
- obj.ogtt_value = ogtt_value
372
-
373
- # defaults
374
- obj.creatinine_performed = NO
375
- obj.creatinine_units = MICROMOLES_PER_LITER
376
- obj.creatinine_value = 200
377
- obj.fasting = YES
378
- obj.fasting_duration_str = "8h"
379
- obj.hba1c_performed = YES
380
- obj.hba1c_value = 7.0
381
- obj.height = 110
382
- obj.fbg_datetime = get_utcnow()
383
- obj.fbg_units = MILLIMOLES_PER_LITER
384
- obj.ogtt_base_datetime = get_utcnow()
385
- obj.ogtt_datetime = get_utcnow()
386
- obj.ogtt_units = MILLIMOLES_PER_LITER
387
- obj.part_three_report_datetime = get_utcnow()
388
- obj.severe_htn = NO
389
- obj.weight = 65
390
- obj.save()
391
-
392
- self.assertIn(EGFR_LT_45, obj.reasons_ineligible_part_three)
393
- self.assertEqual(obj.eligible_part_three, NO)
394
- self.assertFalse(obj.eligible)
395
- self.assertFalse(obj.consented)
396
-
397
- def test_pregnancy_detected_in_p3(self):
398
- """P1 pregnant==NO, p3"""
399
- # pregnant==NO
400
- # urine_bhcg_performed == YES
401
- # urine_bhcg_value == POS
402
-
403
- part_one_eligible_options = deepcopy(get_part_one_eligible_options())
404
- part_one_eligible_options.update(gender=FEMALE, pregnant=NO)
405
- model_obj = ScreeningPartOne(**part_one_eligible_options)
406
- model_obj.save()
407
- part_two_eligible_options = deepcopy(get_part_two_eligible_options())
408
-
409
- for k, v in part_two_eligible_options.items():
410
- setattr(model_obj, k, v)
411
- model_obj.save()
412
- self.assertEqual(YES, model_obj.eligible_part_one)
413
- self.assertEqual(YES, model_obj.eligible_part_two)
414
- self.assertEqual(TBD, model_obj.eligible_part_three)
415
-
416
- part_three_eligible_options = deepcopy(get_part_three_eligible_options())
417
- model_obj = self.get_screening_part_three_obj()
418
- for k, v in part_three_eligible_options.items():
419
- setattr(model_obj, k, v)
420
-
421
- model_obj.urine_bhcg_performed = NO
422
- model_obj.urine_bhcg_value = NOT_APPLICABLE
423
- model_obj.urine_bhcg_date = None
424
- model_obj.save()
425
- self.assertIsNone(model_obj.reasons_ineligible_part_three)
426
- self.assertEqual(model_obj.eligible_part_three, YES)
427
-
428
- model_obj.urine_bhcg_performed = YES
429
- model_obj.urine_bhcg_value = POS
430
- model_obj.urine_bhcg_date = model_obj.part_three_report_datetime
431
- model_obj.save()
432
- self.assertIn("UPT positive", model_obj.reasons_ineligible_part_three)
433
- self.assertEqual(model_obj.eligible_part_three, NO)
@@ -1,84 +0,0 @@
1
- from copy import deepcopy
2
-
3
- from dateutil.relativedelta import relativedelta
4
- from django.test import TestCase
5
- from edc_constants.constants import NO, NOT_APPLICABLE, TBD, YES
6
- from edc_utils.date import get_utcnow
7
-
8
- from meta_pharmacy.constants import METFORMIN
9
- from meta_screening.models import ScreeningPartOne, ScreeningPartTwo
10
-
11
- from ...eligibility import EligibilityPartOne
12
- from ..options import get_part_one_eligible_options, get_part_two_eligible_options
13
-
14
-
15
- class TestScreeningPartTwo(TestCase):
16
- def setUp(self):
17
- part_one_eligible_options = deepcopy(get_part_one_eligible_options())
18
- model_obj = ScreeningPartOne(**part_one_eligible_options)
19
- model_obj.save()
20
- self.assertIsNone(getattr(model_obj, EligibilityPartOne.reasons_ineligible_fld_name))
21
- self.assertEqual(
22
- getattr(model_obj, EligibilityPartOne.eligible_fld_name),
23
- EligibilityPartOne.is_eligible_value,
24
- )
25
-
26
- self.screening_identifier = model_obj.screening_identifier
27
-
28
- def test_defaults_phase_three(self):
29
- self._test_defaults()
30
-
31
- def test_eligible_phase_three(self):
32
- self._test_eligible()
33
-
34
- def _test_defaults(self):
35
- obj = ScreeningPartTwo.objects.get(screening_identifier=self.screening_identifier)
36
- self.assertEqual(obj.eligible_part_two, TBD)
37
- self.assertIn("not answered", obj.reasons_ineligible_part_two)
38
-
39
- self.assertFalse(obj.eligible)
40
- self.assertFalse(obj.consented)
41
-
42
- def _test_eligible(self):
43
- obj = ScreeningPartTwo.objects.get(screening_identifier=self.screening_identifier)
44
- self.assertEqual(obj.eligible_part_one, YES)
45
- self.assertIsNone(obj.reasons_ineligible_part_one)
46
-
47
- part_two_eligible_options = deepcopy(get_part_two_eligible_options())
48
-
49
- for k, v in part_two_eligible_options.items():
50
- setattr(obj, k, v)
51
-
52
- obj.advised_to_fast = NOT_APPLICABLE
53
- obj.appt_datetime = None
54
- obj.acute_condition = None
55
- obj.metformin_sensitivity = None
56
- obj.save()
57
- obj.refresh_from_db()
58
-
59
- self.assertIn("not answered", obj.reasons_ineligible_part_two)
60
- self.assertNotIn("Appt Datetime", obj.reasons_ineligible_part_two)
61
- self.assertNotIn("Advised To Fast", obj.reasons_ineligible_part_two)
62
- self.assertEqual(obj.eligible_part_two, TBD)
63
- self.assertFalse(obj.eligible)
64
- self.assertFalse(obj.consented)
65
-
66
- obj.acute_condition = NO
67
- obj.metformin_sensitivity = YES
68
- obj.save()
69
-
70
- self.assertIn(METFORMIN, (obj.reasons_ineligible_part_two or "").lower())
71
- self.assertEqual(obj.eligible_part_two, NO)
72
- self.assertFalse(obj.eligible)
73
- self.assertFalse(obj.consented)
74
-
75
- obj.acute_condition = NO
76
- obj.metformin_sensitivity = NO
77
- obj.advised_to_fast = YES
78
- obj.appt_datetime = get_utcnow() + relativedelta(days=1)
79
- obj.save()
80
-
81
- self.assertIsNone(obj.reasons_ineligible_part_two)
82
- self.assertEqual(obj.eligible_part_two, YES)
83
- self.assertFalse(obj.eligible)
84
- self.assertFalse(obj.consented)
File without changes
@@ -1,12 +0,0 @@
1
- from django.test import TestCase
2
- from edc_sites.exceptions import InvalidSiteError
3
- from edc_sites.site import sites
4
-
5
-
6
- class SiteTests(TestCase):
7
- def test_all(self):
8
- self.assertEqual(sites.get_by_attr("name", "hindu_mandal").site_id, 10)
9
- self.assertEqual(sites.get_by_attr("name", "amana").site_id, 20)
10
-
11
- def test_bad(self):
12
- self.assertRaises(InvalidSiteError, sites.get_by_attr, "name", "erik")
meta_sites/tests/urls.py DELETED
@@ -1,4 +0,0 @@
1
- from django.contrib import admin
2
- from django.urls import path
3
-
4
- urlpatterns = [path("admin/", admin.site.urls)]
meta_stats/__init__.py DELETED
File without changes
meta_stats/incidence.py DELETED
@@ -1,16 +0,0 @@
1
- from edc_registration.models import RegisteredSubject
2
-
3
- from meta_subject.models import Glucose
4
-
5
-
6
- def get_sequential_fgb():
7
- """look for anyone with two or more sequential FBG measurements"""
8
-
9
- for rs in RegisteredSubject.objects.all().order_by("subject_identifier"):
10
- values = []
11
- for index, glucose in enumerate(
12
- Glucose.objects.filter(
13
- subject_visit__subject_identifier=rs.subject_identifier
14
- ).order_by("report_datetime")
15
- ):
16
- values.append(glucose.fbg_value)
meta_stats/models.py DELETED
File without changes
File without changes
File without changes
@@ -1,10 +0,0 @@
1
- from django.test import TestCase
2
- from edc_constants.constants import FEMALE
3
-
4
- from meta_screening.tests.meta_test_case_mixin import MetaTestCaseMixin
5
-
6
-
7
- class TestIncidence(MetaTestCaseMixin, TestCase):
8
- def setUp(self):
9
- super().setUp()
10
- self.subject_visit = self.get_subject_visit(gender=FEMALE)
File without changes
@@ -1,15 +0,0 @@
1
- 2019-01-01,New Year's Day,tanzania
2
- 2019-01-12,Zanzibar Revolution Day,tanzania
3
- 2019-04-07,The Sheikh Abeid Amani Karume Day,tanzania
4
- 2019-04-17,Easter Monday,tanzania
5
- 2019-04-26,Union Day,tanzania
6
- 2019-05-01,Labour Day,tanzania
7
- 2019-06-26,Eid al-Fitr,tanzania
8
- 2019-07-07,Saba Saba Day,tanzania
9
- 2019-07-14,Good Friday,tanzania
10
- 2019-08-08,Nane Nane Day,tanzania
11
- 2019-10-14,Nyerere Day,tanzania
12
- 2019-12-01,Mawlid Day,tanzania
13
- 2019-12-09,Independence Day,tanzania
14
- 2019-12-25,Christmas Day,tanzania
15
- 2019-12-26,Boxing Day,tanzania
File without changes