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,17 +0,0 @@
1
- from django.urls.conf import include, path
2
- from django.views.generic.base import RedirectView
3
-
4
- urlpatterns = [
5
- path("edc_auth/", include("edc_auth.urls")),
6
- path("edc_adverse_event/", include("edc_adverse_event.urls")),
7
- path("edc_randomization/", include("edc_randomization.urls")),
8
- path("edc_consent/", include("edc_consent.urls")),
9
- path("edc_dashboard/", include("edc_dashboard.urls")),
10
- path("edc_export/", include("edc_export.urls")),
11
- path("edc_device/", include("edc_device.urls")),
12
- path("edc_protocol/", include("edc_protocol.urls")),
13
- path("edc_visit_schedule/", include("edc_visit_schedule.urls")),
14
- path("meta_consent/", include("meta_consent.urls")),
15
- path("administration", RedirectView.as_view(url="admin/"), name="administration_url"),
16
- path("", RedirectView.as_view(url="admin/"), name="home_url"),
17
- ]
File without changes
@@ -1,22 +0,0 @@
1
- from django.contrib.admin import AdminSite as DjangoAdminSite
2
- from edc_locator.models import SubjectLocator
3
-
4
- from meta_consent.models import SubjectConsent
5
- from meta_screening.models import SubjectScreening
6
- from meta_subject.models import SubjectRequisition, SubjectVisit
7
-
8
-
9
- class AdminSite(DjangoAdminSite):
10
- site_title = "Ambition Subject"
11
- site_header = "Ambition Subject"
12
- index_title = "Ambition Subject"
13
- site_url = "/administration/"
14
-
15
-
16
- meta_test_admin = AdminSite(name="meta_test_admin")
17
-
18
- meta_test_admin.register(SubjectScreening)
19
- meta_test_admin.register(SubjectConsent)
20
- meta_test_admin.register(SubjectLocator)
21
- meta_test_admin.register(SubjectVisit)
22
- meta_test_admin.register(SubjectRequisition)
@@ -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
@@ -1,55 +0,0 @@
1
- from django.contrib import admin
2
- from django.urls.conf import include, path
3
- from django.views.generic.base import RedirectView
4
- from edc_action_item.admin_site import edc_action_item_admin
5
- from edc_appointment.admin_site import edc_appointment_admin
6
- from edc_consent.admin_site import edc_consent_admin
7
- from edc_dashboard.views import AdministrationView
8
- from edc_locator.admin_site import edc_locator_admin
9
-
10
- from meta_ae.admin_site import meta_ae_admin
11
- from meta_consent.admin_site import meta_consent_admin
12
- from meta_prn.admin_site import meta_prn_admin
13
- from meta_screening.admin_site import meta_screening_admin
14
- from meta_subject.admin_site import meta_subject_admin
15
-
16
- from .admin import meta_test_admin
17
-
18
- urlpatterns = [
19
- path("accounts/", include("edc_auth.urls")),
20
- path("admin/", include("edc_auth.urls")),
21
- path("admin/", edc_appointment_admin.urls),
22
- path("admin/", edc_consent_admin.urls),
23
- path("admin/", meta_test_admin.urls),
24
- path("admin/", meta_ae_admin.urls),
25
- path("admin/", meta_prn_admin.urls),
26
- path("admin/", edc_locator_admin.urls),
27
- path("admin/", meta_consent_admin.urls),
28
- path("admin/", meta_subject_admin.urls),
29
- path("admin/", meta_screening_admin.urls),
30
- path("admin/", edc_action_item_admin.urls),
31
- path("admin/", admin.site.urls),
32
- path("administration/", AdministrationView.as_view(), name="administration_url"),
33
- path("meta_ae/", include("meta_ae.urls")),
34
- path("meta_prn/", include("meta_prn.urls")),
35
- path("meta_screening/", include("meta_screening.urls")),
36
- path("meta_consent/", include("meta_consent.urls")),
37
- path("meta_subject/", include("meta_subject.urls")),
38
- path("edc_action_item/", include("edc_action_item.urls")),
39
- path("edc_adverse_event/", include("edc_adverse_event.urls")),
40
- path("edc_appointment/", include("edc_appointment.urls")),
41
- path("edc_auth/", include("edc_auth.urls")),
42
- path("edc_consent/", include("edc_consent.urls")),
43
- path("edc_dashboard/", include("edc_dashboard.urls")),
44
- path("edc_data_manager/", include("edc_data_manager.urls")),
45
- path("edc_device/", include("edc_device.urls")),
46
- path("edc_lab/", include("edc_lab.urls")),
47
- path("edc_export/", include("edc_export.urls")),
48
- path("edc_lab_dashboard/", include("edc_lab_dashboard.urls")),
49
- path("edc_locator/", include("edc_locator.urls")),
50
- path("edc_protocol/", include("edc_protocol.urls")),
51
- path("edc_subject_dashboard/", include("edc_subject_dashboard.urls")),
52
- path("edc_visit_schedule/", include("edc_visit_schedule.urls")),
53
- path("subject/", include("meta_dashboard.urls")),
54
- path("", RedirectView.as_view(url="admin/"), name="home_url"),
55
- ]
File without changes
File without changes
@@ -1,555 +0,0 @@
1
- import sys
2
- from copy import deepcopy
3
- from datetime import datetime
4
- from importlib import import_module
5
- from unittest import skip
6
- from zoneinfo import ZoneInfo
7
-
8
- import time_machine
9
- from bs4 import BeautifulSoup
10
- from dateutil.relativedelta import relativedelta
11
- from django.apps import apps as django_apps
12
- from django.conf import settings
13
- from django.contrib.auth import get_user_model
14
- from django.contrib.sites.models import Site
15
- from django.test.utils import override_settings, tag
16
- from django.urls.base import reverse
17
- from django.urls.exceptions import NoReverseMatch
18
- from django_extensions.management.color import color_style
19
- from django_webtest import WebTest
20
- from edc_adverse_event.constants import AE_ROLE, TMG_ROLE
21
- from edc_appointment.constants import IN_PROGRESS_APPT, SCHEDULED_APPT
22
- from edc_appointment.models import Appointment
23
- from edc_auth.auth_updater import AuthUpdater
24
- from edc_auth.constants import AUDITOR_ROLE, CLINICIAN_ROLE, STAFF_ROLE
25
- from edc_auth.site_auths import site_auths
26
- from edc_consent.site_consents import site_consents
27
- from edc_constants.constants import YES
28
- from edc_dashboard.url_names import url_names
29
- from edc_export.constants import DATA_EXPORTER_ROLE
30
- from edc_lab.auth_objects import LAB_TECHNICIAN_ROLE
31
- from edc_randomization.admin import register_admin
32
- from edc_randomization.site_randomizers import site_randomizers
33
- from edc_sites.utils import add_or_update_django_sites
34
- from edc_test_utils.webtest import login
35
- from edc_utils import get_utcnow
36
- from model_bakery import baker
37
- from webtest.app import AppError
38
-
39
- from meta_rando.randomizers import RandomizerPhaseThree
40
- from meta_screening.models import ScreeningPartOne, ScreeningPartThree, ScreeningPartTwo
41
- from meta_screening.models.subject_screening import SubjectScreening
42
- from meta_screening.tests.meta_test_case_mixin import MetaTestCaseMixin
43
- from meta_screening.tests.options import (
44
- get_part_one_eligible_options,
45
- get_part_three_eligible_options,
46
- get_part_two_eligible_options,
47
- )
48
- from meta_sites.sites import all_sites
49
-
50
- style = color_style()
51
- User = get_user_model()
52
-
53
- app_prefix = "meta"
54
- screening_listboard_url = f"{app_prefix}_dashboard:screening_listboard_url"
55
-
56
-
57
- @override_settings(
58
- SIMPLE_HISTORY_PERMISSIONS_ENABLED=True,
59
- EDC_AUTH_SKIP_SITE_AUTHS=True,
60
- EDC_AUTH_SKIP_AUTH_UPDATER=False,
61
- SITE_ID=10,
62
- )
63
- class AdminSiteTest(MetaTestCaseMixin, WebTest):
64
- sid_count = 5
65
-
66
- menu_labels = [
67
- "Screening",
68
- "Subjects",
69
- "Specimens",
70
- "Adverse events",
71
- "TMG Reports",
72
- "Pharmacy",
73
- "Action items",
74
- "Export data",
75
- "Synchronization",
76
- "Switch sites",
77
- "Log out",
78
- ]
79
-
80
- @classmethod
81
- def setUpTestData(cls):
82
- super().setUpTestData()
83
- site_auths.initialize()
84
- import_module("edc_action_item.auths")
85
- import_module("edc_adverse_event.auths")
86
- import_module("edc_appointment.auths")
87
- import_module("edc_consent.auths")
88
- import_module("edc_pylabels.auths")
89
- import_module("edc_dashboard.auths")
90
- import_module("edc_data_manager.auths")
91
- import_module("edc_qareports.auths")
92
- import_module("edc_export.auths")
93
- import_module("edc_lab.auths")
94
- import_module("edc_lab_dashboard.auths")
95
- import_module("edc_review_dashboard.auths")
96
- import_module("edc_subject_dashboard.auths")
97
- import_module("edc_navbar.auths")
98
- import_module("edc_pharmacy.auths")
99
- import_module("edc_screening.auths")
100
- import_module("edc_qol.auths")
101
- import_module("edc_mnsi.auths")
102
- import_module("edc_unblinding.auths")
103
- import_module("edc_randomization.auths")
104
- import_module("meta_auth.auths")
105
- AuthUpdater(verbose=False)
106
-
107
- def setUp(self):
108
- self.user = User.objects.create_superuser("user_login", "u@example.com", "pass")
109
-
110
- def login(self, **kwargs):
111
- return login(self, redirect_url="home_url", **kwargs)
112
-
113
- @tag("webtest")
114
- def test_login(self):
115
- self.login(superuser=False, roles=[STAFF_ROLE])
116
-
117
- @tag("webtest")
118
- def test_ae(self):
119
- self.login(superuser=False, roles={STAFF_ROLE, AE_ROLE, TMG_ROLE})
120
- response = self.app.get(reverse("meta_ae:home_url"), user=self.user, status=302)
121
- response = response.follow()
122
- self.assertIn("META Adverse Events", response)
123
- self.app.get(reverse("edc_adverse_event:ae_home_url"), user=self.user, status=200)
124
- self.app.get(reverse("edc_adverse_event:tmg_home_url"), user=self.user, status=200)
125
-
126
- @skip("test_home_everyone")
127
- def test_home_everyone(self):
128
- self.login(superuser=False, roles=[STAFF_ROLE])
129
- response = self.app.get(reverse("home_url"), user=self.user, status=200)
130
- self.assertNotIn("Screening", response)
131
- self.assertNotIn("Subjects", response)
132
- self.assertNotIn("Specimens", response)
133
- self.assertNotIn("Adverse events", response)
134
- self.assertNotIn("Pharmacy", response)
135
- self.assertNotIn("Action items", response)
136
- self.assertNotIn("Export data", response)
137
- self.assertNotIn("Synchronization", response)
138
-
139
- self.assertIn("Switch sites", response)
140
- self.assertIn("Log out", response)
141
-
142
- @tag("webtest1")
143
- def test_home_auditor(self):
144
- self.login(superuser=False, roles=[STAFF_ROLE, AUDITOR_ROLE])
145
- response = self.app.get(reverse("home_url"), user=self.user, status=200)
146
- self.assertNotIn("Pharmacy", response)
147
- self.assertNotIn("Export data", response)
148
- self.assertNotIn("Synchronization", response)
149
-
150
- self.assertIn("Screening", response)
151
- self.assertIn("Subjects", response)
152
- self.assertIn("Specimens", response)
153
- self.assertIn("Adverse events", response)
154
- self.assertIn("TMG Reports", response)
155
- self.assertIn("Switch sites", response)
156
- self.assertIn("Log out", response)
157
-
158
- response = response.click(linkid="home_list_group_aetmg")
159
- self.assertIn("TMG Reports", response)
160
-
161
- @tag("webtest")
162
- def test_home_clinic(self):
163
- self.login(superuser=False, roles=[STAFF_ROLE, CLINICIAN_ROLE])
164
- response = self.app.get(reverse("home_url"), user=self.user, status=200)
165
- self.assertIn("Screening", response)
166
- self.assertIn("Subjects", response)
167
- self.assertIn("Specimens", response)
168
- self.assertIn("Adverse events", response)
169
- self.assertNotIn("TMG Reports", response)
170
- self.assertNotIn("Pharmacy", response)
171
- self.assertIn("Action items", response)
172
- self.assertNotIn("Export data", response)
173
- self.assertIn("Switch sites", response)
174
- self.assertIn("Log out", response)
175
-
176
- @skip("test_home_export")
177
- def test_home_export(self):
178
- self.login(superuser=False, roles=[STAFF_ROLE, DATA_EXPORTER_ROLE])
179
- response = self.app.get(reverse("home_url"), user=self.user, status=200)
180
- self.assertNotIn("Screening", response)
181
- self.assertNotIn("Subjects", response)
182
- self.assertNotIn("Specimens", response)
183
- self.assertNotIn("Adverse events", response)
184
- self.assertNotIn("TMG Reports", response)
185
- self.assertNotIn("Pharmacy", response)
186
- self.assertNotIn("Action items", response)
187
- self.assertIn("Export data", response)
188
- self.assertNotIn("Synchronization", response)
189
- self.assertIn("Switch sites", response)
190
- self.assertIn("Log out", response)
191
-
192
- @skip("test_home_tmg")
193
- def test_home_tmg(self):
194
- self.login(superuser=False, roles=[STAFF_ROLE, TMG_ROLE])
195
- response = self.app.get(reverse("home_url"), user=self.user, status=200)
196
- self.assertIn("Screening", response)
197
- self.assertIn("Subjects", response)
198
- self.assertNotIn("Specimens", response)
199
- self.assertIn("Adverse events", response)
200
- self.assertIn("TMG Reports", response)
201
- self.assertNotIn("Pharmacy", response)
202
- self.assertIn("Action items", response)
203
- self.assertNotIn("Export data", response)
204
- self.assertNotIn("Synchronization", response)
205
- self.assertIn("Switch sites", response)
206
- self.assertIn("Log out", response)
207
- response = response.click(linkid="home_list_group_aetmg")
208
- self.assertIn("TMG Reports", response)
209
-
210
- @skip("test_home_lab")
211
- def test_home_lab(self):
212
- self.login(superuser=False, roles=[STAFF_ROLE, LAB_TECHNICIAN_ROLE])
213
- response = self.app.get(reverse("home_url"), user=self.user, status=200)
214
- expected_labels = ["Specimens", "Switch sites", "Log out"]
215
- for label in self.menu_labels:
216
- if label in expected_labels:
217
- self.assertIn(label, response)
218
- else:
219
- self.assertNotIn(label, response)
220
-
221
- @skip
222
- @time_machine.travel(datetime(2019, 6, 11, 8, 00, tzinfo=ZoneInfo("UTC")))
223
- def test_screening_form_phase3(self):
224
- self.login(superuser=False, roles=[STAFF_ROLE, CLINICIAN_ROLE])
225
- site_randomizers._registry = {}
226
- site_randomizers.loaded = False
227
- site_randomizers.register(RandomizerPhaseThree)
228
- register_admin()
229
-
230
- part_one_data = deepcopy(get_part_one_eligible_options())
231
- part_one_data["report_datetime"] = get_utcnow()
232
- part_one_data.update(
233
- dict(
234
- report_datetime_0=part_one_data["report_datetime"].strftime("%Y-%m-%d"),
235
- report_datetime_1=part_one_data["report_datetime"].strftime("%H:%M"),
236
- continue_part_two=YES,
237
- site=Site.objects.get(id=settings.SITE_ID).id,
238
- )
239
- )
240
- (
241
- home_page,
242
- add_screening_part_two,
243
- screening_identifier,
244
- ) = self.webtest_for_screening_form_part_one(part_one_data)
245
-
246
- # travel 10 min into the future
247
- traveller = time_machine.travel(
248
- part_one_data["report_datetime"] + relativedelta(minutes=10)
249
- )
250
- traveller.start()
251
- part_two_data = deepcopy(
252
- get_part_two_eligible_options(
253
- report_datetime=get_utcnow() + relativedelta(minutes=1)
254
- )
255
- )
256
- part_two_data["appt_datetime"] = get_utcnow() + relativedelta(days=10)
257
- part_two_data.update(
258
- dict(
259
- part_two_report_datetime_0=part_two_data["part_two_report_datetime"].strftime(
260
- "%Y-%m-%d"
261
- ),
262
- part_two_report_datetime_1=part_two_data["part_two_report_datetime"].strftime(
263
- "%H:%M"
264
- ),
265
- appt_datetime_0=part_two_data["appt_datetime"].strftime("%Y-%m-%d"),
266
- appt_datetime_1=part_two_data["appt_datetime"].strftime("%H:%M"),
267
- )
268
- )
269
- (
270
- home_page,
271
- add_screening_part_three,
272
- screening_identifier,
273
- ) = self.webtest_for_screening_form_part_two(
274
- home_page, add_screening_part_two, screening_identifier, part_two_data
275
- )
276
- traveller.stop()
277
-
278
- # travel 10 days into the future
279
- traveller = time_machine.travel(part_two_data["appt_datetime"])
280
- traveller.start()
281
- part_three_data = deepcopy(
282
- get_part_three_eligible_options(report_datetime=get_utcnow())
283
- )
284
-
285
- traveller = time_machine.travel(part_two_data.get("part_three_report_datetime"))
286
- traveller.start()
287
- part_three_data.update(
288
- hba1c_datetime=part_three_data.get("part_three_report_datetime")
289
- )
290
- hba1c_datetime = part_three_data.get("hba1c_datetime")
291
- fbg_datetime = part_three_data.get("fbg_datetime")
292
- ogtt_datetime = part_three_data.get("ogtt_datetime")
293
- part_three_data.update(
294
- dict(
295
- part_three_report_datetime_0=part_three_data.get(
296
- "part_three_report_datetime"
297
- ).strftime("%Y-%m-%d"),
298
- part_three_report_datetime_1=part_three_data.get(
299
- "part_three_report_datetime"
300
- ).strftime("%H:%M"),
301
- fbg_datetime_0=fbg_datetime.strftime("%Y-%m-%d"),
302
- fbg_datetime_1=fbg_datetime.strftime("%H:%M"),
303
- ogtt_datetime_0=ogtt_datetime.strftime("%Y-%m-%d"),
304
- ogtt_datetime_1=ogtt_datetime.strftime("%H:%M"),
305
- hba1c_datetime_0=hba1c_datetime.strftime("%Y-%m-%d"),
306
- hba1c_datetime_1=hba1c_datetime.strftime("%H:%M"),
307
- )
308
- )
309
- (
310
- screening_listboard_page,
311
- screening_identifier,
312
- ) = self.webtest_for_screening_form_part_three(
313
- home_page, add_screening_part_three, screening_identifier, part_three_data
314
- )
315
- self.assertIn(screening_identifier, screening_listboard_page)
316
- self.assertIn("Consent", screening_listboard_page)
317
-
318
- def webtest_for_screening_form_part_one(self, part_one_data):
319
- home_page = self.app.get(reverse("home_url"), user=self.user, status=200)
320
- screening_listboard_page = home_page.click(description="Screening", index=1)
321
- add_screening_page = screening_listboard_page.click(
322
- description="Add Subject Screening"
323
- )
324
- # submit blank form
325
- response = add_screening_page.forms.get("screeningpartone_form").submit()
326
- self.assertIn("Please correct the errors below", response)
327
- # submit completed form
328
- for field, _ in add_screening_page.forms.get("screeningpartone_form").fields.items():
329
- try:
330
- add_screening_page.forms.get("screeningpartone_form")[field] = part_one_data[
331
- field
332
- ]
333
- except KeyError as e:
334
- print(f"{field}. Got {e}.")
335
- page = add_screening_page.forms.get("screeningpartone_form").submit()
336
- soup = BeautifulSoup(page.content, "html.parser")
337
- errorlist = soup.find_all("ul", "errorlist")
338
- self.assertEqual([], errorlist)
339
-
340
- # redirects back to listboard
341
- url = reverse(screening_listboard_url)
342
- self.assertRedirects(page, url)
343
-
344
- # new screened subject is available
345
- obj = SubjectScreening.objects.all().last()
346
- screening_listboard_page = home_page.click(description="Screening", index=1)
347
- self.assertIn(obj.screening_identifier, screening_listboard_page)
348
-
349
- # shows P1 | P2 | P3 | PENDING
350
- self.assertIn("PENDING", screening_listboard_page)
351
- add_screening_part_two = screening_listboard_page.click(description="P2", index=0)
352
- self.assertEqual(add_screening_part_two.status_code, 200)
353
- return home_page, add_screening_part_two, obj.screening_identifier
354
-
355
- def webtest_for_screening_form_part_two(
356
- self, home_page, add_screening_part_two, screening_identifier, part_two_data
357
- ):
358
- # submit completed form
359
- for field, _ in add_screening_part_two.forms.get(
360
- "screeningparttwo_form"
361
- ).fields.items():
362
- try:
363
- add_screening_part_two.forms.get("screeningparttwo_form")[field] = (
364
- part_two_data[field]
365
- )
366
- except KeyError:
367
- print(field)
368
- page = add_screening_part_two.forms.get("screeningparttwo_form").submit()
369
- soup = BeautifulSoup(page.content, "html.parser")
370
- errorlist = soup.find_all("ul", "errorlist")
371
- self.assertEqual([], errorlist)
372
- # redirects back to listboard
373
- obj = SubjectScreening.objects.get(screening_identifier=screening_identifier)
374
- url = reverse(screening_listboard_url, args=(obj.screening_identifier,))
375
- self.assertRedirects(page, url)
376
- # shows P1 | P2 | P3 | PENDING
377
- screening_listboard_page = home_page.click(description="Screening", index=1)
378
- self.assertIn("PENDING", screening_listboard_page)
379
- add_screening_part_three = screening_listboard_page.click(description="P3", index=0)
380
- self.assertEqual(add_screening_part_three.status_code, 200)
381
- return home_page, add_screening_part_three, screening_identifier
382
-
383
- def webtest_for_screening_form_part_three(
384
- self, home_page, add_screening_part_three, screening_identifier, part_three_data
385
- ):
386
- # submit completed form
387
- for field, _ in add_screening_part_three.forms.get(
388
- "screeningpartthree_form"
389
- ).fields.items():
390
- try:
391
- add_screening_part_three.forms.get("screeningpartthree_form")[field] = (
392
- part_three_data[field]
393
- )
394
- except KeyError:
395
- print(field)
396
- page = add_screening_part_three.forms.get("screeningpartthree_form").submit()
397
- soup = BeautifulSoup(page.content, "html.parser")
398
- errorlist = soup.find_all("ul", "errorlist")
399
- self.assertEqual([], errorlist)
400
- # redirects back to listboard
401
- obj = SubjectScreening.objects.all().last()
402
- url = reverse(screening_listboard_url, args=(obj.screening_identifier,))
403
- self.assertRedirects(page, url)
404
- # shows P1 | P2 | P3 | Consent
405
- screening_listboard_page = home_page.click(description="Screening", index=1)
406
- self.assertIn("Consent", screening_listboard_page)
407
- return screening_listboard_page, screening_identifier
408
-
409
- def get_subject_screening(self, **kwargs):
410
- part_one_eligible_options = deepcopy(get_part_one_eligible_options())
411
- part_two_eligible_options = deepcopy(get_part_two_eligible_options())
412
- part_three_eligible_options = deepcopy(get_part_three_eligible_options())
413
- obj = ScreeningPartOne(**part_one_eligible_options)
414
- obj.save()
415
- self.screening_identifier = obj.screening_identifier
416
- obj = ScreeningPartTwo.objects.get(screening_identifier=self.screening_identifier)
417
- for k, v in part_two_eligible_options.items():
418
- setattr(obj, k, v)
419
- obj.save()
420
- obj = ScreeningPartThree.objects.get(screening_identifier=self.screening_identifier)
421
- for k, v in part_three_eligible_options.items():
422
- setattr(obj, k, v)
423
- obj.save()
424
- return obj
425
-
426
- @tag("webtest3")
427
- @skip("-")
428
- def test_to_subject_dashboard(self):
429
- add_or_update_django_sites(apps=django_apps, single_sites=all_sites)
430
- self.login(superuser=False, roles=[STAFF_ROLE, CLINICIAN_ROLE], sites=[10, 20, 30])
431
-
432
- subject_screening = self.get_subject_screening()
433
-
434
- home_page = self.app.get(reverse("home_url"), user=self.user, status=200)
435
- screening_listboard_page = home_page.click(description="Screening", index=1)
436
-
437
- add_subjectconsent_page = screening_listboard_page.click(
438
- description="Consent", index=1
439
- )
440
- # submit blank form
441
- response = add_subjectconsent_page.form.submit()
442
- self.assertIn("Please correct the errors below", response)
443
-
444
- consents = site_consents.get_consents_by_model("meta_consent.subjectconsentv1")
445
- consent_datetime = consents[0].start + relativedelta(months=1)
446
- subject_consent = baker.make_recipe(
447
- "meta_consent.subjectconsentv1",
448
- screening_identifier=subject_screening.screening_identifier,
449
- dob=(
450
- consent_datetime - relativedelta(years=subject_screening.age_in_years)
451
- ).date(),
452
- first_name="Melissa",
453
- last_name="Rodriguez",
454
- initials="MR",
455
- consent_datetime=consent_datetime,
456
- )
457
-
458
- home_page = self.app.get(reverse("home_url"), user=self.user, status=200)
459
- screening_listboard_page = home_page.click(description="Screening", index=1)
460
-
461
- self.assertIn("Dashboard", screening_listboard_page)
462
- self.assertIn(
463
- f"subjectscreening_change_{subject_screening.screening_identifier}",
464
- screening_listboard_page,
465
- )
466
-
467
- home_page = self.app.get(reverse("home_url"), user=self.user, status=200)
468
- subject_listboard_page = home_page.click(description="Subjects", index=1)
469
-
470
- self.assertIn(subject_consent.subject_identifier, subject_listboard_page)
471
-
472
- href = reverse(
473
- "meta_dashboard:subject_dashboard_url",
474
- kwargs={"subject_identifier": subject_consent.subject_identifier},
475
- )
476
- subject_dashboard_page = subject_listboard_page.click(href=href)
477
-
478
- self.assertEqual(subject_dashboard_page.status_code, 200)
479
-
480
- # on subject_dashboard
481
- # assert all appointment are showing
482
- subject_identifier = subject_consent.subject_identifier
483
- appointments = Appointment.objects.filter(
484
- subject_identifier=subject_identifier
485
- ).order_by("appt_datetime")
486
- for appointment in appointments:
487
- self.assertIn(appointment.visit_code, subject_dashboard_page)
488
-
489
- # start appointment 1000
490
- page = subject_dashboard_page.click(linkid="start_btn_1000_0")
491
- page.form["appt_status"] = IN_PROGRESS_APPT
492
- page.form["appt_reason"] = SCHEDULED_APPT
493
- subject_dashboard_page = page.form.submit()
494
- self.assertEqual(subject_dashboard_page.status_code, 302)
495
- self.assertEqual(
496
- subject_dashboard_page.url,
497
- f"/subject/subject_dashboard/{subject_identifier}/",
498
- )
499
-
500
- subject_dashboard_page = self.app.get(
501
- subject_dashboard_page.url, user=self.user, status=200
502
- )
503
-
504
- # start visit 1000
505
- self.assertIn(" Start ", subject_dashboard_page)
506
- subject_visit_page = subject_dashboard_page.click(
507
- linkid=(
508
- f"start_btn_{appointments[0].visit_code}_"
509
- f"{appointments[0].visit_code_sequence}"
510
- )
511
- )
512
- subject_visit_page.form["info_source"] = "patient"
513
- subject_dashboard_page = subject_visit_page.form.submit()
514
-
515
- url = f"/subject/subject_dashboard/{subject_identifier}/" f"{str(appointments[0].pk)}/"
516
- self.assertEqual(subject_dashboard_page.status_code, 302)
517
- self.assertEqual(subject_dashboard_page.url, url)
518
-
519
- subject_dashboard_page = self.app.get(
520
- reverse(
521
- "meta_dashboard:subject_dashboard_url",
522
- kwargs=dict(
523
- subject_identifier=subject_identifier,
524
- appointment=str(appointments[0].id),
525
- ),
526
- ),
527
- user=self.user,
528
- status=200,
529
- )
530
-
531
- self.assertIn("CRFs", subject_dashboard_page)
532
- self.assertIn("Requisitions", subject_dashboard_page)
533
-
534
- @tag("webtest")
535
- def test_follow_urls(self):
536
- """Follows any url that can be reversed without kwargs."""
537
- self.login(superuser=False, roles=[CLINICIAN_ROLE])
538
- for url_name in url_names.registry.values():
539
- sys.stdout.write(style.MIGRATE_HEADING(f" - '{url_name}' ...\r"))
540
- try:
541
- url = reverse(url_name)
542
- except NoReverseMatch:
543
- sys.stdout.write(
544
- style.ERROR(
545
- f" - '{url_name}'. Got `NoReverseMatch` "
546
- f"when reversed without kwargs.\n"
547
- )
548
- )
549
- else:
550
- try:
551
- self.app.get(url, user=self.user, status=200)
552
- except AppError as e:
553
- sys.stdout.write(style.ERROR(f" - '{url_name}'. Got `AppError`: {e}\n"))
554
- else:
555
- sys.stdout.write(style.SUCCESS(f" - '{url_name}'->{url}\n"))