meta-edc 0.3.7__py3-none-any.whl → 0.3.50__py3-none-any.whl

Sign up to get free protection for your applications and to get access to all the features.
Files changed (411) hide show
  1. meta_ae/action_items.py +2 -2
  2. meta_ae/migrations/0017_auto_20221130_2257.py +12 -7
  3. meta_ae/tests/holidays.csv +1 -1
  4. meta_analytics/README.rst +17 -0
  5. meta_analytics/dataframes/__init__.py +19 -0
  6. meta_analytics/dataframes/constants.py +33 -0
  7. meta_analytics/dataframes/enrolled/__init__.py +1 -0
  8. meta_analytics/dataframes/enrolled/get_glucose_df.py +122 -0
  9. meta_analytics/dataframes/get_eos_df.py +26 -0
  10. meta_analytics/dataframes/get_last_imp_visits_df.py +101 -0
  11. meta_analytics/dataframes/glucose_endpoints/__init__.py +2 -0
  12. meta_analytics/dataframes/glucose_endpoints/endpoint_by_date.py +183 -0
  13. meta_analytics/dataframes/glucose_endpoints/glucose_endpoints_by_date.py +531 -0
  14. meta_analytics/dataframes/screening/__init__.py +2 -0
  15. meta_analytics/dataframes/screening/get_glucose_tested_only_df.py +20 -0
  16. meta_analytics/dataframes/screening/get_screening_df.py +163 -0
  17. meta_analytics/dataframes/utils.py +65 -0
  18. meta_analytics/get_tables.py +81 -0
  19. meta_analytics/tables/__init__.py +2 -0
  20. meta_analytics/tables/eligible.py +106 -0
  21. meta_analytics/tables/enrolled/__init__.py +0 -0
  22. meta_analytics/tables/enrolled/glucose.py +28 -0
  23. meta_analytics/tables/has_dm.py +61 -0
  24. meta_analytics/tests/__init__.py +0 -0
  25. meta_analytics/tests/test_endpoints_by_date.py +94 -0
  26. meta_auth/auth_objects.py +32 -3
  27. meta_auth/auths.py +18 -3
  28. meta_consent/action_items.py +18 -1
  29. meta_consent/admin/__init__.py +1 -0
  30. meta_consent/admin/subject_consent_v1_ext_admin.py +45 -0
  31. meta_consent/baker_recipes.py +5 -4
  32. meta_consent/consents.py +21 -2
  33. meta_consent/constants.py +1 -0
  34. meta_consent/forms/__init__.py +1 -0
  35. meta_consent/forms/subject_consent_v1_ext_form.py +16 -0
  36. meta_consent/locale/lg/LC_MESSAGES/django.po +69 -0
  37. meta_consent/locale/sw/LC_MESSAGES/django.po +12 -12
  38. meta_consent/migrations/0025_alter_historicalsubjectconsent_first_name_and_more.py +151 -0
  39. meta_consent/migrations/0026_historicalsubjectconsentv1ext_subjectconsentv1ext.py +544 -0
  40. meta_consent/migrations/0027_auto_20250111_0344.py +30 -0
  41. meta_consent/models/__init__.py +1 -0
  42. meta_consent/models/signals.py +34 -13
  43. meta_consent/models/subject_consent_v1.py +1 -3
  44. meta_consent/models/subject_consent_v1_ext.py +29 -0
  45. meta_consent/tests/holidays.csv +1 -1
  46. meta_consent/tests/tests/test_form_validators.py +1 -1
  47. meta_dashboard/locale/lg/LC_MESSAGES/django.po +30 -0
  48. meta_dashboard/locale/sw/LC_MESSAGES/django.po +11 -2
  49. meta_dashboard/navbars.py +3 -1
  50. meta_dashboard/templates/meta_dashboard/bootstrap3/buttons/eligibility_button.html +1 -1
  51. meta_dashboard/templates/meta_dashboard/bootstrap3/buttons/screening_button.html +1 -1
  52. meta_dashboard/templates/meta_dashboard/bootstrap3/screening/listboard.html +4 -4
  53. meta_dashboard/templates/meta_dashboard/bootstrap3/subject/dashboard/sidebar.html +24 -0
  54. meta_dashboard/templates/meta_dashboard/bootstrap3/subject/dashboard.html +3 -0
  55. meta_dashboard/templates/meta_dashboard/bootstrap3/subject/listboard.html +1 -2
  56. meta_dashboard/templatetags/meta_dashboard_extras.py +1 -1
  57. meta_dashboard/tests/holidays.csv +1 -1
  58. meta_dashboard/tests/urls.py +0 -1
  59. meta_dashboard/view_utils/__init__.py +6 -0
  60. meta_dashboard/view_utils/subject_screening_button.py +2 -2
  61. meta_dashboard/views/subject/dashboard/dashboard_view.py +38 -0
  62. meta_edc/__init__.py +7 -0
  63. meta_edc/celery.py +4 -13
  64. meta_edc/celery_live.py +18 -0
  65. meta_edc/celery_uat.py +24 -0
  66. meta_edc/management/commands/update_forms_reference.py +6 -2
  67. meta_edc/migrations/__init__.py +0 -0
  68. meta_edc/navbars.py +2 -1
  69. meta_edc/settings/debug.py +17 -9
  70. meta_edc/settings/defaults.py +82 -60
  71. meta_edc/settings/live.py +1 -9
  72. meta_edc/settings/uat.py +1 -14
  73. meta_edc/templates/meta_edc/bootstrap3/home.html +13 -7
  74. meta_edc/tests/tests/test_endpoints.py +22 -19
  75. meta_edc/urls.py +5 -2
  76. meta_edc/wsgi.py +1 -1
  77. meta_edc/wsgi_live.py +1 -1
  78. meta_edc/wsgi_uat.py +1 -1
  79. meta_edc-0.3.50.dist-info/AUTHORS +0 -0
  80. meta_edc-0.3.50.dist-info/METADATA +766 -0
  81. {meta_edc-0.3.7.dist-info → meta_edc-0.3.50.dist-info}/RECORD +400 -157
  82. {meta_edc-0.3.7.dist-info → meta_edc-0.3.50.dist-info}/WHEEL +1 -1
  83. {meta_edc-0.3.7.dist-info → meta_edc-0.3.50.dist-info}/top_level.txt +1 -0
  84. meta_pharmacy/admin/__init__.py +2 -0
  85. meta_pharmacy/admin/rx_admin.py +75 -0
  86. meta_pharmacy/admin/substitutions_admin.py +67 -0
  87. meta_pharmacy/admin_site.py +9 -0
  88. meta_pharmacy/apps.py +5 -0
  89. meta_pharmacy/constants.py +10 -0
  90. meta_pharmacy/forms/__init__.py +2 -0
  91. meta_pharmacy/forms/rx_form.py +16 -0
  92. meta_pharmacy/forms/substitutions_form.py +54 -0
  93. meta_pharmacy/label_configs.py +30 -0
  94. meta_pharmacy/labels/__init__.py +5 -0
  95. meta_pharmacy/labels/draw_label_for_subject_with_barcode.py +62 -0
  96. meta_pharmacy/labels/draw_label_for_subject_with_code128.py +14 -0
  97. meta_pharmacy/labels/draw_label_with_test_data.py +26 -0
  98. meta_pharmacy/labels/label_data.py +14 -0
  99. meta_pharmacy/labels/print_sheets.py +97 -0
  100. meta_pharmacy/list_data.py +8 -0
  101. meta_pharmacy/management/__init__.py +0 -0
  102. meta_pharmacy/management/commands/__init__.py +0 -0
  103. meta_pharmacy/management/commands/update_initial_pharmacy_data.py +10 -0
  104. meta_pharmacy/migrations/0002_initial.py +695 -0
  105. meta_pharmacy/migrations/0003_auto_20240909_2335.py +64 -0
  106. meta_pharmacy/migrations/0004_alter_historicalsubstitutions_report_datetime_and_more.py +23 -0
  107. meta_pharmacy/migrations/0005_auto_20240911_0352.py +17 -0
  108. meta_pharmacy/migrations/0006_lotnumber_label.py +289 -0
  109. meta_pharmacy/migrations/0007_lotnumber_medication.py +24 -0
  110. meta_pharmacy/migrations/0008_remove_lotnumber_medication_and_more.py +390 -0
  111. meta_pharmacy/migrations/0009_remove_historicalrx_slug.py +17 -0
  112. meta_pharmacy/models/__init__.py +3 -0
  113. meta_pharmacy/models/label_data.py +38 -0
  114. meta_pharmacy/models/rx.py +18 -0
  115. meta_pharmacy/models/rx_label.py +39 -0
  116. meta_pharmacy/models/substitutions.py +88 -0
  117. meta_pharmacy/urls.py +8 -0
  118. meta_pharmacy/utils/__init__.py +1 -0
  119. meta_pharmacy/utils/update_initial_pharmacy_data.py +146 -0
  120. meta_prn/action_items.py +52 -2
  121. meta_prn/admin/__init__.py +3 -0
  122. meta_prn/admin/dm_referral_admin.py +49 -0
  123. meta_prn/admin/offschedule_dm_referral_admin.py +47 -0
  124. meta_prn/admin/onschedule_dm_referral_admin.py +39 -0
  125. meta_prn/admin/pregnancy_notification_admin.py +6 -2
  126. meta_prn/baker_recipes.py +8 -1
  127. meta_prn/choices.py +2 -1
  128. meta_prn/constants.py +4 -1
  129. meta_prn/forms/__init__.py +2 -0
  130. meta_prn/forms/dm_referral_form.py +40 -0
  131. meta_prn/forms/offschedule_dm_referral_form.py +35 -0
  132. meta_prn/forms/offschedule_form.py +6 -0
  133. meta_prn/migrations/0034_auto_20220630_1110.py +3 -3
  134. meta_prn/migrations/0035_auto_20220630_1140.py +59 -56
  135. meta_prn/migrations/0057_historicalonscheduledmreferral_and_more.py +1156 -0
  136. meta_prn/migrations/0058_dmreferral_referral_note_and_more.py +29 -0
  137. meta_prn/migrations/0059_alter_historicaloffstudymedication_reason_and_more.py +53 -0
  138. meta_prn/models/__init__.py +13 -2
  139. meta_prn/models/dm_referral.py +39 -0
  140. meta_prn/models/offschedule.py +15 -1
  141. meta_prn/models/onschedule.py +6 -0
  142. meta_prn/models/signals.py +41 -1
  143. meta_prn/tests/tests/test_dm_referral.py +203 -0
  144. meta_reports/__init__.py +1 -0
  145. meta_reports/admin/__init__.py +15 -0
  146. meta_reports/admin/dbviews/__init__.py +14 -0
  147. meta_reports/admin/dbviews/glucose_summary_admin.py +116 -0
  148. meta_reports/admin/dbviews/imp_substitutions_admin.py +101 -0
  149. meta_reports/admin/dbviews/missing_screening_ogtt_admin/__init__.py +2 -0
  150. meta_reports/admin/dbviews/missing_screening_ogtt_admin/note_model_admin.py +53 -0
  151. meta_reports/admin/dbviews/missing_screening_ogtt_admin/unmanaged_model_admin.py +84 -0
  152. meta_reports/admin/dbviews/on_study_missing_lab_values_admin/__init__.py +1 -0
  153. meta_reports/admin/dbviews/on_study_missing_lab_values_admin/unmanaged_model_admin.py +13 -0
  154. meta_reports/admin/dbviews/on_study_missing_values_admin/__init__.py +1 -0
  155. meta_reports/admin/dbviews/on_study_missing_values_admin/unmanaged_model_admin.py +13 -0
  156. meta_reports/admin/dbviews/patient_history_missing_baseline_cd4_admin.py +58 -0
  157. meta_reports/admin/dbviews/unattended_three_in_row2_admin.py +47 -0
  158. meta_reports/admin/dbviews/unattended_three_in_row_admin.py +35 -0
  159. meta_reports/admin/dbviews/unattended_two_in_row_admin.py +34 -0
  160. meta_reports/admin/endpoints_admin.py +14 -0
  161. meta_reports/admin/endpoints_all_admin.py +13 -0
  162. meta_reports/admin/last_imp_refill_admin.py +181 -0
  163. meta_reports/admin/list_filters.py +30 -0
  164. meta_reports/admin/modeladmin_mixins.py +112 -0
  165. meta_reports/admin_site.py +5 -0
  166. meta_reports/apps.py +1 -16
  167. meta_reports/forms/__init__.py +1 -0
  168. meta_reports/forms/missing_ogtt_note_form.py +33 -0
  169. meta_reports/management/__init__.py +0 -0
  170. meta_reports/management/commands/__init__.py +0 -0
  171. meta_reports/management/commands/generate_endpoints.py +13 -0
  172. meta_reports/migrations/0001_initial.py +87 -0
  173. meta_reports/migrations/0002_patienthistorymissingbaselinecd4_and_more.py +64 -0
  174. meta_reports/migrations/0003_auto_20240618_0505.py +12 -0
  175. meta_reports/migrations/0004_alter_patienthistorymissingbaselinecd4_table.py +17 -0
  176. meta_reports/migrations/0005_endpoints.py +47 -0
  177. meta_reports/migrations/0006_endpoints_baseline_datetime.py +18 -0
  178. meta_reports/migrations/0007_alter_endpoints_endpoint_label_and_more.py +43 -0
  179. meta_reports/migrations/0008_alter_endpoints_endpoint_label.py +18 -0
  180. meta_reports/migrations/0009_alter_endpoints_options.py +21 -0
  181. meta_reports/migrations/0010_alter_patienthistorymissingbaselinecd4_options_and_more.py +49 -0
  182. meta_reports/migrations/0011_auto_20240813_0156.py +54 -0
  183. meta_reports/migrations/0012_auto_20240813_1516.py +48 -0
  184. meta_reports/migrations/0013_auto_20240813_1516.py +48 -0
  185. meta_reports/migrations/0014_auto_20240813_1517.py +48 -0
  186. meta_reports/migrations/0015_alter_endpoints_site.py +22 -0
  187. meta_reports/migrations/0016_missingscreeningogtt.py +47 -0
  188. meta_reports/migrations/0017_auto_20240819_1711.py +166 -0
  189. meta_reports/migrations/0018_auto_20240819_1713.py +54 -0
  190. meta_reports/migrations/0019_auto_20240819_1721.py +54 -0
  191. meta_reports/migrations/0020_auto_20240819_1811.py +54 -0
  192. meta_reports/migrations/0021_auto_20240819_1817.py +54 -0
  193. meta_reports/migrations/0022_auto_20240819_1832.py +54 -0
  194. meta_reports/migrations/0023_endpoints_meta_report_subject_a56b22_idx.py +20 -0
  195. meta_reports/migrations/0024_glucosesummary.py +38 -0
  196. meta_reports/migrations/0025_auto_20240822_0115.py +87 -0
  197. meta_reports/migrations/0026_auto_20240822_0120.py +54 -0
  198. meta_reports/migrations/0027_auto_20240822_0140.py +54 -0
  199. meta_reports/migrations/0028_alter_glucosesummary_options.py +22 -0
  200. meta_reports/migrations/0029_auto_20240822_0149.py +54 -0
  201. meta_reports/migrations/0030_auto_20240822_1637.py +54 -0
  202. meta_reports/migrations/0031_endpointsproxy.py +25 -0
  203. meta_reports/migrations/0032_alter_endpointsproxy_options.py +21 -0
  204. meta_reports/migrations/0033_auto_20240823_0012.py +54 -0
  205. meta_reports/migrations/0034_auto_20240823_1642.py +54 -0
  206. meta_reports/migrations/0035_historicalmissingogttnote_missingogttnote.py +457 -0
  207. meta_reports/migrations/0036_historicalmissingogttnote_fasting_and_more.py +86 -0
  208. meta_reports/migrations/0037_historicalmissingogttnote_result_status_and_more.py +51 -0
  209. meta_reports/migrations/0038_alter_historicalmissingogttnote_fasting_and_more.py +33 -0
  210. meta_reports/migrations/0039_onstudymissingvalues.py +44 -0
  211. meta_reports/migrations/0040_auto_20240824_0412.py +282 -0
  212. meta_reports/migrations/0041_auto_20240828_2229.py +14 -0
  213. meta_reports/migrations/0042_onstudymissinglabvalues.py +43 -0
  214. meta_reports/migrations/0043_auto_20240828_2309.py +88 -0
  215. meta_reports/migrations/0044_auto_20240828_2323.py +93 -0
  216. meta_reports/migrations/0045_auto_20240829_0248.py +54 -0
  217. meta_reports/migrations/0046_auto_20240829_0250.py +54 -0
  218. meta_reports/migrations/0047_impsubstitutions.py +56 -0
  219. meta_reports/migrations/0048_auto_20240909_2338.py +48 -0
  220. meta_reports/migrations/0049_auto_20240911_0327.py +54 -0
  221. meta_reports/migrations/0050_alter_endpoints_created.py +19 -0
  222. meta_reports/migrations/0051_remove_endpoints_baseline_datetime_and_more.py +40 -0
  223. meta_reports/migrations/0052_lastimpvisit.py +57 -0
  224. meta_reports/migrations/0053_rename_lastimpvisit_lastimprefill_and_more.py +31 -0
  225. meta_reports/models/__init__.py +16 -0
  226. meta_reports/models/dbviews/README +14 -0
  227. meta_reports/models/dbviews/__init__.py +9 -0
  228. meta_reports/models/dbviews/glucose_summary/__init__.py +2 -0
  229. meta_reports/models/dbviews/glucose_summary/unmanaged_model.py +35 -0
  230. meta_reports/models/dbviews/glucose_summary/view_definition.py +28 -0
  231. meta_reports/models/dbviews/imp_substitutions/__init__.py +1 -0
  232. meta_reports/models/dbviews/imp_substitutions/unmanaged_model.py +41 -0
  233. meta_reports/models/dbviews/imp_substitutions/view_definition.py +21 -0
  234. meta_reports/models/dbviews/missing_screening_ogtt/__init__.py +2 -0
  235. meta_reports/models/dbviews/missing_screening_ogtt/note_model.py +57 -0
  236. meta_reports/models/dbviews/missing_screening_ogtt/unmanaged_model.py +41 -0
  237. meta_reports/models/dbviews/missing_screening_ogtt/view_definition.py +20 -0
  238. meta_reports/models/dbviews/on_study_missing_lab_values/__init__.py +1 -0
  239. meta_reports/models/dbviews/on_study_missing_lab_values/qa_cases.py +53 -0
  240. meta_reports/models/dbviews/on_study_missing_lab_values/unmanged_model.py +20 -0
  241. meta_reports/models/dbviews/on_study_missing_lab_values/view_definition.py +17 -0
  242. meta_reports/models/dbviews/on_study_missing_values/__init__.py +1 -0
  243. meta_reports/models/dbviews/on_study_missing_values/qa_cases.py +54 -0
  244. meta_reports/models/dbviews/on_study_missing_values/unmanged_model.py +20 -0
  245. meta_reports/models/dbviews/on_study_missing_values/view_definition.py +17 -0
  246. meta_reports/models/dbviews/patient_history_missing_baseline_cd4/__init__.py +1 -0
  247. meta_reports/models/dbviews/patient_history_missing_baseline_cd4/unmanaged_model.py +31 -0
  248. meta_reports/models/dbviews/patient_history_missing_baseline_cd4/view_definition.py +21 -0
  249. meta_reports/models/dbviews/unattended_three_in_row/__init__.py +1 -0
  250. meta_reports/models/dbviews/unattended_three_in_row/unmanaged_model.py +29 -0
  251. meta_reports/models/dbviews/unattended_three_in_row/view_definition.py +31 -0
  252. meta_reports/models/dbviews/unattended_three_in_row2/__init__.py +1 -0
  253. meta_reports/models/dbviews/unattended_three_in_row2/unmanaged_model.py +29 -0
  254. meta_reports/models/dbviews/unattended_three_in_row2/view_definition.py +50 -0
  255. meta_reports/models/dbviews/unattended_two_in_row/__init__.py +1 -0
  256. meta_reports/models/dbviews/unattended_two_in_row/unmanaged_model.py +27 -0
  257. meta_reports/models/dbviews/unattended_two_in_row/view_definition.py +30 -0
  258. meta_reports/models/endpoints.py +31 -0
  259. meta_reports/models/endpoints_proxy.py +11 -0
  260. meta_reports/models/last_imp_refill.py +34 -0
  261. meta_reports/tasks.py +12 -0
  262. meta_reports/templates/meta_reports/columns/subject_identifier_column.html +1 -0
  263. meta_reports/templates/meta_reports/endpoints_all_change_list_note.html +12 -0
  264. meta_reports/templates/meta_reports/endpoints_change_list_note.html +12 -0
  265. meta_reports/tests/test_sql_gen.py +5 -0
  266. meta_reports/urls.py +8 -0
  267. meta_reports/utils.py +0 -0
  268. meta_screening/admin/subject_screening_admin.py +1 -0
  269. meta_screening/form_validators/screening_part_two.py +1 -1
  270. meta_screening/migrations/0062_remove_icpreferral_site_and_more.py +27 -0
  271. meta_screening/migrations/0063_alter_historicalscreeningpartone_fasting_duration_str_and_more.py +184 -0
  272. meta_screening/migrations/0064_remove_historicalscreeningpartone_fasting_duration_minutes_and_more.py +126 -0
  273. meta_screening/migrations/0065_auto_20240516_0352.py +31 -0
  274. meta_screening/migrations/0066_alter_historicalscreeningpartone_fasting_duration_delta_and_more.py +103 -0
  275. meta_screening/migrations/0067_alter_historicalscreeningpartone_report_datetime_and_more.py +84 -0
  276. meta_screening/models/__init__.py +1 -1
  277. meta_screening/tests/holidays.csv +1 -1
  278. meta_screening/tests/meta_test_case_mixin.py +17 -2
  279. meta_screening/tests/options.py +3 -3
  280. meta_sites/__init__.py +0 -1
  281. meta_sites/sites.py +8 -7
  282. meta_sites/tests/test_sites.py +1 -1
  283. meta_subject/action_items.py +25 -2
  284. meta_subject/admin/__init__.py +2 -1
  285. meta_subject/admin/birth_outcome_admin.py +4 -3
  286. meta_subject/admin/blood_results/__init__.py +1 -1
  287. meta_subject/admin/blood_results/{blood_results_lipid_admin.py → blood_results_lipids_admin.py} +7 -7
  288. meta_subject/admin/delivery_admin.py +0 -1
  289. meta_subject/admin/diabetes/__init__.py +2 -0
  290. meta_subject/admin/diabetes/dm_endpoint_admin.py +35 -0
  291. meta_subject/admin/{dm_referral_followup_admin.py → diabetes/dm_followup_admin.py} +15 -8
  292. meta_subject/admin/glucose_admin.py +1 -1
  293. meta_subject/admin/glucose_fbg_admin.py +38 -8
  294. meta_subject/admin/other_arv_regimens_admin.py +2 -0
  295. meta_subject/admin/study_medication_admin.py +10 -0
  296. meta_subject/admin/subject_visit_admin.py +4 -1
  297. meta_subject/baker_recipes.py +6 -0
  298. meta_subject/choices.py +8 -0
  299. meta_subject/constants.py +2 -1
  300. meta_subject/form_validators/__init__.py +2 -1
  301. meta_subject/form_validators/dm_endpoint_form_validator.py +35 -0
  302. meta_subject/form_validators/{dm_referral_followup_form_validator.py → dm_followup_form_validator.py} +41 -2
  303. meta_subject/forms/__init__.py +2 -1
  304. meta_subject/forms/blood_results/__init__.py +1 -1
  305. meta_subject/forms/blood_results/{blood_results_lipid_form.py → blood_results_lipids_form.py} +5 -5
  306. meta_subject/forms/diabetes/__init__.py +2 -0
  307. meta_subject/forms/diabetes/dm_endpoint_form.py +13 -0
  308. meta_subject/forms/diabetes/dm_followup_form.py +25 -0
  309. meta_subject/forms/glucose_fbg_form.py +38 -16
  310. meta_subject/forms/study_medication_form.py +35 -0
  311. meta_subject/forms/subject_visit_form.py +16 -0
  312. meta_subject/locale/lg/LC_MESSAGES/django.po +470 -0
  313. meta_subject/locale/sw/LC_MESSAGES/django.po +191 -89
  314. meta_subject/metadata_rules/metadata_rules.py +21 -0
  315. meta_subject/metadata_rules/predicates.py +67 -8
  316. meta_subject/migrations/0107_auto_20220415_0043.py +28 -22
  317. meta_subject/migrations/0126_auto_20220719_2142.py +4 -4
  318. meta_subject/migrations/0131_auto_20220722_0411.py +28 -23
  319. meta_subject/migrations/0132_auto_20220722_1825.py +10 -6
  320. meta_subject/migrations/0135_auto_20220722_2212.py +39 -35
  321. meta_subject/migrations/0150_auto_20220914_0039.py +15 -11
  322. meta_subject/migrations/0181_dmreferralfollowup_action_identifier_and_more.py +143 -0
  323. meta_subject/migrations/0182_rename_dmreferralfollowup_dmfollowup_and_more.py +54 -0
  324. meta_subject/migrations/0183_alter_dmfollowup_on_dm_medications_and_more.py +31 -0
  325. meta_subject/migrations/0184_alter_glucose_options_and_more.py +31 -0
  326. meta_subject/migrations/0185_alter_bloodresultsins_fasting_duration_str_and_more.py +82 -0
  327. meta_subject/migrations/0186_healtheconomicsupdate_singleton_field_and_more.py +55 -0
  328. meta_subject/migrations/0187_dmdiagnosis_historicaldmdiagnosis_dmdxresult_and_more.py +451 -0
  329. meta_subject/migrations/0188_historicaldmdxresult_dmdxresult.py +403 -0
  330. meta_subject/migrations/0189_alter_dmdxresult_options_and_more.py +116 -0
  331. meta_subject/migrations/0190_dmdiagnosis_dx_no_tmg_reason_and_more.py +65 -0
  332. meta_subject/migrations/0191_alter_dmdiagnosis_dx_no_tmg_reason_and_more.py +70 -0
  333. meta_subject/migrations/0192_rename_glucose_quantifier_glucosefbg_fbg_quantifier_and_more.py +44 -0
  334. meta_subject/migrations/0193_alter_glucosefbg_fbg_value_and_more.py +44 -0
  335. meta_subject/migrations/0194_remove_glucosefbg_assay_datetime_and_more.py +166 -0
  336. meta_subject/migrations/0195_alter_glucosefbg_fbg_datetime_and_more.py +27 -0
  337. meta_subject/migrations/0196_glucosefbg_fbg_not_performed_reason_and_more.py +49 -0
  338. meta_subject/migrations/0197_glucosefbg_fasting_duration_estimated_and_more.py +33 -0
  339. meta_subject/migrations/0198_alter_glucosefbg_fasting_duration_estimated_and_more.py +33 -0
  340. meta_subject/migrations/0199_auto_20240516_0247.py +18 -0
  341. meta_subject/migrations/0200_rename_fasting_duration_minutes_bloodresultsins_fasting_duration_delta_and_more.py +43 -0
  342. meta_subject/migrations/0201_alter_bloodresultsins_fasting_duration_delta_and_more.py +58 -0
  343. meta_subject/migrations/0202_auto_20240516_0315.py +32 -0
  344. meta_subject/migrations/0203_alter_bloodresultsins_fasting_duration_delta_and_more.py +67 -0
  345. meta_subject/migrations/0204_glucosefbg_repeat_fbg_date_and_more.py +27 -0
  346. meta_subject/migrations/0205_historicalsubjectrequisition_crf_status_and_more.py +80 -0
  347. meta_subject/migrations/0206_bloodresultsfbc_crf_status_and_more.py +62 -0
  348. meta_subject/migrations/0207_alter_historicalphysicalexam_waist_circumference_and_more.py +46 -0
  349. meta_subject/migrations/0208_birthoutcomes_crf_status_and_more.py +62 -0
  350. meta_subject/migrations/0209_remove_historicaldmdxresult_dm_diagnosis_and_more.py +37 -0
  351. meta_subject/migrations/0210_remove_dmdxresult_dm_diagnosis_and_more.py +123 -0
  352. meta_subject/migrations/0211_dmendpoint_endpoint_reached_and_more.py +45 -0
  353. meta_subject/migrations/0212_auto_20240827_2222.py +23 -0
  354. meta_subject/migrations/0213_rename_bloodresultslipid_bloodresultslipids_and_more.py +35 -0
  355. meta_subject/migrations/0214_historicalstudymedication_stock_codes_and_more.py +44 -0
  356. meta_subject/migrations/0215_alter_historicalstudymedication_stock_codes_and_more.py +46 -0
  357. meta_subject/model_mixins/arv_history_model_mixin.py +3 -3
  358. meta_subject/models/__init__.py +3 -2
  359. meta_subject/models/birth_outcomes.py +6 -1
  360. meta_subject/models/blood_results/__init__.py +1 -1
  361. meta_subject/models/blood_results/blood_results_fbc.py +3 -2
  362. meta_subject/models/blood_results/blood_results_hba1c.py +2 -0
  363. meta_subject/models/blood_results/blood_results_ins.py +2 -0
  364. meta_subject/models/blood_results/blood_results_lft.py +2 -0
  365. meta_subject/models/blood_results/{blood_results_lipid.py → blood_results_lipids.py} +5 -3
  366. meta_subject/models/blood_results/blood_results_rft.py +2 -0
  367. meta_subject/models/diabetes/__init__.py +2 -0
  368. meta_subject/models/diabetes/dm_endpoint.py +61 -0
  369. meta_subject/models/{dm_referral_followup.py → diabetes/dm_followup.py} +18 -6
  370. meta_subject/models/glucose.py +7 -14
  371. meta_subject/models/glucose_fbg.py +40 -51
  372. meta_subject/models/health_economics/health_economics_update.py +2 -0
  373. meta_subject/models/physical_exam.py +1 -0
  374. meta_subject/models/signals.py +19 -0
  375. meta_subject/models/subject_requisition.py +3 -4
  376. meta_subject/models/todo.txt +1 -1
  377. meta_subject/static/meta_subject/slider.css +1 -1
  378. meta_subject/templates/meta_subject/endpoint_review_instructions.html +1 -1
  379. meta_subject/templates/meta_subject/widgets/slider.html +0 -1
  380. meta_subject/tests/holidays.csv +1 -1
  381. meta_subject/tests/tests/test_egfr.py +6 -5
  382. meta_subject/tests/tests/test_medication_adherence.py +5 -1
  383. meta_subject/tests/tests/test_metadata_rules.py +34 -4
  384. meta_subject/tests/tests/test_mnsi.py +212 -121
  385. meta_subject/tests/tests/test_sf12.py +0 -12
  386. meta_visit_schedule/constants.py +7 -1
  387. meta_visit_schedule/tests/tests/test_schedule.py +4 -0
  388. meta_visit_schedule/visit_schedules/phase_three/crfs.py +87 -14
  389. meta_visit_schedule/visit_schedules/phase_three/requisitions.py +12 -0
  390. meta_visit_schedule/visit_schedules/phase_three/schedule.py +65 -2
  391. meta_visit_schedule/visit_schedules/phase_three/schedule_dm_referral.py +60 -0
  392. meta_visit_schedule/visit_schedules/phase_three/visit_schedule.py +2 -0
  393. tests/etc/randomization_list.csv +1 -1
  394. {meta_edc/tests → tests}/etc/randomization_list_phase_three.csv +4 -4
  395. tests/holidays.csv +1 -1
  396. tests/test_settings.py +186 -0
  397. meta_edc/tests/etc/user-aes-local.key +0 -1
  398. meta_edc/tests/etc/user-aes-restricted.key +0 -0
  399. meta_edc/tests/etc/user-rsa-local-private.pem +0 -27
  400. meta_edc/tests/etc/user-rsa-local-public.pem +0 -9
  401. meta_edc/tests/etc/user-rsa-restricted-private.pem +0 -27
  402. meta_edc/tests/etc/user-rsa-restricted-public.pem +0 -9
  403. meta_edc/tests/etc/user-salt-local.key +0 -0
  404. meta_edc/tests/etc/user-salt-restricted.key +0 -0
  405. meta_edc-0.3.7.dist-info/METADATA +0 -87
  406. meta_reports/tests/holidays.csv +0 -15
  407. meta_subject/forms/dm_referral_followup.py +0 -18
  408. /meta_edc-0.3.7.dist-info/AUTHORS → /meta_analytics/__init__.py +0 -0
  409. /meta_pharmacy/models.py → /meta_analytics/constants.py +0 -0
  410. /meta_reports/models.py → /meta_analytics/notebooks/cleaning/__init__.py +0 -0
  411. {meta_edc-0.3.7.dist-info → meta_edc-0.3.50.dist-info}/LICENSE +0 -0
