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,5 +0,0 @@
1
- Wheel-Version: 1.0
2
- Generator: setuptools (80.9.0)
3
- Root-Is-Purelib: true
4
- Tag: py3-none-any
5
-
@@ -1,8 +0,0 @@
1
- Maintainers
2
- ===========
3
- - Erik van Widenfelt (`erikvw <https://github.com/erikvw>`__)
4
-
5
- Authors
6
- =======
7
- - Erik van Widenfelt (`erikvw <https://github.com/erikvw>`_)
8
- - Jonathan Willitts (`JonathanWillitts <https://github.com/JonathanWillitts>`_)
@@ -1,20 +0,0 @@
1
- meta_ae
2
- meta_analytics
3
- meta_auth
4
- meta_consent
5
- meta_dashboard
6
- meta_data_manager
7
- meta_edc
8
- meta_export
9
- meta_labs
10
- meta_lists
11
- meta_pharmacy
12
- meta_prn
13
- meta_rando
14
- meta_reports
15
- meta_screening
16
- meta_sites
17
- meta_stats
18
- meta_subject
19
- meta_visit_schedule
20
- tests
File without changes
@@ -1,27 +0,0 @@
1
- from django.test import TestCase
2
- from edc_lab.models import Panel
3
- from edc_lab.site_labs import site_labs
4
-
5
- from ..lab_profiles import subject_lab_profile
6
-
7
-
8
- class TestLabs(TestCase):
9
- def setUp(self):
10
- site_labs._registry = {}
11
- site_labs.loaded = False
12
- site_labs.register(lab_profile=subject_lab_profile)
13
-
14
- def test_(self):
15
- obj = site_labs.get(lab_profile_name="subject_lab_profile")
16
- self.assertEqual(obj, subject_lab_profile)
17
-
18
- def test_lab_profile_model(self):
19
- obj = site_labs.get(lab_profile_name="subject_lab_profile")
20
- self.assertEqual("meta_subject.subjectrequisition", obj.requisition_model)
21
-
22
- def test_panel_model(self):
23
- for panel in site_labs.get(lab_profile_name="subject_lab_profile").panels.values():
24
- self.assertEqual(panel.requisition_model, "meta_subject.subjectrequisition")
25
-
26
- def test_panels_exist(self):
27
- self.assertGreater(Panel.objects.all().count(), 0)
@@ -1,70 +0,0 @@
1
- from django.test import TestCase, tag
2
- from edc_lab import site_labs
3
- from edc_reportable.models import GradingData, NormalData, ReferenceRangeCollection
4
- from edc_reportable.utils import load_reference_ranges
5
-
6
-
7
- class TestReportables(TestCase):
8
- @tag("37")
9
- def test_load_reference_ranges(self):
10
-
11
- from meta_labs.reportables import (
12
- collection_name,
13
- grading_data,
14
- normal_data,
15
- reportable_grades,
16
- reportable_grades_exceptions,
17
- )
18
-
19
- load_reference_ranges(
20
- collection_name=collection_name,
21
- grading_data=grading_data,
22
- normal_data=normal_data,
23
- reportable_grades=reportable_grades,
24
- reportable_grades_exceptions=reportable_grades_exceptions,
25
- )
26
- self.assertTrue(ReferenceRangeCollection.objects.filter(name=collection_name).exists())
27
- reference_range_collection = ReferenceRangeCollection.objects.get(name=collection_name)
28
-
29
- for panel_name, requisition_panel in site_labs.lab_profiles.get(
30
- "subject_lab_profile"
31
- ).panels.items():
32
- for utest_id in requisition_panel.utest_ids:
33
- try:
34
- utest_id, _ = utest_id
35
- except ValueError:
36
- pass
37
- if not NormalData.objects.filter(label=utest_id).exists():
38
- print(f"{utest_id} does not exist in NormalData")
39
- if not GradingData.objects.filter(label=utest_id).exists():
40
- print(f"{utest_id} does not exist in GradingData")
41
-
42
- for panel_name, requisition_panel in site_labs.lab_profiles.get(
43
- "subject_lab_profile"
44
- ).panels.items():
45
- for utest_id in requisition_panel.utest_ids:
46
- try:
47
- utest_id, _ = utest_id
48
- except ValueError:
49
- pass
50
- self.assertTrue(
51
- NormalData.objects.filter(label=utest_id).exists(),
52
- msg=f"{utest_id} does not exist in NormalData",
53
- )
54
- self.assertTrue(
55
- GradingData.objects.filter(label=utest_id).exists(),
56
- msg=f"{utest_id} does not exist in GradingData",
57
- )
58
-
59
- self.assertEqual(
60
- NormalData.objects.filter(
61
- reference_range_collection=reference_range_collection
62
- ).count(),
63
- 88,
64
- )
65
- self.assertEqual(
66
- GradingData.objects.filter(
67
- reference_range_collection=reference_range_collection
68
- ).count(),
69
- 180,
70
- )
meta_labs/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)]
File without changes
@@ -1,8 +0,0 @@
1
- from django.test import TestCase
2
- from edc_list_data.site_list_data import site_list_data
3
-
4
-
5
- class TestList(TestCase):
6
- def test_(self):
7
- site_list_data.initialize()
8
- site_list_data.autodiscover()
@@ -1,41 +0,0 @@
1
- {
2
- "cells": [
3
- {
4
- "cell_type": "code",
5
- "execution_count": null,
6
- "id": "0",
7
- "metadata": {},
8
- "outputs": [],
9
- "source": []
10
- },
11
- {
12
- "cell_type": "code",
13
- "execution_count": null,
14
- "id": "1",
15
- "metadata": {},
16
- "outputs": [],
17
- "source": []
18
- }
19
- ],
20
- "metadata": {
21
- "kernelspec": {
22
- "display_name": "Python 3",
23
- "language": "python",
24
- "name": "python3"
25
- },
26
- "language_info": {
27
- "codemirror_mode": {
28
- "name": "ipython",
29
- "version": 2
30
- },
31
- "file_extension": ".py",
32
- "mimetype": "text/x-python",
33
- "name": "python",
34
- "nbconvert_exporter": "python",
35
- "pygments_lexer": "ipython2",
36
- "version": "2.7.6"
37
- }
38
- },
39
- "nbformat": 4,
40
- "nbformat_minor": 5
41
- }
File without changes
File without changes
@@ -1,97 +0,0 @@
1
- from django.core.exceptions import ObjectDoesNotExist
2
- from django.test import TestCase
3
- from edc_action_item.models import ActionItem
4
- from edc_appointment.models import Appointment
5
- from edc_constants.constants import FEMALE
6
- from edc_utils import get_utcnow
7
- from edc_visit_schedule.constants import MONTH1
8
- from model_bakery.baker import make_recipe
9
-
10
- from meta_prn.models import OffSchedulePregnancy
11
- from meta_screening.tests.meta_test_case_mixin import MetaTestCaseMixin
12
- from meta_visit_schedule.constants import DELIVERY
13
-
14
-
15
- class TestMetadataRules(MetaTestCaseMixin, TestCase):
16
- def setUp(self):
17
- super().setUp()
18
- self.subject_screening = self.get_subject_screening(gender=FEMALE)
19
- self.subject_consent = self.get_subject_consent(self.subject_screening)
20
- self.subject_visit = self.get_subject_visit(
21
- subject_screening=self.subject_screening,
22
- subject_consent=self.subject_consent,
23
- )
24
- self.data = dict(
25
- subject_visit=self.subject_visit.pk,
26
- report_datetime=self.subject_visit.report_datetime,
27
- )
28
-
29
- def test_pregnancy_actions(self):
30
- subject_visit = self.get_next_subject_visit(self.subject_visit)
31
- subject_visit = self.get_next_subject_visit(subject_visit)
32
- self.assertEqual(subject_visit.visit_code, MONTH1)
33
-
34
- urine_pregnancy = make_recipe(
35
- "meta_subject.urinepregnancy",
36
- subject_visit=subject_visit,
37
- report_datetime=get_utcnow(),
38
- assay_date=get_utcnow().date(),
39
- )
40
-
41
- try:
42
- ActionItem.objects.get(
43
- action_identifier=urine_pregnancy.action_identifier,
44
- action_type__reference_model="meta_subject.urinepregnancy",
45
- )
46
- except ObjectDoesNotExist:
47
- self.fail("ActionItem for urinepregnancy unexpectedly does not exist")
48
-
49
- try:
50
- ActionItem.objects.get(
51
- parent_action_item__action_identifier=urine_pregnancy.action_identifier,
52
- action_type__reference_model="meta_prn.pregnancynotification",
53
- )
54
- except ObjectDoesNotExist:
55
- self.fail("ActionItem for pregnancynotification unexpectedly does not exist")
56
-
57
- make_recipe(
58
- "meta_prn.pregnancynotification",
59
- subject_identifier=subject_visit.subject_identifier,
60
- )
61
-
62
- try:
63
- appointment = Appointment.objects.get(visit_code=DELIVERY)
64
- except ObjectDoesNotExist:
65
- self.fail("delivery appointment unexpectedly does not exist")
66
-
67
- subject_visit = self.get_subject_visit(
68
- subject_screening=self.subject_screening,
69
- subject_consent=self.subject_consent,
70
- visit_code=DELIVERY,
71
- visit_code_sequence=0,
72
- appt_datetime=appointment.appt_datetime,
73
- )
74
-
75
- delivery = make_recipe(
76
- "meta_subject.delivery",
77
- subject_visit=subject_visit,
78
- )
79
-
80
- try:
81
- ActionItem.objects.get(
82
- parent_action_item__action_identifier=delivery.action_identifier,
83
- action_type__reference_model="meta_prn.offschedulepregnancy",
84
- )
85
- except ObjectDoesNotExist:
86
- self.fail("ActionItem for offschedulepregnancy unexpectedly does not exist")
87
-
88
- offschedule_pregancy = OffSchedulePregnancy.objects.get(
89
- subject_identifier=delivery.subject_visit.subject_identifier
90
- )
91
- try:
92
- ActionItem.objects.get(
93
- parent_action_item__action_identifier=offschedule_pregancy.action_identifier,
94
- action_type__reference_model="meta_prn.endofstudy",
95
- )
96
- except ObjectDoesNotExist:
97
- self.fail("ActionItem for endofstudy unexpectedly does not exist")
@@ -1,203 +0,0 @@
1
- from dateutil.relativedelta import relativedelta
2
- from django.core.exceptions import ObjectDoesNotExist
3
- from django.test import TestCase
4
- from edc_action_item.models import ActionItem
5
- from edc_appointment.constants import COMPLETE_APPT
6
- from edc_appointment.models import Appointment
7
- from edc_constants.constants import CLOSED, FEMALE, NEW, NO, PATIENT, YES
8
- from edc_pharmacy.constants import IN_PROGRESS_APPT
9
- from edc_utils import get_utcnow
10
- from edc_visit_schedule.constants import MONTH1, OFFSCHEDULE_ACTION
11
- from edc_visit_tracking.constants import SCHEDULED
12
-
13
- from meta_lists.models import MissedReferralReasons
14
- from meta_prn.constants import (
15
- OFFSCHEDULE_DM_REFERRAL_ACTION,
16
- OFFSTUDY_MEDICATION_ACTION,
17
- )
18
- from meta_prn.models import DmReferral, OnScheduleDmReferral
19
- from meta_screening.tests.meta_test_case_mixin import MetaTestCaseMixin
20
- from meta_subject.constants import DM_FOLLOWUP_ACTION
21
- from meta_subject.models import DmEndpoint, DmFollowup, SubjectVisit
22
- from meta_visit_schedule.constants import DM_BASELINE, DM_FOLLOWUP, SCHEDULE_DM_REFERRAL
23
-
24
-
25
- class TestDmReferral(MetaTestCaseMixin, TestCase):
26
- def setUp(self):
27
- super().setUp()
28
- self.subject_visit = self.get_subject_visit(gender=FEMALE)
29
-
30
- def test_dm_referral_puts_subject_on_dm_followup_schedule(self):
31
- subject_visit = self.get_next_subject_visit(self.subject_visit)
32
- subject_visit = self.get_next_subject_visit(subject_visit)
33
- self.assertEqual(subject_visit.visit_code, MONTH1)
34
- dm_referral = DmReferral.objects.create(
35
- subject_identifier=subject_visit.subject_identifier,
36
- report_datetime=get_utcnow(),
37
- referral_date=get_utcnow(),
38
- )
39
- self.assertIsNotNone(dm_referral.report_datetime)
40
- self.assertIsNotNone(dm_referral.referral_date)
41
- self.assertIsNotNone(dm_referral.action_identifier)
42
-
43
- # verify subject is on DM Followup schedule
44
- try:
45
- OnScheduleDmReferral.objects.get(
46
- subject_identifier=subject_visit.subject_identifier
47
- )
48
- except ObjectDoesNotExist:
49
- self.fail("OnScheduleDmReferral unexpectedly does not exist")
50
-
51
- def test_dm_referral_action_creates_offschedule_action(self):
52
- subject_visit = self.get_next_subject_visit(self.subject_visit)
53
- subject_visit = self.get_next_subject_visit(subject_visit)
54
- self.assertEqual(subject_visit.visit_code, MONTH1)
55
- dm_referral = DmReferral.objects.create(
56
- subject_identifier=subject_visit.subject_identifier,
57
- report_datetime=get_utcnow(),
58
- referral_date=get_utcnow(),
59
- )
60
- self.assertIsNotNone(dm_referral.report_datetime)
61
- self.assertIsNotNone(dm_referral.referral_date)
62
- self.assertIsNotNone(dm_referral.action_identifier)
63
-
64
- try:
65
- ActionItem.objects.get(
66
- subject_identifier=subject_visit.subject_identifier,
67
- action_type__name=OFFSCHEDULE_ACTION,
68
- status=CLOSED,
69
- )
70
- except ObjectDoesNotExist:
71
- self.fail(f"{OFFSCHEDULE_ACTION} Action item unexpectedly does not exist")
72
-
73
- def test_dm_referral_creates_offstudy_med_action(self):
74
- subject_visit = self.get_next_subject_visit(self.subject_visit)
75
- subject_visit = self.get_next_subject_visit(subject_visit)
76
- self.assertEqual(subject_visit.visit_code, MONTH1)
77
- dm_referral = DmReferral.objects.create(
78
- subject_identifier=subject_visit.subject_identifier,
79
- report_datetime=get_utcnow(),
80
- referral_date=get_utcnow(),
81
- )
82
- self.assertIsNotNone(dm_referral.report_datetime)
83
- self.assertIsNotNone(dm_referral.referral_date)
84
- self.assertIsNotNone(dm_referral.action_identifier)
85
-
86
- # verify action items are created
87
- try:
88
- ActionItem.objects.get(
89
- subject_identifier=subject_visit.subject_identifier,
90
- action_type__name=OFFSTUDY_MEDICATION_ACTION,
91
- status=NEW,
92
- )
93
- except ObjectDoesNotExist:
94
- self.fail(f"{OFFSTUDY_MEDICATION_ACTION} Action item unexpectedly does not exist")
95
-
96
- def test_dm_referral_creates_dm_followup_action(self):
97
- subject_visit = self.get_next_subject_visit(self.subject_visit)
98
- subject_visit = self.get_next_subject_visit(subject_visit)
99
- self.assertEqual(subject_visit.visit_code, MONTH1)
100
- dm_referral = DmReferral.objects.create(
101
- subject_identifier=subject_visit.subject_identifier,
102
- report_datetime=get_utcnow(),
103
- referral_date=get_utcnow(),
104
- )
105
- self.assertIsNotNone(dm_referral.report_datetime)
106
- self.assertIsNotNone(dm_referral.referral_date)
107
- self.assertIsNotNone(dm_referral.action_identifier)
108
-
109
- try:
110
- ActionItem.objects.get(
111
- subject_identifier=subject_visit.subject_identifier,
112
- action_type__name=DM_FOLLOWUP_ACTION,
113
- status=NEW,
114
- )
115
- except ObjectDoesNotExist:
116
- self.fail(f"{DM_FOLLOWUP_ACTION} Action item unexpectedly does not exist")
117
-
118
- def test_dm_referral2(self):
119
- subject_visit = self.get_next_subject_visit(self.subject_visit)
120
- subject_visit = self.get_next_subject_visit(subject_visit)
121
- self.assertEqual(subject_visit.visit_code, MONTH1)
122
- referral_datetime = subject_visit.report_datetime
123
- DmReferral.objects.create(
124
- subject_identifier=subject_visit.subject_identifier,
125
- report_datetime=referral_datetime,
126
- referral_date=referral_datetime.date(),
127
- )
128
-
129
- # Add DM Baseline
130
- appointment = Appointment.objects.get(
131
- subject_identifier=subject_visit.subject_identifier,
132
- schedule_name=SCHEDULE_DM_REFERRAL,
133
- visit_code=DM_BASELINE,
134
- )
135
- appointment.appt_status = IN_PROGRESS_APPT
136
- appointment.save()
137
-
138
- subject_visit = SubjectVisit.objects.create(
139
- appointment=appointment,
140
- subject_identifier=subject_visit.subject_identifier,
141
- report_datetime=appointment.appt_datetime,
142
- reason=SCHEDULED,
143
- info_source=PATIENT,
144
- )
145
-
146
- DmEndpoint.objects.create(
147
- subject_visit=subject_visit,
148
- report_datetime=get_utcnow(),
149
- dx_date=referral_datetime.date(),
150
- dx_initiated_by="fbg_confirmed",
151
- dx_tmg=YES,
152
- dx_tmg_date=referral_datetime.date(),
153
- )
154
-
155
- # Add DM Followup
156
- followup_datetime = referral_datetime + relativedelta(months=6)
157
- appointment = Appointment.objects.get(
158
- subject_identifier=subject_visit.subject_identifier,
159
- schedule_name=SCHEDULE_DM_REFERRAL,
160
- visit_code=DM_FOLLOWUP,
161
- )
162
- appointment.appt_status = IN_PROGRESS_APPT
163
- appointment.save()
164
-
165
- subject_visit = SubjectVisit.objects.create(
166
- appointment=appointment,
167
- subject_identifier=subject_visit.subject_identifier,
168
- report_datetime=appointment.appt_datetime,
169
- reason=SCHEDULED,
170
- info_source=PATIENT,
171
- )
172
-
173
- dm_followup = DmFollowup.objects.create(
174
- subject_visit=subject_visit,
175
- report_datetime=followup_datetime,
176
- referral_date=referral_datetime.date(),
177
- attended=NO,
178
- on_dm_medications=NO,
179
- )
180
- dm_followup.missed_referral_reasons.set([MissedReferralReasons.objects.all()[0]])
181
-
182
- appointment.appt_status = COMPLETE_APPT
183
- appointment.save()
184
-
185
- try:
186
- ActionItem.objects.get(
187
- subject_identifier=subject_visit.subject_identifier,
188
- action_type__name=DM_FOLLOWUP_ACTION,
189
- status=CLOSED,
190
- )
191
- except ObjectDoesNotExist:
192
- self.fail(f"{DM_FOLLOWUP_ACTION} Action item unexpectedly does not exist")
193
-
194
- try:
195
- ActionItem.objects.get(
196
- subject_identifier=subject_visit.subject_identifier,
197
- action_type__name=OFFSCHEDULE_DM_REFERRAL_ACTION,
198
- status=NEW,
199
- )
200
- except ObjectDoesNotExist:
201
- self.fail(
202
- f"{OFFSCHEDULE_DM_REFERRAL_ACTION} Action item unexpectedly does not exist"
203
- )
@@ -1,134 +0,0 @@
1
- from django.test import TestCase
2
- from edc_action_item.models import ActionItem
3
- from edc_constants.constants import FEMALE, NEW, PATIENT, YES
4
- from edc_offstudy.constants import END_OF_STUDY_ACTION
5
- from edc_pharmacy.models import Medication
6
- from edc_transfer.constants import SUBJECT_TRANSFER_ACTION, TRANSFERRED
7
- from edc_utils import get_utcnow
8
- from edc_visit_schedule.constants import OFFSCHEDULE_ACTION
9
-
10
- from meta_lists.models import OffstudyReasons, TransferReasons
11
- from meta_pharmacy.constants import METFORMIN
12
- from meta_prn.action_items import OffscheduleAction, SubjectTransferAction
13
- from meta_prn.constants import OFFSTUDY_MEDICATION_ACTION
14
- from meta_prn.models import EndOfStudy, OffSchedule, OffStudyMedication, SubjectTransfer
15
- from meta_screening.tests.meta_test_case_mixin import MetaTestCaseMixin
16
-
17
-
18
- class TestEosEvents(MetaTestCaseMixin, TestCase):
19
- def setUp(self):
20
- super().setUp()
21
- self.subject_screening = self.get_subject_screening(gender=FEMALE)
22
- self.subject_consent = self.get_subject_consent(self.subject_screening)
23
- self.subject_visit = self.get_subject_visit(
24
- subject_screening=self.subject_screening,
25
- subject_consent=self.subject_consent,
26
- )
27
- self.data = dict(
28
- subject_visit=self.subject_visit.pk,
29
- report_datetime=self.subject_visit.report_datetime,
30
- )
31
-
32
- def test_transfer_to_offschedule_in_order(self):
33
- SubjectTransferAction(
34
- subject_identifier=self.subject_consent.subject_identifier,
35
- skip_get_current_site=True,
36
- site_id=self.subject_consent.site_id,
37
- )
38
- action_types = [
39
- obj.action_type.name
40
- for obj in ActionItem.objects.filter(status=NEW).order_by("action_type__name")
41
- ]
42
- self.assertEqual(action_types, [SUBJECT_TRANSFER_ACTION])
43
-
44
- # add a subject transfer object, which triggers next action item
45
- transfer_reason = TransferReasons.objects.get(name="moved")
46
- subject_transfer = SubjectTransfer.objects.create(
47
- subject_identifier=self.subject_consent.subject_identifier,
48
- initiated_by="patient",
49
- may_return=YES,
50
- may_contact=YES,
51
- )
52
- subject_transfer.transfer_reason.add(transfer_reason)
53
-
54
- action_types = [
55
- obj.action_type.name
56
- for obj in ActionItem.objects.filter(status=NEW).order_by("action_type__name")
57
- ]
58
- self.assertEqual(action_types, [OFFSCHEDULE_ACTION, OFFSTUDY_MEDICATION_ACTION])
59
-
60
- OffSchedule.objects.create(subject_identifier=self.subject_consent.subject_identifier)
61
-
62
- action_types = [
63
- obj.action_type.name
64
- for obj in ActionItem.objects.filter(status=NEW).order_by("action_type__name")
65
- ]
66
- self.assertEqual(action_types, [OFFSTUDY_MEDICATION_ACTION])
67
-
68
- offstudy_rx = OffStudyMedication.objects.create(
69
- subject_identifier=self.subject_consent.subject_identifier,
70
- stop_date=get_utcnow().date(),
71
- last_dose_date=get_utcnow().date(),
72
- reason=PATIENT,
73
- )
74
- offstudy_rx.medications.add(Medication.objects.get(name=METFORMIN))
75
-
76
- action_types = [
77
- obj.action_type.name
78
- for obj in ActionItem.objects.filter(status=NEW).order_by("action_type__name")
79
- ]
80
- self.assertEqual(action_types, [END_OF_STUDY_ACTION])
81
-
82
- EndOfStudy.objects.create(
83
- subject_identifier=self.subject_consent.subject_identifier,
84
- last_seen_date=get_utcnow().date(),
85
- offstudy_reason=OffstudyReasons.objects.get(name=TRANSFERRED),
86
- )
87
-
88
- action_types = [
89
- obj.action_type.name
90
- for obj in ActionItem.objects.filter(status=NEW).order_by("action_type__name")
91
- ]
92
- self.assertEqual(action_types, [])
93
-
94
- def test_transfer_to_offschedule_raises(self):
95
-
96
- OffscheduleAction(
97
- subject_identifier=self.subject_consent.subject_identifier,
98
- skip_get_current_site=True,
99
- site_id=self.subject_consent.site_id,
100
- )
101
-
102
- OffSchedule.objects.create(subject_identifier=self.subject_consent.subject_identifier)
103
-
104
- action_types = [
105
- obj.action_type.name
106
- for obj in ActionItem.objects.filter(status=NEW).order_by("action_type__name")
107
- ]
108
- self.assertEqual(action_types, [OFFSTUDY_MEDICATION_ACTION])
109
-
110
- offstudy_rx = OffStudyMedication.objects.create(
111
- subject_identifier=self.subject_consent.subject_identifier,
112
- stop_date=get_utcnow().date(),
113
- last_dose_date=get_utcnow().date(),
114
- reason=PATIENT,
115
- )
116
- offstudy_rx.medications.add(Medication.objects.get(name=METFORMIN))
117
-
118
- action_types = [
119
- obj.action_type.name
120
- for obj in ActionItem.objects.filter(status=NEW).order_by("action_type__name")
121
- ]
122
- self.assertEqual(action_types, [END_OF_STUDY_ACTION])
123
-
124
- EndOfStudy.objects.create(
125
- subject_identifier=self.subject_consent.subject_identifier,
126
- last_seen_date=get_utcnow().date(),
127
- offstudy_reason=OffstudyReasons.objects.get(name=TRANSFERRED),
128
- )
129
-
130
- action_types = [
131
- obj.action_type.name
132
- for obj in ActionItem.objects.filter(status=NEW).order_by("action_type__name")
133
- ]
134
- self.assertEqual(action_types, [])
@@ -1,14 +0,0 @@
1
- from django.apps import apps as django_apps
2
- from django.test import TestCase
3
- from edc_sites.managers import CurrentSiteManager
4
-
5
-
6
- class TestManagers(TestCase):
7
- def test_models(self):
8
- app_config = django_apps.get_app_config("meta_prn")
9
- for model_cls in app_config.get_models():
10
- if "historical" not in model_cls._meta.label_lower:
11
- self.assertFalse(
12
- isinstance(model_cls._default_manager, (CurrentSiteManager,)),
13
- msg=model_cls._meta.label_lower,
14
- )