@@ -2,6 +2,7 @@ import os
2
2
  import sys
3
3
  from importlib.metadata import version
4
4
  from pathlib import Path
5
+ from urllib.parse import quote
5
6
 
6
7
  import django
7
8
  import environ
@@ -16,7 +17,6 @@ env = environ.Env(
16
17
  CELERY_ENABLED=(bool, False),
17
18
  DATABASE_SQLITE_ENABLED=(bool, False),
18
19
  DJANGO_AUTO_CREATE_KEYS=(bool, False),
19
- DJANGO_CRYPTO_FIELDS_TEMP_PATH=(bool, False),
20
20
  DJANGO_CSRF_COOKIE_SECURE=(bool, True),
21
21
  DJANGO_DEBUG=(bool, False),
22
22
  DJANGO_EDC_BOOTSTRAP=(int, 3),
@@ -31,29 +31,30 @@ env = environ.Env(
31
31
  EDC_RANDOMIZATION_REGISTER_DEFAULT_RANDOMIZER=(bool, True),
32
32
  EDC_LABEL_BROWSER_PRINT_PAGE_AUTO_BACK=(bool, True),
33
33
  TWILIO_ENABLED=(bool, False),
34
+ EDC_SITES_DOMAIN_SUFFIX="meta4.clinicedc.org",
34
35
  )
35
36
 
36
- DEBUG = env("DJANGO_DEBUG")
37
-
38
- if LOGGING_ENABLED := env("DJANGO_LOGGING_ENABLED"):
39
- from .logging import * # noqa
40
-
41
- BASE_DIR = str(Path(os.path.dirname(os.path.abspath(__file__))).parent.parent)
42
- ENV_DIR = str(Path(os.path.dirname(os.path.abspath(__file__))).parent.parent)
37
+ BASE_DIR = Path(__file__).resolve().parent.parent.parent
38
+ ENV_DIR = Path(__file__).resolve().parent.parent.parent
43
39
 
44
40
  # copy your .env file from .envs/ to BASE_DIR
45
41
  if "test" in sys.argv:
46
- env.read_env(os.path.join(ENV_DIR, ".env-tests"))
47
- print(f"Reading env from {os.path.join(BASE_DIR, '.env-tests')}")
42
+ env.read_env(ENV_DIR / ".env-tests")
43
+ print(f"Reading env from {(BASE_DIR /'.env-tests')}") # noqa
48
44
  else:
49
- if not os.path.exists(os.path.join(ENV_DIR, ".env")):
50
- raise FileExistsError(
51
- f"Environment file does not exist. Got `{os.path.join(ENV_DIR, '.env')}`"
52
- )
53
- env.read_env(os.path.join(ENV_DIR, ".env"))
45
+ if not (ENV_DIR / ".env").exists():
46
+ raise FileExistsError(f"Environment file does not exist. Got `{(ENV_DIR / '.env')}`")
47
+ env.read_env(ENV_DIR / ".env")
48
+
49
+
50
+ LOGGING_ENABLED = env("DJANGO_LOGGING_ENABLED")
51
+ if LOGGING_ENABLED:
52
+ from .logging import * # noqa
54
53
 
55
54
  META_PHASE = 3
56
55
 
56
+ EDC_SITES_DOMAIN_SUFFIX = env.str("EDC_SITES_DOMAIN_SUFFIX") # "meta4.clinicedc.org"
57
+
57
58
  DEBUG = env("DJANGO_DEBUG")
58
59
 
59
60
  SECRET_KEY = env.str("DJANGO_SECRET_KEY")
@@ -64,10 +65,11 @@ LIVE_SYSTEM = env.str("DJANGO_LIVE_SYSTEM")
64
65
 
65
66
  ETC_DIR = env.str("DJANGO_ETC_FOLDER")
66
67
 
67
- TEST_DIR = os.path.join(BASE_DIR, APP_NAME, "tests")
68
+ TEST_DIR = BASE_DIR / APP_NAME / "tests"
68
69
 
69
- # INTERNAL_IPS = ["127.0.0.1"]
70
- ALLOWED_HOSTS = ["*"] # env.list('DJANGO_ALLOWED_HOSTS')
70
+ ALLOWED_HOSTS = env.list("DJANGO_ALLOWED_HOSTS")
71
+
72
+ META3_DOMAIN_SUFFIX = "meta4.clinicedc.org"
71
73
 
72
74
  ENFORCE_RELATED_ACTION_ITEM_EXISTS = False
73
75
 
@@ -86,8 +88,12 @@ INSTALLED_APPS = [
86
88
  "django.contrib.messages",
87
89
  "django.contrib.staticfiles",
88
90
  "django.contrib.sites",
91
+ "multisite.apps.AppConfig",
89
92
  "defender",
90
- "multisite",
93
+ "sequences.apps.SequencesConfig",
94
+ # "django_celery_beat",
95
+ # "django_celery_results",
96
+ "django_db_views",
91
97
  "fontawesomefree",
92
98
  "django_crypto_fields.apps.AppConfig",
93
99
  "django_revision.apps.AppConfig",
@@ -95,10 +101,13 @@ INSTALLED_APPS = [
95
101
  "logentry_admin",
96
102
  "simple_history",
97
103
  "storages",
104
+ "django_pylabels.apps.AppConfig",
105
+ "edc_pylabels.apps.AppConfig",
98
106
  "edc_sites.apps.AppConfig",
99
107
  "edc_action_item.apps.AppConfig",
100
108
  "edc_appointment.apps.AppConfig",
101
109
  "edc_auth.apps.AppConfig",
110
+ "edc_adherence.apps.AppConfig",
102
111
  "edc_adverse_event.apps.AppConfig",
103
112
  "edc_consent.apps.AppConfig",
104
113
  "edc_crf.apps.AppConfig",
@@ -135,6 +144,7 @@ INSTALLED_APPS = [
135
144
  "edc_protocol.apps.AppConfig",
136
145
  "edc_protocol_incident.apps.AppConfig",
137
146
  "edc_prn.apps.AppConfig",
147
+ "edc_qareports.apps.AppConfig",
138
148
  "edc_qol.apps.AppConfig",
139
149
  "edc_randomization.apps.AppConfig",
140
150
  "edc_refusal.apps.AppConfig",
@@ -146,7 +156,6 @@ INSTALLED_APPS = [
146
156
  "edc_timepoint.apps.AppConfig",
147
157
  "edc_unblinding.apps.AppConfig",
148
158
  "edc_form_describer.apps.AppConfig",
149
- "edc_adherence.apps.AppConfig",
150
159
  "edc_dx.apps.AppConfig",
151
160
  "meta_consent.apps.AppConfig",
152
161
  "meta_data_manager.apps.AppConfig",
@@ -154,6 +163,7 @@ INSTALLED_APPS = [
154
163
  "meta_dashboard.apps.AppConfig",
155
164
  "meta_labs.apps.AppConfig",
156
165
  "meta_subject.apps.AppConfig",
166
+ "meta_reports.apps.AppConfig",
157
167
  "meta_visit_schedule.apps.AppConfig",
158
168
  "meta_ae.apps.AppConfig",
159
169
  "meta_auth.apps.AppConfig",
@@ -173,11 +183,13 @@ if not DEFENDER_ENABLED:
173
183
  MIDDLEWARE = [
174
184
  "django.middleware.security.SecurityMiddleware",
175
185
  "django.contrib.sessions.middleware.SessionMiddleware",
186
+ "django.middleware.locale.LocaleMiddleware",
176
187
  "django.middleware.common.CommonMiddleware",
177
188
  "multisite.middleware.DynamicSiteMiddleware",
178
189
  "django.contrib.sites.middleware.CurrentSiteMiddleware",
179
190
  "django.middleware.csrf.CsrfViewMiddleware",
180
191
  "django.contrib.auth.middleware.AuthenticationMiddleware",
192
+ "django.contrib.auth.middleware.LoginRequiredMiddleware",
181
193
  "defender.middleware.FailedLoginMiddleware",
182
194
  "django.contrib.messages.middleware.MessageMiddleware",
183
195
  "django.middleware.clickjacking.XFrameOptionsMiddleware",
@@ -224,7 +236,7 @@ if env("DATABASE_SQLITE_ENABLED"):
224
236
  DATABASES = {
225
237
  "default": {
226
238
  "ENGINE": "django.db.backends.sqlite3",
227
- "NAME": os.path.join(BASE_DIR, "db.sqlite3"),
239
+ "NAME": BASE_DIR / "db.sqlite3",
228
240
  }
229
241
  }
230
242
 
@@ -238,12 +250,11 @@ if env.str("DJANGO_CACHE") == "redis":
238
250
  "default": {
239
251
  "BACKEND": "django_redis.cache.RedisCache",
240
252
  "LOCATION": "redis://127.0.0.1:6379/1",
241
- # "LOCATION": "unix://[:{DJANGO_REDIS_PASSWORD}]@/path/to/socket.sock?db=0",
242
253
  "OPTIONS": {
243
254
  "CLIENT_CLASS": "django_redis.client.DefaultClient",
244
255
  "PASSWORD": env.str("DJANGO_REDIS_PASSWORD"),
245
256
  },
246
- "KEY_PREFIX": f"{APP_NAME}",
257
+ "KEY_PREFIX": env.str("DJANGO_REDIS_KEY_PREFIX", default=APP_NAME),
247
258
  }
248
259
  }
249
260
  SESSION_ENGINE = "django.contrib.sessions.backends.cache"
@@ -292,13 +303,16 @@ USE_TZ = True
292
303
 
293
304
  LANG_INFO = dict(django.conf.locale.LANG_INFO, **EXTRA_LANG_INFO)
294
305
  django.conf.locale.LANG_INFO = LANG_INFO
295
- LANGUAGE_CODE = "en"
306
+
307
+ LANGUAGE_CODE = "en-gb"
296
308
  LANGUAGE_LIST = ["sw", "en-gb", "en", "mas"]
297
309
  LANGUAGES = [(code, LANG_INFO[code]["name"]) for code in LANGUAGE_LIST]
298
310
 
311
+ # LOCALE_PATHS = [
312
+ # base_dir / "locale",
313
+ # base_dir.parent / "edc-pharmacy" / "edc_pharmacy" / "locale",
314
+ # ]
299
315
 
300
- # LANGUAGE_CODE = env.str("DJANGO_LANGUAGE_CODE") # ignored if USE_L10N = False
301
- # LANGUAGES = [x.split(":") for x in env.list("DJANGO_LANGUAGES")] or (("en", "English"),)
302
316
  TIME_ZONE = env.str("DJANGO_TIME_ZONE")
303
317
  DATE_INPUT_FORMATS = ["%Y-%m-%d", "%d/%m/%Y"]
304
318
  DATETIME_INPUT_FORMATS = [
@@ -341,8 +355,8 @@ if not DEBUG:
341
355
  SECURE_BROWSER_XSS_FILTER = True
342
356
 
343
357
  # edc_lab and label
344
- LABEL_TEMPLATE_FOLDER = env.str("DJANGO_LABEL_TEMPLATE_FOLDER") or os.path.join(
345
- BASE_DIR, "label_templates", "2.25x1.25in"
358
+ LABEL_TEMPLATE_FOLDER = env.str("DJANGO_LABEL_TEMPLATE_FOLDER") or (
359
+ BASE_DIR / "label_templates" / "2.25x1.25in"
346
360
  )
347
361
  CUPS_SERVERS = env.dict("DJANGO_CUPS_SERVERS")
348
362
 
@@ -355,8 +369,9 @@ SUBJECT_VISIT_MODEL = env.str("EDC_SUBJECT_VISIT_MODEL")
355
369
  SUBJECT_VISIT_MISSED_MODEL = env.str("EDC_SUBJECT_VISIT_MISSED_MODEL")
356
370
  SUBJECT_VISIT_MISSED_REASONS_MODEL = env.str("EDC_SUBJECT_VISIT_MISSED_REASONS_MODEL")
357
371
  SUBJECT_REFUSAL_MODEL = env.str("EDC_SUBJECT_REFUSAL_MODEL")
358
- EDC_BLOOD_RESULTS_MODEL_APP_LABEL = "meta_subject"
359
372
 
373
+ EDC_BLOOD_RESULTS_MODEL_APP_LABEL = "meta_subject"
374
+ EDC_DASHBOARD_APP_LABEL = "meta_dashboard"
360
375
  EDC_NAVBAR_DEFAULT = env("EDC_NAVBAR_DEFAULT")
361
376
 
362
377
  # dashboards
@@ -388,6 +403,18 @@ EDC_MNSI_MODEL = "meta_subject.mnsi"
388
403
 
389
404
  EDC_OFFSTUDY_OFFSTUDY_MODEL = "meta_prn.endofstudy"
390
405
 
406
+ # edc-pharmacy
407
+ EDC_PDF_REPORTS_WATERMARK_WORD = env.str("EDC_PDF_REPORTS_WATERMARK_WORD")
408
+ EDC_PDF_REPORTS_WATERMARK_FONT = env.str("EDC_PDF_REPORTS_WATERMARK_FONT")
409
+ EDC_PDF_REPORTS_WATERMARK_FONTSIZE = env.int("EDC_PDF_REPORTS_WATERMARK_FONTSIZE")
410
+ EDC_PHARMACY_LABEL_WATERMARK_WORD = env.str("EDC_PHARMACY_LABEL_WATERMARK_WORD")
411
+ if EDC_PDF_REPORTS_WATERMARK_FONT:
412
+ EDC_PDF_REPORTS_WATERMARK_FONT = (
413
+ EDC_PDF_REPORTS_WATERMARK_FONT,
414
+ EDC_PDF_REPORTS_WATERMARK_FONTSIZE,
415
+ )
416
+ else:
417
+ EDC_PDF_REPORTS_WATERMARK_FONT = ()
391
418
  # edc-protocol-incident
392
419
  EDC_PROTOCOL_VIOLATION_TYPE = PROTOCOL_INCIDENT
393
420
 
@@ -405,9 +432,14 @@ EDC_RANDOMIZATION_SKIP_VERIFY_CHECKS = True
405
432
  # edc-sites
406
433
  EDC_SITES_MODULE_NAME = env.str("EDC_SITES_MODULE_NAME")
407
434
 
435
+ # meta_pharmacy
436
+ META_PHARMACY_RX_SUBSTITUTION_FILE = env.str("META_PHARMACY_RX_SUBSTITUTION_FILE")
437
+
408
438
  # django-multisite
409
- CACHE_MULTISITE_KEY_PREFIX = APP_NAME
439
+ CACHE_MULTISITE_KEY_PREFIX = "meta4"
410
440
  SILENCED_SYSTEM_CHECKS = ["sites.E101"]
441
+ MULTISITE_SYNC_ALIAS_MANUALLY = True
442
+ MULTISITE_REGISTER_POST_MIGRATE_SYNC_ALIAS = False
411
443
 
412
444
  # django-defender
413
445
  # see if env.str("DJANGO_CACHE") == "redis" above
@@ -444,7 +476,7 @@ GIT_DIR = BASE_DIR
444
476
  KEY_PATH = env.str("DJANGO_KEY_FOLDER")
445
477
  AUTO_CREATE_KEYS = env("DJANGO_AUTO_CREATE_KEYS")
446
478
 
447
- EXPORT_FOLDER = env.str("DJANGO_EXPORT_FOLDER") or os.path.expanduser("~/")
479
+ EXPORT_FOLDER = env.str("DJANGO_EXPORT_FOLDER") or Path("~/").expanduser()
448
480
 
449
481
  # django_simple_history
450
482
  SIMPLE_HISTORY_ENFORCE_HISTORY_MODEL_PERMISSIONS = True
@@ -469,6 +501,9 @@ DATA_DICTIONARY_APP_LABELS = [
469
501
  "edc_offstudy",
470
502
  ]
471
503
 
504
+ # edc_form_runners
505
+ EDC_FORM_RUNNERS_ENABLED = False
506
+
472
507
  # edc_protocol
473
508
  EDC_PROTOCOL = env.str("EDC_PROTOCOL")
474
509
  EDC_PROTOCOL_INSTITUTION_NAME = env.str("EDC_PROTOCOL_INSTITUTION_NAME")
@@ -498,49 +533,36 @@ if env("AWS_ENABLED"):
498
533
  AWS_S3_OBJECT_PARAMETERS = {"CacheControl": "max-age=86400"}
499
534
  AWS_LOCATION = env.str("AWS_LOCATION")
500
535
  AWS_IS_GZIPPED = True
501
- STATICFILES_STORAGE = "storages.backends.s3boto3.S3Boto3Storage"
536
+ STORAGES = {"staticfiles": {"BACKEND": "storages.backends.s3boto3.S3Boto3Storage"}}
502
537
  STATIC_URL = f"{os.path.join(AWS_S3_CUSTOM_DOMAIN, AWS_LOCATION)}/"
503
538
  STATIC_ROOT = ""
504
539
  elif DEBUG:
505
540
  STATIC_URL = env.str("DJANGO_STATIC_URL")
506
- STATIC_ROOT = os.path.expanduser("~/source/edc_source/meta-edc/static/")
541
+ STATIC_ROOT = Path("~/source/edc_source/meta-edc/static/").expanduser()
507
542
  else:
508
543
  # run collectstatic, check nginx LOCATION
509
544
  STATIC_URL = env.str("DJANGO_STATIC_URL")
510
545
  STATIC_ROOT = env.str("DJANGO_STATIC_ROOT")
511
546
 
512
547
  # CELERY
513
- # see docs on setting up the broker
514
548
  CELERY_ENABLED = env("CELERY_ENABLED")
515
549
  if CELERY_ENABLED:
516
- CELERY_BROKER_USER = env.str("CELERY_BROKER_USER")
517
- CELERY_BROKER_PASSWORD = env.str("CELERY_BROKER_PASSWORD")
518
- CELERY_BROKER_HOST = env.str("CELERY_BROKER_HOST")
519
- CELERY_BROKER_PORT = env.str("CELERY_BROKER_PORT")
520
- if DEBUG:
521
- CELERY_BROKER_VHOST = f"{APP_NAME}_debug"
522
- elif LIVE_SYSTEM:
523
- CELERY_BROKER_VHOST = f"{APP_NAME}_production"
524
- else:
525
- CELERY_BROKER_VHOST = f"{APP_NAME}_uat"
550
+ CELERY_CACHE_BACKEND = "default"
551
+ if env.str("DJANGO_REDIS_PASSWORD"):
526
552
  CELERY_BROKER_URL = (
527
- f"amqp://{CELERY_BROKER_USER}:{CELERY_BROKER_PASSWORD}@"
528
- f"{CELERY_BROKER_HOST}:{CELERY_BROKER_PORT}/{CELERY_BROKER_VHOST}"
553
+ f"redis://:{quote(env.str('DJANGO_REDIS_PASSWORD'), safe='')}@127.0.0.1:6379/0"
529
554
  )
530
- DJANGO_CELERY_RESULTS_TASK_ID_MAX_LENGTH = 191
531
- CELERY_RESULT_BACKEND = "django-db"
532
- # CELERY_QUEUES = (
533
- # Queue('high', Exchange('high'), routing_key='high'),
534
- # Queue('normal', Exchange('normal'), routing_key='normal'),
535
- # Queue('low', Exchange('low'), routing_key='low'),
536
- # )
537
- # CELERY_DEFAULT_QUEUE = 'normal'
538
- # CELERY_DEFAULT_EXCHANGE = 'normal'
539
- # CELERY_DEFAULT_ROUTING_KEY = 'normal'
540
- # CELERY_ROUTES = {
541
- # 'edc_data_manager.tasks.*': {'queue': 'normal'},
542
- # }
543
-
555
+ CELERY_RESULT_BACKEND = (
556
+ f"redis://:{quote(env.str('DJANGO_REDIS_PASSWORD'), safe='')}@127.0.0.1:6379/0"
557
+ )
558
+ else:
559
+ CELERY_BROKER_URL = "redis://127.0.0.1:6379/0"
560
+ CELERY_RESULT_BACKEND = "redis://localhost:6379/0"
561
+ # CELERY_BEAT_SCHEDULER = "django_celery_beat.schedulers.DatabaseScheduler"
562
+ CELERY_ACCEPT_CONTENT = ["json"]
563
+ CELERY_TASK_SERIALIZER = "json"
564
+ CELERY_RESULT_SERIALIZER = "json"
565
+ CELERY_TIMEZONE = "UTC"
544
566
 
545
567
  if "test" in sys.argv:
546
568
 
meta_edc/settings/live.py CHANGED
@@ -4,16 +4,8 @@ from .defaults import * # noqa
4
4
 
5
5
  print(f"Settings file {__file__}")
6
6
 
7
-
8
7
  SITE_ID = SiteID(default=1)
9
8
  EDC_SITES_UAT_DOMAIN = False
10
- ALLOWED_HOSTS = [
11
- "amana.tz.meta3.clinicedc.org",
12
- "hindu-mandal.tz.meta3.clinicedc.org",
13
- "mbagala.tz.meta3.clinicedc.org",
14
- "mnazi-moja.tz.meta3.clinicedc.org",
15
- "mwananyamala.tz.meta3.clinicedc.org",
16
- "temeke.tz.meta3.clinicedc.org",
17
- ]
18
9
  EDC_MODEL_ADMIN_CSS_THEME = "edc_indigo"
19
10
  LIVE_SYSTEM = True
11
+ EDC_SITES_DOMAIN_SUFFIX = "meta4.clinicedc.org"
meta_edc/settings/uat.py CHANGED
@@ -1,24 +1,11 @@
1
- from importlib.metadata import version
2
-
3
1
  from multisite import SiteID
4
2
 
5
3
  from .defaults import * # noqa
6
4
 
7
5
  print(f"Settings file {__file__}")
8
- print(f"Version: {version('meta_edc')}")
9
6
 
10
7
  SITE_ID = SiteID(default=1)
11
8
  EDC_SITES_UAT_DOMAIN = True
12
- EDC_CONSENT_BYPASS_CONSENT_DATETIME_VALIDATION = True
13
- ALLOWED_HOSTS = [
14
- "amana.uat.tz.meta4.clinicedc.org",
15
- "hindu-mandal.uat.tz.meta4.clinicedc.org",
16
- "mbagala.uat.tz.meta4.clinicedc.org",
17
- "mnazi-moja.uat.tz.meta4.clinicedc.org",
18
- "mwananyamala.uat.tz.meta4.clinicedc.org",
19
- "temeke.uat.tz.meta4.clinicedc.org",
20
- ]
21
-
22
- # edc_model_admin
23
9
  EDC_MODEL_ADMIN_CSS_THEME = "edc_purple"
24
10
  LIVE_SYSTEM = False
11
+ EDC_CONSENT_BYPASS_CONSENT_DATETIME_VALIDATION = True
@@ -4,7 +4,7 @@
4
4
  {% block main %}
5
5
 
6
6
  <style>
7
-
7
+ a { cursor: pointer; }
8
8
  .bg-1 {
9
9
  background-color: #428bca; /* dark blue */
10
10
  color: #ffffff;
@@ -21,8 +21,8 @@
21
21
  </style>
22
22
 
23
23
  {{ block.super }}
24
-
25
-
24
+ <form id="switch_sites_form" method="post" action="{% url 'switch_sites_url' %}">{% csrf_token %}</form>
25
+ <form id="logout_form" method="post" action="{% url 'edc_auth_admin:logout' %}">{% csrf_token %}</form>
26
26
 
27
27
  <div class="row">
28
28
 
@@ -56,14 +56,20 @@
56
56
  {% if perms.edc_data_manager.nav_data_manager_section %}
57
57
  <a href="{% url 'edc_data_manager:home_url' %}" class="list-group-item"><i class="fas fa-database fa-lg fa-fw"></i>&nbsp;&nbsp;&nbsp;Data Management</a>
58
58
  {% endif %}
59
- {% if perms.edc_navbar.nav_pharmacy_section %}
60
- <a href="{% url edc_randomization_url_name %}" class="list-group-item"><i class="fas fa-medkit fa-lg fa-fw"></i>&nbsp;&nbsp;&nbsp;Pharmacy</a>
59
+ {% if perms.meta_reports %}
60
+ <a href="{% url 'meta_reports:home_url' %}" class="list-group-item"><i class="fa-solid fa-stroopwafel fa-lg fa-fw"></i></i>&nbsp;&nbsp;&nbsp;QA Reports</a>
61
+ {% endif %}
62
+ {% if perms.edc_pharmacy.nav_pharmacy_section %}
63
+ <a href="{% url 'edc_pharmacy:home_url' %}" class="list-group-item"><i class="fas fa-prescription fa-lg fa-fw"></i>&nbsp;&nbsp;&nbsp;Pharmacy</a>
61
64
  {% endif %}
62
65
  {% if perms.edc_export %}
63
66
  <a href="{% url 'edc_export:home_url' %}" class="list-group-item"><i class="fas fa-file-export fa-lg fa-fw"></i>&nbsp;&nbsp;&nbsp;Export data</a>
64
67
  {% endif %}
65
- <a href="/switch_sites/" class="list-group-item"><i class="fas fa-arrows-alt fa-lg fa-fw"></i>&nbsp;&nbsp;&nbsp;Switch sites</a>
66
- <a href="{% url 'edc_auth_admin:logout' %}" class="list-group-item"><i class="fas fa-sign-out-alt fa-lg fa-fw"></i>&nbsp;&nbsp;&nbsp;Log out</a>
68
+ {% if perms.edc_auth.change_userprofile %}
69
+ <a href="{% url 'edc_auth:home_url' %}" class="list-group-item"><i class="fas fa-users fa-lg fa-fw"></i>&nbsp;&nbsp;&nbsp;Account Management</a>
70
+ {% endif %}
71
+ <a onclick="document.getElementById('switch_sites_form').submit();" class="list-group-item" title="{% url 'switch_sites_url' %}"><i class="fas fa-arrows-alt fa-lg fa-fw"></i>&nbsp;&nbsp;&nbsp;Switch sites</a>
72
+ <a onclick="document.getElementById('logout_form').submit();" class="list-group-item" title="{% url 'edc_auth_admin:logout' %}"><i class="fas fa-sign-out-alt fa-lg fa-fw"></i>&nbsp;&nbsp;&nbsp;Log out</a>
67
73
  </div>
68
74
  </div>
69
75
  </div>
@@ -12,8 +12,7 @@ from django.apps import apps as django_apps
12
12
  from django.conf import settings
13
13
  from django.contrib.auth import get_user_model
14
14
  from django.contrib.sites.models import Site
15
- from django.test import tag
16
- from django.test.utils import override_settings
15
+ from django.test.utils import override_settings, tag
17
16
  from django.urls.base import reverse
18
17
  from django.urls.exceptions import NoReverseMatch
19
18
  from django_extensions.management.color import color_style
@@ -25,7 +24,7 @@ from edc_auth.auth_updater import AuthUpdater
25
24
  from edc_auth.constants import AUDITOR_ROLE, CLINICIAN_ROLE, STAFF_ROLE
26
25
  from edc_auth.site_auths import site_auths
27
26
  from edc_consent.site_consents import site_consents
28
- from edc_constants.constants import PENDING, YES
27
+ from edc_constants.constants import YES
29
28
  from edc_dashboard.url_names import url_names
30
29
  from edc_export.constants import DATA_EXPORTER_ROLE
31
30
  from edc_lab.auth_objects import LAB_TECHNICIAN_ROLE
@@ -86,8 +85,10 @@ class AdminSiteTest(MetaTestCaseMixin, WebTest):
86
85
  import_module("edc_adverse_event.auths")
87
86
  import_module("edc_appointment.auths")
88
87
  import_module("edc_consent.auths")
88
+ import_module("edc_pylabels.auths")
89
89
  import_module("edc_dashboard.auths")
90
90
  import_module("edc_data_manager.auths")
91
+ import_module("edc_qareports.auths")
91
92
  import_module("edc_export.auths")
92
93
  import_module("edc_lab.auths")
93
94
  import_module("edc_lab_dashboard.auths")
@@ -217,7 +218,7 @@ class AdminSiteTest(MetaTestCaseMixin, WebTest):
217
218
  else:
218
219
  self.assertNotIn(label, response)
219
220
 
220
- @tag("1")
221
+ @skip
221
222
  @time_machine.travel(datetime(2019, 6, 11, 8, 00, tzinfo=ZoneInfo("UTC")))
222
223
  def test_screening_form_phase3(self):
223
224
  self.login(superuser=False, roles=[STAFF_ROLE, CLINICIAN_ROLE])
@@ -241,18 +242,18 @@ class AdminSiteTest(MetaTestCaseMixin, WebTest):
241
242
  add_screening_part_two,
242
243
  screening_identifier,
243
244
  ) = self.webtest_for_screening_form_part_one(part_one_data)
244
- part_two_data = deepcopy(get_part_two_eligible_options())
245
- part_two_data["part_two_report_datetime"] = get_utcnow() + relativedelta(minutes=10)
246
- part_two_data["appt_datetime"] = part_two_data[
247
- "part_two_report_datetime"
248
- ] + relativedelta(days=10)
249
- if part_two_data["appt_datetime"] < get_utcnow():
250
- part_two_data.update(p3_ltfu=PENDING)
251
- # part_two_data.update(p3_ltfu_date=get_utcnow().date())
252
- # part_two_data.update()
253
-
254
- traveller = time_machine.travel(part_two_data["part_two_report_datetime"])
245
+
246
+ # travel 10 min into the future
247
+ traveller = time_machine.travel(
248
+ part_one_data["report_datetime"] + relativedelta(minutes=10)
249
+ )
255
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)
256
257
  part_two_data.update(
257
258
  dict(
258
259
  part_two_report_datetime_0=part_two_data["part_two_report_datetime"].strftime(
@@ -272,11 +273,14 @@ class AdminSiteTest(MetaTestCaseMixin, WebTest):
272
273
  ) = self.webtest_for_screening_form_part_two(
273
274
  home_page, add_screening_part_two, screening_identifier, part_two_data
274
275
  )
276
+ traveller.stop()
275
277
 
278
+ # travel 10 days into the future
276
279
  traveller = time_machine.travel(part_two_data["appt_datetime"])
277
280
  traveller.start()
278
- part_three_data = deepcopy(get_part_three_eligible_options())
279
- # report_datetime = part_three_data.get("part_three_report_datetime")
281
+ part_three_data = deepcopy(
282
+ get_part_three_eligible_options(report_datetime=get_utcnow())
283
+ )
280
284
 
281
285
  traveller = time_machine.travel(part_two_data.get("part_three_report_datetime"))
282
286
  traveller.start()
@@ -311,7 +315,6 @@ class AdminSiteTest(MetaTestCaseMixin, WebTest):
311
315
  self.assertIn(screening_identifier, screening_listboard_page)
312
316
  self.assertIn("Consent", screening_listboard_page)
313
317
 
314
- @tag("1")
315
318
  def webtest_for_screening_form_part_one(self, part_one_data):
316
319
  home_page = self.app.get(reverse("home_url"), user=self.user, status=200)
317
320
  screening_listboard_page = home_page.click(description="Screening", index=1)
@@ -367,7 +370,7 @@ class AdminSiteTest(MetaTestCaseMixin, WebTest):
367
370
  errorlist = soup.find_all("ul", "errorlist")
368
371
  self.assertEqual([], errorlist)
369
372
  # redirects back to listboard
370
- obj = SubjectScreening.objects.all().last()
373
+ obj = SubjectScreening.objects.get(screening_identifier=screening_identifier)
371
374
  url = reverse(screening_listboard_url, args=(obj.screening_identifier,))
372
375
  self.assertRedirects(page, url)
373
376
  # shows P1 | P2 | P3 | PENDING
meta_edc/urls.py CHANGED
@@ -1,8 +1,8 @@
1
1
  from django.conf import settings
2
+ from django.contrib.auth.views import LogoutView
2
3
  from django.urls.conf import include, path, re_path
3
4
  from django.views.defaults import page_not_found, server_error # noqa
4
5
  from django.views.generic import RedirectView
5
- from edc_auth.views import LogoutView
6
6
  from edc_dashboard.utils import get_index_page
7
7
  from edc_dashboard.views import AdministrationView
8
8
  from edc_utils.paths_for_urlpatterns import paths_for_urlpatterns
@@ -22,6 +22,7 @@ urlpatterns = [
22
22
  path("accounts/", include("edc_auth.urls_for_accounts", namespace="auth")),
23
23
  path("administration/", AdministrationView.as_view(), name="administration_url"),
24
24
  path("subject/", include("meta_dashboard.urls")),
25
+ *paths_for_urlpatterns("edc_pylabels"),
25
26
  *paths_for_urlpatterns("edc_auth"),
26
27
  *paths_for_urlpatterns("edc_action_item"),
27
28
  *paths_for_urlpatterns("edc_adverse_event"),
@@ -56,15 +57,17 @@ urlpatterns = [
56
57
  *paths_for_urlpatterns("edc_sites"),
57
58
  *paths_for_urlpatterns("edc_subject_dashboard"),
58
59
  *paths_for_urlpatterns("edc_unblinding"),
60
+ *paths_for_urlpatterns("edc_qareports"),
59
61
  *paths_for_urlpatterns("edc_visit_schedule"),
60
- # *paths_for_urlpatterns("canned_views"),
61
62
  *paths_for_urlpatterns("meta_ae"),
62
63
  *paths_for_urlpatterns("meta_consent"),
63
64
  *paths_for_urlpatterns("meta_export"),
64
65
  *paths_for_urlpatterns("meta_lists"),
66
+ *paths_for_urlpatterns("meta_pharmacy"),
65
67
  *paths_for_urlpatterns("meta_prn"),
66
68
  *paths_for_urlpatterns("meta_screening"),
67
69
  *paths_for_urlpatterns("meta_subject"),
70
+ *paths_for_urlpatterns("meta_reports"),
68
71
  ]
69
72
 
70
73
  if settings.DEFENDER_ENABLED:
meta_edc/wsgi.py CHANGED
@@ -2,6 +2,6 @@ import os
2
2
 
3
3
  from django.core.wsgi import get_wsgi_application
4
4
 
5
- os.environ.setdefault("DJANGO_SETTINGS_MODULE", "meta_edc.settings.debug")
5
+ os.environ["DJANGO_SETTINGS_MODULE"] = "meta_edc.settings.debug"
6
6
 
7
7
  application = get_wsgi_application()
meta_edc/wsgi_live.py CHANGED
@@ -2,6 +2,6 @@ import os
2
2
 
3
3
  from django.core.wsgi import get_wsgi_application
4
4
 
5
- os.environ.setdefault("DJANGO_SETTINGS_MODULE", "meta_edc.settings.live")
5
+ os.environ["DJANGO_SETTINGS_MODULE"] = "meta_edc.settings.live"
6
6
 
7
7
  application = get_wsgi_application()
meta_edc/wsgi_uat.py CHANGED
@@ -2,6 +2,6 @@ import os
2
2
 
3
3
  from django.core.wsgi import get_wsgi_application
4
4
 
5
- os.environ.setdefault("DJANGO_SETTINGS_MODULE", "meta_edc.settings.uat")
5
+ os.environ["DJANGO_SETTINGS_MODULE"] = "meta_edc.settings.uat"
6
6
 
7
7
  application = get_wsgi_application()
File without changes