meta-edc 0.3.39__py3-none-any.whl → 1.4.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (637) hide show
  1. meta_ae/action_items.py +38 -27
  2. meta_ae/admin/__init__.py +11 -0
  3. meta_ae/admin/ae_initial_admin.py +5 -2
  4. meta_ae/admin/ae_susar_admin.py +1 -1
  5. meta_ae/admin/death_report_admin.py +1 -1
  6. meta_ae/admin/modeladmin_mixins.py +14 -15
  7. meta_ae/baker_recipes.py +4 -6
  8. meta_ae/choices.py +1 -1
  9. meta_ae/forms/__init__.py +13 -0
  10. meta_ae/forms/death_report_form.py +1 -1
  11. meta_ae/forms/modelform_mixins.py +2 -2
  12. meta_ae/list_data.py +1 -1
  13. meta_ae/migrations/0001_initial.py +27 -27
  14. meta_ae/migrations/0006_aelocalreview_aesponsorreview.py +5 -5
  15. meta_ae/migrations/0017_auto_20221130_2257.py +1 -1
  16. meta_ae/migrations/0022_historicalhospitalization_hospitalization.py +5 -13
  17. meta_ae/migrations/0023_alter_aefollowup_action_identifier_and_more.py +2017 -0
  18. meta_ae/model_mixins/__init__.py +2 -0
  19. meta_ae/model_mixins/ae_review_model_mixin.py +6 -6
  20. meta_ae/model_mixins/death_report_model_mixin.py +3 -3
  21. meta_ae/models/__init__.py +13 -0
  22. meta_ae/models/hospitalization.py +3 -3
  23. meta_ae/pdf_reports/__init__.py +2 -0
  24. meta_ae/templatetags/meta_ae_extras.py +4 -6
  25. meta_analytics/.DS_Store +0 -0
  26. meta_analytics/README.rst +1 -2
  27. meta_analytics/dataframes/__init__.py +27 -0
  28. meta_analytics/dataframes/constants.py +5 -2
  29. meta_analytics/dataframes/get_eos_df.py +16 -4
  30. meta_analytics/dataframes/get_glucose_df.py +166 -0
  31. meta_analytics/dataframes/get_glucose_fbg_df.py +26 -0
  32. meta_analytics/dataframes/get_glucose_fbg_ogtt_df.py +21 -0
  33. meta_analytics/dataframes/get_last_imp_visits_df.py +12 -10
  34. meta_analytics/dataframes/glucose_endpoints/__init__.py +2 -0
  35. meta_analytics/dataframes/glucose_endpoints/endpoint_by_date.py +125 -124
  36. meta_analytics/dataframes/glucose_endpoints/glucose_endpoints_by_date.py +111 -235
  37. meta_analytics/dataframes/screening/__init__.py +2 -0
  38. meta_analytics/dataframes/screening/get_glucose_tested_only_df.py +1 -2
  39. meta_analytics/dataframes/screening/get_screening_df.py +9 -15
  40. meta_analytics/dataframes/utils.py +21 -12
  41. meta_analytics/get_tables.py +1 -2
  42. meta_analytics/tables/__init__.py +2 -0
  43. meta_analytics/tables/enrolled/glucose.py +2 -1
  44. meta_analytics/utils.py +81 -0
  45. meta_auth/auths.py +1 -1
  46. meta_consent/action_items.py +22 -3
  47. meta_consent/admin/__init__.py +7 -0
  48. meta_consent/admin/actions/__init__.py +2 -0
  49. meta_consent/admin/actions/create_missing_prescriptions.py +2 -2
  50. meta_consent/admin/list_filters.py +22 -0
  51. meta_consent/admin/modeladmin_mixins.py +4 -5
  52. meta_consent/admin/subject_consent_v1_ext_admin.py +93 -0
  53. meta_consent/baker_recipes.py +7 -7
  54. meta_consent/consents.py +15 -2
  55. meta_consent/constants.py +1 -0
  56. meta_consent/form_validators/__init__.py +2 -0
  57. meta_consent/forms/__init__.py +8 -0
  58. meta_consent/forms/subject_consent_v1_ext_form.py +47 -0
  59. meta_consent/forms/subject_reconsent_form.py +4 -4
  60. meta_consent/management/commands/create_missing_prescriptions.py +5 -3
  61. meta_consent/migrations/0001_initial.py +9 -9
  62. meta_consent/migrations/0024_historicalsubjectconsentv1.py +3 -8
  63. meta_consent/migrations/0026_historicalsubjectconsentv1ext_subjectconsentv1ext.py +535 -0
  64. meta_consent/migrations/0027_auto_20250111_0344.py +30 -0
  65. meta_consent/migrations/0028_historicalsubjectconsentv1ext_assessment_score_and_more.py +162 -0
  66. meta_consent/migrations/0029_alter_historicalsubjectconsentv1ext_agrees_to_extension_and_more.py +33 -0
  67. meta_consent/migrations/0030_auto_20250120_2114.py +40 -0
  68. meta_consent/migrations/0031_alter_historicalsubjectconsent_guardian_name_and_more.py +124 -0
  69. meta_consent/migrations/0032_alter_historicalsubjectconsent_device_created_and_more.py +678 -0
  70. meta_consent/migrations/0033_historicalsubjectconsentspfq_subjectconsentspfq.py +615 -0
  71. meta_consent/migrations/0034_remove_subjectconsentspfq_site_and_more.py +23 -0
  72. meta_consent/migrations/0035_alter_historicalsubjectconsent_consent_definition_name_and_more.py +43 -0
  73. meta_consent/models/__init__.py +10 -0
  74. meta_consent/models/model_mixins.py +1 -2
  75. meta_consent/models/signals.py +25 -11
  76. meta_consent/models/subject_consent.py +2 -2
  77. meta_consent/models/subject_consent_v1.py +0 -1
  78. meta_consent/models/subject_consent_v1_ext.py +34 -0
  79. meta_consent/models/subject_reconsent.py +4 -4
  80. meta_dashboard/navbars.py +2 -6
  81. meta_dashboard/patterns.py +1 -1
  82. meta_dashboard/templates/meta_dashboard/{bootstrap3/buttons → buttons}/eligibility_button.html +1 -1
  83. meta_dashboard/templates/meta_dashboard/{bootstrap3/buttons → buttons}/screening_button.html +1 -1
  84. meta_dashboard/templates/meta_dashboard/subject/dashboard/sidebar.html +24 -0
  85. meta_dashboard/templates/meta_dashboard/{bootstrap3/subject → subject}/dashboard/top_bar.html +1 -1
  86. meta_dashboard/templates/meta_dashboard/subject/dashboard.html +14 -0
  87. meta_dashboard/templatetags/meta_dashboard_extras.py +9 -14
  88. meta_dashboard/urls.py +5 -5
  89. meta_dashboard/view_utils/__init__.py +13 -0
  90. meta_dashboard/view_utils/subject_screening_button.py +13 -20
  91. meta_dashboard/views/__init__.py +8 -0
  92. meta_dashboard/views/ae/__init__.py +2 -0
  93. meta_dashboard/views/ae/ae_listboard_view.py +1 -1
  94. meta_dashboard/views/ae/death_report_listboard_view.py +1 -1
  95. meta_dashboard/views/screening/__init__.py +2 -0
  96. meta_dashboard/views/screening/listboard_view.py +2 -3
  97. meta_dashboard/views/subject/__init__.py +2 -0
  98. meta_dashboard/views/subject/dashboard/__init__.py +2 -0
  99. meta_dashboard/views/subject/dashboard/dashboard_view.py +19 -8
  100. meta_dashboard/views/subject/listboard/__init__.py +2 -0
  101. meta_dashboard/views/subject/listboard/listboard_view.py +2 -3
  102. meta_edc/__init__.py +5 -9
  103. meta_edc/admin.py +3 -4
  104. meta_edc/celery.py +2 -2
  105. meta_edc/celery_live.py +19 -0
  106. meta_edc/celery_uat.py +25 -0
  107. meta_edc/management/commands/update_forms_reference.py +16 -14
  108. meta_edc/meta_version.py +2 -2
  109. meta_edc/navbars.py +7 -5
  110. meta_edc/settings/debug.py +13 -4
  111. meta_edc/settings/defaults.py +55 -18
  112. meta_edc/settings/live.py +4 -1
  113. meta_edc/settings/logging.py +9 -4
  114. meta_edc/settings/minimal.py +4 -5
  115. meta_edc/settings/uat.py +3 -1
  116. meta_edc/templates/meta_edc/{bootstrap3/base.html → base.html} +1 -1
  117. meta_edc/templates/meta_edc/{bootstrap3/home.html → home.html} +2 -2
  118. meta_edc/urls.py +3 -1
  119. meta_edc/utils.py +3 -1
  120. meta_edc/views/__init__.py +2 -0
  121. meta_edc/views/home_view.py +1 -2
  122. meta_edc-1.4.0.dist-info/METADATA +174 -0
  123. {meta_edc-0.3.39.dist-info → meta_edc-1.4.0.dist-info}/RECORD +578 -586
  124. meta_edc-1.4.0.dist-info/WHEEL +4 -0
  125. meta_labs/list_data.py +2 -2
  126. meta_labs/reportables.py +80 -11
  127. meta_lists/list_data.py +13 -4
  128. meta_lists/migrations/0008_auto_20200528_1517.py +2 -2
  129. meta_lists/migrations/0019_auto_20250128_0143.py +48 -0
  130. meta_lists/migrations/0020_alter_abnormalfootappearanceobservations_extra_value_and_more.py +404 -0
  131. meta_pharmacy/admin/__init__.py +5 -0
  132. meta_pharmacy/admin/rx_admin.py +1 -0
  133. meta_pharmacy/admin/substitutions_admin.py +3 -3
  134. meta_pharmacy/constants.py +1 -1
  135. meta_pharmacy/forms/__init__.py +2 -0
  136. meta_pharmacy/forms/rx_form.py +0 -1
  137. meta_pharmacy/forms/substitutions_form.py +6 -4
  138. meta_pharmacy/labels/__init__.py +5 -2
  139. meta_pharmacy/labels/draw_label_for_subject_with_barcode.py +4 -1
  140. meta_pharmacy/labels/draw_label_with_test_data.py +2 -2
  141. meta_pharmacy/labels/label_data.py +1 -2
  142. meta_pharmacy/labels/print_sheets.py +4 -6
  143. meta_pharmacy/management/commands/update_initial_pharmacy_data.py +4 -3
  144. meta_pharmacy/migrations/0002_initial.py +7 -20
  145. meta_pharmacy/migrations/0003_auto_20240909_2335.py +3 -2
  146. meta_pharmacy/migrations/0006_lotnumber_label.py +5 -14
  147. meta_pharmacy/migrations/0008_remove_lotnumber_medication_and_more.py +5 -6
  148. meta_pharmacy/migrations/0010_alter_historicallabeldata_device_created_and_more.py +382 -0
  149. meta_pharmacy/models/__init__.py +7 -0
  150. meta_pharmacy/models/label_data.py +4 -5
  151. meta_pharmacy/models/rx_label.py +0 -1
  152. meta_pharmacy/models/substitutions.py +4 -4
  153. meta_pharmacy/prepare_meta_pharmacy.py +1 -1
  154. meta_pharmacy/utils/__init__.py +2 -0
  155. meta_pharmacy/utils/update_initial_pharmacy_data.py +1 -1
  156. meta_prn/action_items.py +44 -45
  157. meta_prn/admin/__init__.py +16 -0
  158. meta_prn/admin/dm_referral_admin.py +2 -1
  159. meta_prn/admin/end_of_study_admin.py +26 -15
  160. meta_prn/admin/loss_to_followup_admin.py +3 -2
  161. meta_prn/admin/off_study_medication_admin.py +5 -6
  162. meta_prn/admin/offschedule_admin.py +12 -11
  163. meta_prn/admin/offschedule_dm_referral_admin.py +11 -10
  164. meta_prn/admin/offschedule_postnatal_admin.py +15 -7
  165. meta_prn/admin/offschedule_pregnancy_admin.py +18 -9
  166. meta_prn/admin/onschedule_admin.py +7 -8
  167. meta_prn/admin/onschedule_dm_referral_admin.py +11 -12
  168. meta_prn/admin/pregnancy_notification_admin.py +5 -6
  169. meta_prn/admin/protocol_incident_admin.py +1 -1
  170. meta_prn/admin/subject_transfer_admin.py +1 -1
  171. meta_prn/baker_recipes.py +10 -10
  172. meta_prn/choices.py +11 -7
  173. meta_prn/constants.py +1 -0
  174. meta_prn/form_validators/__init__.py +5 -0
  175. meta_prn/form_validators/end_of_study.py +65 -20
  176. meta_prn/form_validators/protocol_incident.py +1 -1
  177. meta_prn/forms/__init__.py +13 -0
  178. meta_prn/forms/dm_referral_form.py +2 -8
  179. meta_prn/forms/end_of_study_form.py +1 -1
  180. meta_prn/forms/loss_to_followup_form.py +1 -1
  181. meta_prn/forms/off_study_medication_form.py +2 -2
  182. meta_prn/forms/offschedule_form.py +25 -0
  183. meta_prn/forms/pregnancy_notification_form.py +15 -17
  184. meta_prn/list_data.py +3 -3
  185. meta_prn/migrations/0001_initial.py +25 -25
  186. meta_prn/migrations/0017_auto_20220307_1929.py +5 -5
  187. meta_prn/migrations/0018_auto_20220309_2106.py +9 -9
  188. meta_prn/migrations/0021_auto_20220316_2147.py +13 -13
  189. meta_prn/migrations/0022_auto_20220318_0133.py +9 -9
  190. meta_prn/migrations/0032_historicalegfrnotification_egfrnotification.py +5 -13
  191. meta_prn/migrations/0034_auto_20220630_1110.py +1 -1
  192. meta_prn/migrations/0035_auto_20220630_1140.py +1 -1
  193. meta_prn/migrations/0038_alter_endofstudy_delivery_date_and_more.py +5 -13
  194. meta_prn/migrations/0041_endofstudy_transfer_date_and_more.py +5 -13
  195. meta_prn/migrations/0057_historicalonscheduledmreferral_and_more.py +13 -38
  196. meta_prn/migrations/0060_alter_onschedule_managers_and_more.py +55 -0
  197. meta_prn/migrations/0061_auto_20250115_2025.py +56 -0
  198. meta_prn/migrations/0062_alter_endofstudy_offstudy_reason_and_more.py +72 -0
  199. meta_prn/migrations/0063_historicaloffstudymedication_singleton_field_and_more.py +37 -0
  200. meta_prn/migrations/0064_auto_20250602_2143.py +18 -0
  201. meta_prn/migrations/0065_alter_historicaloffstudymedication_subject_identifier_and_more.py +23 -0
  202. meta_prn/migrations/0066_alter_historicallosstofollowup_subject_identifier_and_more.py +23 -0
  203. meta_prn/migrations/0067_alter_offschedule_managers_and_more.py +2557 -0
  204. meta_prn/migrations/0068_alter_dmreferral_referral_note_and_more.py +235 -0
  205. meta_prn/migrations/0069_alter_historicaloffstudymedication_singleton_field_and_more.py +37 -0
  206. meta_prn/models/__init__.py +20 -0
  207. meta_prn/models/dm_referral.py +2 -2
  208. meta_prn/models/end_of_study.py +28 -23
  209. meta_prn/models/loss_to_followup.py +8 -10
  210. meta_prn/models/off_study_medication.py +7 -4
  211. meta_prn/models/offschedule.py +4 -4
  212. meta_prn/models/pregnancy_notification.py +3 -5
  213. meta_prn/models/protocol_incident.py +5 -2
  214. meta_prn/models/signals.py +16 -14
  215. meta_prn/models/subject_transfer.py +7 -0
  216. meta_prn/templates/meta_prn/eos/additional_instructions.html +3 -0
  217. meta_prn/templates/meta_prn/offschedule/additional_instructions.html +2 -0
  218. meta_rando/migrations/0001_initial.py +5 -5
  219. meta_rando/migrations/0006_alter_historicalrandomizationlist_allocated_user_and_more.py +130 -0
  220. meta_rando/migrations/0007_spfqlist.py +197 -0
  221. meta_rando/migrations/0008_delete_spfqlist.py +16 -0
  222. meta_rando/models/__init__.py +1 -0
  223. meta_rando/{models.py → models/randomization_list.py} +3 -3
  224. meta_rando/randomizers.py +2 -2
  225. meta_reports/__init__.py +2 -0
  226. meta_reports/admin/__init__.py +16 -0
  227. meta_reports/admin/dbviews/__init__.py +13 -0
  228. meta_reports/admin/dbviews/glucose_summary_admin.py +7 -7
  229. meta_reports/admin/dbviews/imp_substitutions_admin.py +14 -13
  230. meta_reports/admin/dbviews/missing_screening_ogtt_admin/__init__.py +5 -0
  231. meta_reports/admin/dbviews/missing_screening_ogtt_admin/note_model_admin.py +27 -3
  232. meta_reports/admin/dbviews/missing_screening_ogtt_admin/unmanaged_model_admin.py +7 -7
  233. meta_reports/admin/dbviews/on_study_missing_lab_values_admin/__init__.py +2 -0
  234. meta_reports/admin/dbviews/on_study_missing_lab_values_admin/unmanaged_model_admin.py +0 -3
  235. meta_reports/admin/dbviews/on_study_missing_values_admin/__init__.py +2 -0
  236. meta_reports/admin/dbviews/on_study_missing_values_admin/unmanaged_model_admin.py +0 -1
  237. meta_reports/admin/dbviews/patient_history_missing_baseline_cd4_admin.py +9 -9
  238. meta_reports/admin/dbviews/unattended_three_in_row2_admin.py +6 -6
  239. meta_reports/admin/dbviews/unattended_three_in_row_admin.py +5 -5
  240. meta_reports/admin/dbviews/unattended_two_in_row_admin.py +5 -5
  241. meta_reports/admin/endpoints_admin.py +1 -1
  242. meta_reports/admin/endpoints_all_admin.py +0 -1
  243. meta_reports/admin/last_imp_refill_admin.py +33 -36
  244. meta_reports/admin/list_filters.py +3 -3
  245. meta_reports/admin/modeladmin_mixins.py +10 -17
  246. meta_reports/death_report.py +2 -2
  247. meta_reports/forms/__init__.py +2 -0
  248. meta_reports/forms/missing_ogtt_note_form.py +3 -4
  249. meta_reports/management/commands/generate_endpoints.py +5 -4
  250. meta_reports/migrations/0035_historicalmissingogttnote_missingogttnote.py +5 -14
  251. meta_reports/migrations/0054_auto_20250422_2003.py +81 -0
  252. meta_reports/migrations/0055_alter_glucosesummary_table.py +17 -0
  253. meta_reports/migrations/0056_auto_20250422_2214.py +54 -0
  254. meta_reports/migrations/0057_auto_20250422_2224.py +54 -0
  255. meta_reports/migrations/0058_auto_20250422_2232.py +54 -0
  256. meta_reports/migrations/0059_alter_endpoints_created_and_more.py +161 -0
  257. meta_reports/migrations/0060_auto_20250926_0242.py +366 -0
  258. meta_reports/migrations/0061_auto_20251004_0043.py +21 -0
  259. meta_reports/migrations/0062_auto_20251004_0106.py +21 -0
  260. meta_reports/models/__init__.py +17 -0
  261. meta_reports/models/dbviews/__init__.py +14 -0
  262. meta_reports/models/dbviews/glucose_summary/__init__.py +2 -0
  263. meta_reports/models/dbviews/glucose_summary/unmanaged_model.py +15 -3
  264. meta_reports/models/dbviews/glucose_summary/view_definition.py +8 -5
  265. meta_reports/models/dbviews/imp_substitutions/__init__.py +2 -0
  266. meta_reports/models/dbviews/imp_substitutions/unmanaged_model.py +1 -2
  267. meta_reports/models/dbviews/imp_substitutions/view_definition.py +1 -1
  268. meta_reports/models/dbviews/missing_screening_ogtt/__init__.py +2 -0
  269. meta_reports/models/dbviews/missing_screening_ogtt/note_model.py +2 -2
  270. meta_reports/models/dbviews/missing_screening_ogtt/unmanaged_model.py +4 -3
  271. meta_reports/models/dbviews/on_study_missing_lab_values/__init__.py +2 -0
  272. meta_reports/models/dbviews/on_study_missing_lab_values/qa_cases.py +13 -11
  273. meta_reports/models/dbviews/on_study_missing_lab_values/unmanged_model.py +0 -1
  274. meta_reports/models/dbviews/on_study_missing_values/__init__.py +2 -0
  275. meta_reports/models/dbviews/on_study_missing_values/qa_cases.py +19 -1
  276. meta_reports/models/dbviews/on_study_missing_values/unmanged_model.py +0 -1
  277. meta_reports/models/dbviews/patient_history_missing_baseline_cd4/__init__.py +2 -0
  278. meta_reports/models/dbviews/patient_history_missing_baseline_cd4/unmanaged_model.py +0 -1
  279. meta_reports/models/dbviews/unattended_three_in_row/__init__.py +2 -0
  280. meta_reports/models/dbviews/unattended_three_in_row/unmanaged_model.py +0 -1
  281. meta_reports/models/dbviews/unattended_three_in_row2/__init__.py +2 -0
  282. meta_reports/models/dbviews/unattended_three_in_row2/unmanaged_model.py +0 -1
  283. meta_reports/models/dbviews/unattended_two_in_row/__init__.py +2 -0
  284. meta_reports/models/dbviews/unattended_two_in_row/unmanaged_model.py +0 -1
  285. meta_reports/models/endpoints.py +8 -4
  286. meta_reports/models/last_imp_refill.py +2 -3
  287. meta_reports/pdf_report.py +2 -2
  288. meta_reports/tasks.py +4 -3
  289. meta_reports/templates/meta_reports/columns/subject_identifier_column.html +1 -1
  290. meta_reports/templates/meta_reports/endpoints_all_change_list_note.html +1 -1
  291. meta_reports/templates/meta_reports/endpoints_change_list_note.html +1 -1
  292. meta_reports/templates/meta_reports/last_imp_refill/changelist_note.html +13 -0
  293. meta_screening/admin/__init__.py +8 -0
  294. meta_screening/admin/fieldsets.py +13 -15
  295. meta_screening/admin/list_filters.py +7 -5
  296. meta_screening/admin/screening_part_one_admin.py +1 -3
  297. meta_screening/admin/screening_part_three_admin.py +2 -3
  298. meta_screening/admin/screening_part_two_admin.py +7 -10
  299. meta_screening/admin/subject_refusal_admin.py +5 -3
  300. meta_screening/admin/subject_screening_admin.py +21 -10
  301. meta_screening/baker_recipes.py +18 -10
  302. meta_screening/calculators.py +1 -1
  303. meta_screening/choices.py +1 -1
  304. meta_screening/constants.py +1 -1
  305. meta_screening/eligibility/__init__.py +9 -0
  306. meta_screening/eligibility/eligibility.py +21 -14
  307. meta_screening/eligibility/eligibility_part_one.py +1 -1
  308. meta_screening/eligibility/eligibility_part_three/__init__.py +2 -0
  309. meta_screening/eligibility/eligibility_part_three/base_eligibility_part_three.py +68 -49
  310. meta_screening/eligibility/eligibility_part_three/eligibility_part_three_phase_three.py +14 -15
  311. meta_screening/eligibility/eligibility_part_two.py +1 -1
  312. meta_screening/form_validators/__init__.py +8 -0
  313. meta_screening/form_validators/screening_part_one.py +1 -1
  314. meta_screening/form_validators/screening_part_three.py +6 -2
  315. meta_screening/form_validators/screening_part_two.py +1 -1
  316. meta_screening/form_validators/subject_refusal.py +1 -1
  317. meta_screening/forms/__init__.py +20 -0
  318. meta_screening/forms/field_lists.py +16 -18
  319. meta_screening/forms/screening_part_one_form.py +2 -2
  320. meta_screening/forms/screening_part_three_form.py +5 -3
  321. meta_screening/forms/screening_part_two_form.py +1 -5
  322. meta_screening/forms/subject_refusal_form.py +0 -4
  323. meta_screening/forms/subject_screening_form.py +0 -4
  324. meta_screening/migrations/0001_initial.py +15 -15
  325. meta_screening/migrations/0010_auto_20191106_0828.py +5 -5
  326. meta_screening/migrations/0012_auto_20191107_0427.py +1 -1
  327. meta_screening/migrations/0068_alter_historicalscreeningpartone_acute_condition_and_more.py +1579 -0
  328. meta_screening/model_mixins/__init__.py +8 -0
  329. meta_screening/model_mixins/calculated_model_mixin.py +2 -2
  330. meta_screening/model_mixins/creatinine_fields_model_mixin.py +1 -1
  331. meta_screening/model_mixins/eligibility_model_mixin.py +6 -4
  332. meta_screening/model_mixins/part_one_fields_model_mixin.py +16 -19
  333. meta_screening/model_mixins/part_three_fields_model_mixin.py +6 -7
  334. meta_screening/model_mixins/part_two_fields_model_mixin.py +19 -17
  335. meta_screening/models/__init__.py +9 -0
  336. meta_screening/models/icp_referral.py +5 -5
  337. meta_screening/models/proxy_models.py +1 -1
  338. meta_screening/models/signals.py +10 -11
  339. meta_screening/models/subject_refusal.py +1 -1
  340. meta_screening/models/subject_screening.py +2 -4
  341. meta_subject/action_items.py +18 -14
  342. meta_subject/admin/__init__.py +42 -0
  343. meta_subject/admin/birth_outcome_admin.py +7 -9
  344. meta_subject/admin/blood_results/__init__.py +9 -0
  345. meta_subject/admin/blood_results/blood_results_fbc_admin.py +1 -1
  346. meta_subject/admin/blood_results/blood_results_hba1c_admin.py +1 -1
  347. meta_subject/admin/blood_results/blood_results_ins_admin.py +1 -1
  348. meta_subject/admin/blood_results/blood_results_lft_admin.py +1 -1
  349. meta_subject/admin/blood_results/blood_results_lipids_admin.py +1 -1
  350. meta_subject/admin/blood_results/blood_results_rft_admin.py +3 -5
  351. meta_subject/admin/complications_glycemia_admin.py +1 -1
  352. meta_subject/admin/delivery_admin.py +8 -11
  353. meta_subject/admin/diabetes/__init__.py +2 -0
  354. meta_subject/admin/diabetes/dm_endpoint_admin.py +2 -2
  355. meta_subject/admin/diabetes/dm_followup_admin.py +3 -2
  356. meta_subject/admin/egfr_drop_notification_admin.py +1 -1
  357. meta_subject/admin/fields.py +5 -5
  358. meta_subject/admin/fieldsets.py +5 -5
  359. meta_subject/admin/followup_examination_admin.py +11 -9
  360. meta_subject/admin/followup_vitals_admin.py +31 -6
  361. meta_subject/admin/glucose_admin.py +4 -8
  362. meta_subject/admin/glucose_fbg_admin.py +18 -11
  363. meta_subject/admin/health_economics/__init__.py +2 -0
  364. meta_subject/admin/health_economics/health_economics_simple_admin.py +1 -1
  365. meta_subject/admin/health_economics/health_economics_update_admin.py +1 -1
  366. meta_subject/admin/hepatitis_test_admin.py +1 -1
  367. meta_subject/admin/hiv_exit_review_admin.py +55 -0
  368. meta_subject/admin/list_filters.py +5 -5
  369. meta_subject/admin/mnsi_admin.py +7 -5
  370. meta_subject/admin/next_appointment_admin.py +19 -0
  371. meta_subject/admin/other_arv_regimens_admin.py +3 -3
  372. meta_subject/admin/patient_history_admin.py +4 -4
  373. meta_subject/admin/physical_exam_admin.py +1 -1
  374. meta_subject/admin/pregnancy_update_admin.py +1 -1
  375. meta_subject/admin/study_medication_admin.py +8 -15
  376. meta_subject/admin/subject_requisition_admin.py +2 -2
  377. meta_subject/admin/subject_visit_admin.py +1 -1
  378. meta_subject/admin/subject_visit_missed_admin.py +1 -1
  379. meta_subject/admin/urine_dipstick_test_admin.py +1 -1
  380. meta_subject/admin/urine_pregnancy_admin.py +1 -1
  381. meta_subject/baker_recipes.py +15 -15
  382. meta_subject/choices.py +4 -3
  383. meta_subject/form_validators/__init__.py +15 -0
  384. meta_subject/form_validators/delivery_form_validator.py +3 -3
  385. meta_subject/form_validators/dm_endpoint_form_validator.py +3 -1
  386. meta_subject/form_validators/dm_followup_form_validator.py +8 -7
  387. meta_subject/form_validators/egfr_drop_notification_form_validator.py +1 -1
  388. meta_subject/form_validators/followup_examination_form_validator.py +1 -1
  389. meta_subject/form_validators/glucose_fbg_form_validator.py +76 -0
  390. meta_subject/form_validators/glucose_form_validator.py +10 -67
  391. meta_subject/form_validators/hiv_exit_review_form_validator.py +18 -0
  392. meta_subject/form_validators/mixins.py +95 -0
  393. meta_subject/forms/__init__.py +44 -0
  394. meta_subject/forms/blood_results/__init__.py +9 -0
  395. meta_subject/forms/blood_results/blood_results_hba1c_form.py +1 -1
  396. meta_subject/forms/blood_results/blood_results_rft_form.py +60 -4
  397. meta_subject/forms/delivery_form.py +2 -0
  398. meta_subject/forms/diabetes/__init__.py +2 -0
  399. meta_subject/forms/diabetes/dm_followup_form.py +2 -2
  400. meta_subject/forms/followup_vitals_form.py +27 -1
  401. meta_subject/forms/glucose_fbg_form.py +1 -46
  402. meta_subject/forms/health_economics/__init__.py +2 -0
  403. meta_subject/forms/hepatitis_test_form.py +1 -1
  404. meta_subject/forms/hiv_exit_review_form.py +13 -0
  405. meta_subject/forms/mixins.py +1 -1
  406. meta_subject/forms/next_appointment_form.py +36 -0
  407. meta_subject/forms/other_arv_regimens_form.py +1 -1
  408. meta_subject/forms/patient_history_form.py +1 -1
  409. meta_subject/forms/physical_exam_form.py +1 -1
  410. meta_subject/forms/pregnancy_update_form.py +1 -1
  411. meta_subject/forms/slider_widget.py +1 -1
  412. meta_subject/forms/study_medication_form.py +18 -12
  413. meta_subject/forms/subject_requisition_form.py +1 -1
  414. meta_subject/forms/subject_visit_missed_form.py +1 -1
  415. meta_subject/forms/urine_dipstick_test_form.py +1 -1
  416. meta_subject/forms/urine_pregnancy_form.py +1 -1
  417. meta_subject/management/commands/create_missing_refills.py +3 -3
  418. meta_subject/management/commands/create_missing_rx.py +2 -2
  419. meta_subject/management/commands/missed.py +20 -23
  420. meta_subject/metadata_rules/__init__.py +2 -0
  421. meta_subject/metadata_rules/metadata_rules.py +14 -0
  422. meta_subject/metadata_rules/predicates.py +44 -25
  423. meta_subject/migrations/0001_initial.py +61 -61
  424. meta_subject/migrations/0002_auto_20191021_0353.py +5 -5
  425. meta_subject/migrations/0012_auto_20200118_2334.py +5 -5
  426. meta_subject/migrations/0014_auto_20200120_1622.py +5 -5
  427. meta_subject/migrations/0018_coronakap_historicalcoronakap.py +5 -5
  428. meta_subject/migrations/0033_auto_20200516_2356.py +5 -5
  429. meta_subject/migrations/0038_auto_20200520_0020.py +5 -5
  430. meta_subject/migrations/0040_auto_20200527_2155.py +1 -1
  431. meta_subject/migrations/0045_auto_20200530_1801.py +1 -1
  432. meta_subject/migrations/0051_auto_20200617_2117.py +5 -5
  433. meta_subject/migrations/0063_auto_20210715_0337.py +5 -5
  434. meta_subject/migrations/0066_auto_20210721_0335.py +9 -9
  435. meta_subject/migrations/0067_auto_20210726_0340.py +5 -5
  436. meta_subject/migrations/0068_auto_20210728_1809.py +5 -5
  437. meta_subject/migrations/0072_auto_20210805_1545.py +7 -7
  438. meta_subject/migrations/0073_auto_20210809_0055.py +5 -5
  439. meta_subject/migrations/0077_auto_20210809_2323.py +3 -3
  440. meta_subject/migrations/0082_auto_20210823_1612.py +3 -3
  441. meta_subject/migrations/0083_auto_20210823_1620.py +3 -3
  442. meta_subject/migrations/0088_auto_20210924_0027.py +5 -5
  443. meta_subject/migrations/0090_auto_20210924_0424.py +5 -5
  444. meta_subject/migrations/0093_auto_20211117_0352.py +5 -5
  445. meta_subject/migrations/0095_auto_20220128_1719.py +5 -5
  446. meta_subject/migrations/0098_auto_20220309_2106.py +5 -5
  447. meta_subject/migrations/0101_auto_20220316_2147.py +13 -13
  448. meta_subject/migrations/0107_auto_20220415_0043.py +1 -1
  449. meta_subject/migrations/0115_historicalegfrnotification_egfrnotification.py +5 -13
  450. meta_subject/migrations/0128_auto_20220720_0055.py +1 -1
  451. meta_subject/migrations/0131_auto_20220722_0411.py +1 -1
  452. meta_subject/migrations/0135_auto_20220722_2212.py +2 -1
  453. meta_subject/migrations/0164_dmreferralfollowup_historicaldmreferralfollowup.py +5 -5
  454. meta_subject/migrations/0172_remove_historicalbloodresultsglu_action_item_and_more.py +1 -2
  455. meta_subject/migrations/0177_alter_bloodresultslft_alp_value_and_more.py +1 -2
  456. meta_subject/migrations/0178_historicalhealtheconomicsupdate_and_more.py +5 -14
  457. meta_subject/migrations/0186_healtheconomicsupdate_singleton_field_and_more.py +1 -2
  458. meta_subject/migrations/0187_dmdiagnosis_historicaldmdiagnosis_dmdxresult_and_more.py +5 -14
  459. meta_subject/migrations/0188_historicaldmdxresult_dmdxresult.py +5 -14
  460. meta_subject/migrations/0199_auto_20240516_0247.py +1 -1
  461. meta_subject/migrations/0209_remove_historicaldmdxresult_dm_diagnosis_and_more.py +1 -2
  462. meta_subject/migrations/0212_auto_20240827_2222.py +1 -1
  463. meta_subject/migrations/0216_historicalnextappointment_nextappointment.py +553 -0
  464. meta_subject/migrations/0217_alter_historicalnextappointment_appt_datetime_and_more.py +42 -0
  465. meta_subject/migrations/0218_alter_historicalnextappointment_appt_date_and_more.py +53 -0
  466. meta_subject/migrations/0219_remove_historicalnextappointment_allow_create_interim_and_more.py +92 -0
  467. meta_subject/migrations/0220_historicalbloodresultsgludummy_bloodresultsgludummy.py +825 -0
  468. meta_subject/migrations/0221_auto_20250402_1913.py +42 -0
  469. meta_subject/migrations/0222_alter_historicalstudymedication_stock_codes_and_more.py +46 -0
  470. meta_subject/migrations/0223_bloodresultsfbc_errors_bloodresultsgludummy_errors_and_more.py +83 -0
  471. meta_subject/migrations/0224_bloodresultsfbc_abnormal_summary_and_more.py +153 -0
  472. meta_subject/migrations/0225_followupvitals_waist_circumference_and_more.py +46 -0
  473. meta_subject/migrations/0226_followupvitals_waist_circumference_comment_and_more.py +97 -0
  474. meta_subject/migrations/0227_alter_followupvitals_waist_circumference_comment_and_more.py +97 -0
  475. meta_subject/migrations/0228_bloodresultshba1c_hba1c_datetime_and_more.py +2518 -0
  476. meta_subject/migrations/0229_alter_glucosefbg_consent_model_and_more.py +1918 -0
  477. meta_subject/migrations/0230_alter_historicaldelivery_action_identifier_and_more.py +1733 -0
  478. meta_subject/migrations/0231_alter_historicalmedicationadherence_consent_model_and_more.py +2054 -0
  479. meta_subject/migrations/0232_alter_patienthistory_concomitant_conditions_and_more.py +1170 -0
  480. meta_subject/migrations/0233_historicalspfq_spfq.py +1066 -0
  481. meta_subject/migrations/0234_remove_spfq_site_remove_spfq_subject_visit_and_more.py +27 -0
  482. meta_subject/migrations/0235_glucosefbg_endpoint_today_and_more.py +606 -0
  483. meta_subject/migrations/0236_alter_historicalhivexitreview_other_current_arv_regimen_and_more.py +58 -0
  484. meta_subject/migrations/0237_historicalhivexitreview_singleton_field_and_more.py +68 -0
  485. meta_subject/migrations/0238_historicalhivexitreview_available_and_more.py +88 -0
  486. meta_subject/model_mixins/__init__.py +10 -0
  487. meta_subject/model_mixins/arv_history_model_mixin.py +3 -44
  488. meta_subject/model_mixins/arv_review_model_mixin.py +53 -0
  489. meta_subject/model_mixins/search_slug_model_mixin.py +1 -2
  490. meta_subject/model_mixins/vitals_fields_model_mixin.py +33 -0
  491. meta_subject/models/__init__.py +52 -0
  492. meta_subject/models/birth_outcomes.py +3 -3
  493. meta_subject/models/blood_results/__init__.py +11 -0
  494. meta_subject/models/blood_results/blood_results_glu.py +29 -0
  495. meta_subject/models/blood_results/blood_results_hba1c.py +0 -1
  496. meta_subject/models/blood_results/blood_results_ins.py +0 -1
  497. meta_subject/models/blood_results/blood_results_lft.py +0 -1
  498. meta_subject/models/delivery.py +4 -6
  499. meta_subject/models/diabetes/__init__.py +2 -0
  500. meta_subject/models/diabetes/dm_endpoint.py +5 -5
  501. meta_subject/models/diabetes/dm_followup.py +7 -8
  502. meta_subject/models/diet_and_lifestyle.py +2 -2
  503. meta_subject/models/followup_examination.py +12 -14
  504. meta_subject/models/glucose.py +5 -5
  505. meta_subject/models/glucose_fbg.py +17 -4
  506. meta_subject/models/health_economics/__init__.py +2 -0
  507. meta_subject/models/health_economics/health_economics.py +8 -8
  508. meta_subject/models/health_economics/health_economics_simple.py +2 -2
  509. meta_subject/models/health_economics/health_economics_update.py +3 -2
  510. meta_subject/models/hepatitis_test.py +2 -2
  511. meta_subject/models/hiv_exit_review.py +44 -0
  512. meta_subject/models/next_appointment.py +15 -0
  513. meta_subject/models/other_arv_regimens_detail.py +1 -1
  514. meta_subject/models/patient_history.py +6 -7
  515. meta_subject/models/physical_exam.py +2 -2
  516. meta_subject/models/pregnancy_update.py +1 -1
  517. meta_subject/models/signals.py +15 -13
  518. meta_subject/models/subject_visit.py +2 -2
  519. meta_subject/models/todo.txt +1 -1
  520. meta_subject/models/urine_dipstick_test.py +2 -2
  521. meta_subject/models/urine_pregnancy.py +1 -1
  522. meta_subject/static/meta_subject/slider.css +1 -1
  523. meta_subject/templates/meta_subject/endpoint_review_instructions.html +1 -1
  524. meta_subject/templates/meta_subject/widgets/slider.html +0 -1
  525. meta_visit_schedule/visit_schedules/__init__.py +2 -0
  526. meta_visit_schedule/visit_schedules/phase_three/__init__.py +2 -0
  527. meta_visit_schedule/visit_schedules/phase_three/crfs.py +34 -1
  528. meta_visit_schedule/visit_schedules/phase_three/schedule.py +4 -4
  529. meta_visit_schedule/visit_schedules/phase_three/schedule_dm_referral.py +1 -2
  530. meta_visit_schedule/visit_schedules/phase_three/schedule_pregnancy.py +2 -3
  531. meta_ae/tests/holidays.csv +0 -15
  532. meta_ae/tests/tests/test_actions.py +0 -127
  533. meta_ae/tests/urls.py +0 -10
  534. meta_analytics/dataframes/enrolled/__init__.py +0 -1
  535. meta_analytics/dataframes/enrolled/get_glucose_df.py +0 -122
  536. meta_analytics/tests/__init__.py +0 -0
  537. meta_analytics/tests/test_endpoints_by_date.py +0 -94
  538. meta_consent/tests/__init__.py +0 -0
  539. meta_consent/tests/holidays.csv +0 -15
  540. meta_consent/tests/tests/__init__.py +0 -0
  541. meta_consent/tests/tests/test_form_validators.py +0 -110
  542. meta_consent/tests/tests/test_subject_consent.py +0 -10
  543. meta_consent/tests/urls.py +0 -17
  544. meta_dashboard/templates/meta_dashboard/bootstrap3/subject/dashboard.html +0 -11
  545. meta_dashboard/tests/__init__.py +0 -0
  546. meta_dashboard/tests/admin.py +0 -22
  547. meta_dashboard/tests/holidays.csv +0 -15
  548. meta_dashboard/tests/tests/__init__.py +0 -0
  549. meta_dashboard/tests/urls.py +0 -55
  550. meta_edc/tests/__init__.py +0 -0
  551. meta_edc/tests/tests/__init__.py +0 -0
  552. meta_edc/tests/tests/test_endpoints.py +0 -554
  553. meta_edc-0.3.39.dist-info/AUTHORS +0 -0
  554. meta_edc-0.3.39.dist-info/METADATA +0 -766
  555. meta_edc-0.3.39.dist-info/WHEEL +0 -5
  556. meta_edc-0.3.39.dist-info/top_level.txt +0 -20
  557. meta_labs/tests/__init__.py +0 -0
  558. meta_labs/tests/test_labs.py +0 -27
  559. meta_labs/tests/test_reportables.py +0 -16
  560. meta_labs/tests/urls.py +0 -4
  561. meta_lists/tests/__init__.py +0 -0
  562. meta_lists/tests/test_lists.py +0 -8
  563. meta_pharmacy/admin/actions.py +0 -38
  564. meta_prn/tests/__init__.py +0 -0
  565. meta_prn/tests/tests/__init__.py +0 -0
  566. meta_prn/tests/tests/test_actions.py +0 -97
  567. meta_prn/tests/tests/test_dm_referral.py +0 -206
  568. meta_prn/tests/tests/test_manager_order.py +0 -14
  569. meta_prn/tests/tests/test_pregnancy_notification.py +0 -93
  570. meta_prn/tests/urls.py +0 -10
  571. meta_rando/tests/__init__.py +0 -0
  572. meta_rando/tests/tests/__init__.py +0 -0
  573. meta_rando/tests/tests/test_randomizers.py +0 -57
  574. meta_reports/tests/__init__.py +0 -0
  575. meta_reports/tests/test_reports.py +0 -35
  576. meta_reports/tests/test_sql_gen.py +0 -5
  577. meta_reports/tests/urls.py +0 -4
  578. meta_screening/offline_models.py +0 -3
  579. meta_screening/tests/__init__.py +0 -0
  580. meta_screening/tests/holidays.csv +0 -15
  581. meta_screening/tests/meta_test_case_mixin.py +0 -216
  582. meta_screening/tests/options.py +0 -127
  583. meta_screening/tests/tests/__init__.py +0 -0
  584. meta_screening/tests/tests/test_forms.py +0 -397
  585. meta_screening/tests/tests/test_screening_part_one.py +0 -108
  586. meta_screening/tests/tests/test_screening_part_three.py +0 -436
  587. meta_screening/tests/tests/test_screening_part_two.py +0 -84
  588. meta_sites/tests/__init__.py +0 -0
  589. meta_sites/tests/test_sites.py +0 -12
  590. meta_sites/tests/urls.py +0 -4
  591. meta_stats/__init__.py +0 -0
  592. meta_stats/incidence.py +0 -16
  593. meta_stats/models.py +0 -0
  594. meta_stats/tests/__init__.py +0 -0
  595. meta_stats/tests/tests/__init__.py +0 -0
  596. meta_stats/tests/tests/test_incidence.py +0 -10
  597. meta_subject/tests/__init__.py +0 -0
  598. meta_subject/tests/holidays.csv +0 -15
  599. meta_subject/tests/tests/__init__.py +0 -0
  600. meta_subject/tests/tests/test_egfr.py +0 -234
  601. meta_subject/tests/tests/test_fixes.py +0 -64
  602. meta_subject/tests/tests/test_followup.py +0 -52
  603. meta_subject/tests/tests/test_manager_order.py +0 -11
  604. meta_subject/tests/tests/test_medication_adherence.py +0 -75
  605. meta_subject/tests/tests/test_metadata_rules.py +0 -135
  606. meta_subject/tests/tests/test_mnsi.py +0 -317
  607. meta_subject/tests/tests/test_patient_history_form.py +0 -74
  608. meta_subject/tests/tests/test_physical_exam.py +0 -84
  609. meta_subject/tests/tests/test_sf12.py +0 -173
  610. meta_subject/tests/tests/test_study_medication.py +0 -230
  611. meta_subject/tests/urls.py +0 -24
  612. meta_visit_schedule/tests/__init__.py +0 -0
  613. meta_visit_schedule/tests/tests/__init__.py +0 -0
  614. meta_visit_schedule/tests/tests/test_schedule.py +0 -181
  615. meta_visit_schedule/tests/urls.py +0 -4
  616. tests/__init__.py +0 -0
  617. tests/etc/randomization_list.csv +0 -241
  618. tests/etc/randomization_list_phase_three.csv +0 -241
  619. tests/etc/user-aes-local.key +0 -0
  620. tests/etc/user-aes-restricted.key +0 -1
  621. tests/etc/user-rsa-local-private.pem +0 -27
  622. tests/etc/user-rsa-local-public.pem +0 -9
  623. tests/etc/user-rsa-restricted-private.pem +0 -27
  624. tests/etc/user-rsa-restricted-public.pem +0 -9
  625. tests/etc/user-salt-local.key +0 -0
  626. tests/etc/user-salt-restricted.key +0 -0
  627. tests/holidays.csv +0 -15
  628. tests/test_settings.py +0 -186
  629. /meta_ae/templates/meta_ae/{bootstrap3/ae_initial_description.html → aeinitial_description.html} +0 -0
  630. /meta_dashboard/templates/meta_dashboard/{bootstrap3/buttons → buttons}/add_consent_button.html +0 -0
  631. /meta_dashboard/templates/meta_dashboard/{bootstrap3/buttons → buttons}/dashboard_button.html +0 -0
  632. /meta_dashboard/templates/meta_dashboard/{bootstrap3/buttons → buttons}/refusal_button.html +0 -0
  633. /meta_dashboard/templates/meta_dashboard/{bootstrap3/screening → screening}/listboard.html +0 -0
  634. /meta_dashboard/templates/meta_dashboard/{bootstrap3/subject → subject}/listboard.html +0 -0
  635. {meta_edc-0.3.39.dist-info → meta_edc-1.4.0.dist-info/licenses}/LICENSE +0 -0
  636. /meta_ae/tests/__init__.py → /meta_subject/management/__init__py.py +0 -0
  637. /meta_ae/tests/tests/__init__.py → /meta_subject/management/commands/__init__py.py +0 -0
meta_edc/__init__.py CHANGED
@@ -1,14 +1,10 @@
1
- import os
2
- from importlib.metadata import PackageNotFoundError, version
1
+ import importlib.metadata
3
2
 
4
3
  from .celery import app as celery_app
5
4
 
6
5
  try:
7
- __version__ = version(os.getcwd().split(os.sep)[-1])
8
- except PackageNotFoundError:
9
- __version__ = None
6
+ __version__ = importlib.metadata.version(__package__)
7
+ except importlib.metadata.PackageNotFoundError:
8
+ __version__ = "unknown"
10
9
 
11
-
12
- __all__ = ["celery_app", "__version__"]
13
-
14
- os.environ.setdefault("DJANGO_SETTINGS_MODULE", "meta_edc.settings.debug")
10
+ __all__ = ["__version__", "celery_app"]
meta_edc/admin.py CHANGED
@@ -1,13 +1,12 @@
1
1
  from django.contrib.admin import AdminSite as DjangoAdminSite
2
- from edc_dashboard.utils import get_bootstrap_version
3
2
 
4
3
  from .apps import AppConfig
5
4
 
6
5
 
7
6
  class AdminSite(DjangoAdminSite):
8
7
  app_index_template = "edc_model_admin/admin/app_index.html"
9
- login_template = f"edc_auth/bootstrap{get_bootstrap_version()}/login.html"
10
- logout_template = f"edc_auth/bootstrap{get_bootstrap_version()}/login.html"
8
+ login_template = "edc_auth/login.html"
9
+ logout_template = "edc_auth/login.html"
11
10
  enable_nav_sidebar = False # DJ 3.1
12
11
  final_catch_all_view = True # DJ 3.2
13
12
  site_title = AppConfig.verbose_name
@@ -19,7 +18,7 @@ class AdminSite(DjangoAdminSite):
19
18
  index_title = "Site administration"
20
19
  site_url = "/administration/"
21
20
 
22
- def __init__(self, **kwargs):
21
+ def __init__(self, **kwargs): # noqa: ARG002
23
22
  super().__init__(name="meta_edc")
24
23
 
25
24
 
meta_edc/celery.py CHANGED
@@ -1,4 +1,5 @@
1
1
  import os
2
+ import sys
2
3
 
3
4
  from celery import Celery
4
5
 
@@ -6,7 +7,6 @@ from celery import Celery
6
7
  os.environ.setdefault("DJANGO_SETTINGS_MODULE", "meta_edc.settings.debug")
7
8
 
8
9
  # config celery
9
- # app = Celery("meta_edc", include=["meta_reports", "edc_pharmacy"])
10
10
  app = Celery("meta_edc")
11
11
  app.config_from_object("django.conf:settings", namespace="CELERY")
12
12
  app.autodiscover_tasks()
@@ -14,4 +14,4 @@ app.autodiscover_tasks()
14
14
 
15
15
  @app.task(bind=True)
16
16
  def debug_task(self):
17
- print("Request: {0!r}".format(self.request))
17
+ sys.stdout.write(f"Request: {self.request!r}\n")
@@ -0,0 +1,19 @@
1
+ import os
2
+ import sys
3
+
4
+ from celery import Celery
5
+
6
+ # load settings
7
+ os.environ.setdefault("DJANGO_SETTINGS_MODULE", "meta_edc.settings.debug")
8
+
9
+ # config celery
10
+ app = Celery("meta_edc")
11
+ app.config_from_object("django.conf:settings", namespace="CELERY")
12
+ app.autodiscover_tasks()
13
+
14
+ # app.conf.task_routes = {"*": {"queue": "live_queue"}}
15
+
16
+
17
+ @app.task(bind=True)
18
+ def debug_task(self):
19
+ sys.stdout.write(f"Request: {self.request!r}\n")
meta_edc/celery_uat.py ADDED
@@ -0,0 +1,25 @@
1
+ import os
2
+ import sys
3
+
4
+ from celery import Celery
5
+
6
+ # from kombu import Queue
7
+
8
+ # load settings
9
+ os.environ.setdefault("DJANGO_SETTINGS_MODULE", "meta_edc.settings.debug")
10
+
11
+ # config celery
12
+ app = Celery("meta_edc")
13
+ app.config_from_object("django.conf:settings", namespace="CELERY")
14
+ app.autodiscover_tasks()
15
+
16
+ # app.conf.task_default_queue = "workuatq1"
17
+ # app.conf.task_queues = (Queue("workuatq1", routing_key="task.#"),)
18
+ # app.conf.task_default_exchange = "workuatq1"
19
+ # app.conf.task_default_exchange_type = "topic"
20
+ # app.conf.task_default_routing_key = "task.workuatq1"
21
+
22
+
23
+ @app.task(bind=True)
24
+ def debug_task(self):
25
+ sys.stdout.write(f"Request: {self.request!r}\n")
@@ -1,32 +1,34 @@
1
- import os
2
1
  import sys
3
2
 
4
3
  from django.conf import settings
5
4
  from django.core.management.base import BaseCommand
6
5
  from django.core.management.color import color_style
6
+ from edc_form_describer.forms_reference import FormsReference
7
7
 
8
- style = color_style()
9
-
8
+ from meta_subject.admin_site import meta_subject_admin
9
+ from meta_visit_schedule.visit_schedules import visit_schedule
10
10
 
11
- def update_forms_reference(sender=None, **kwargs):
12
- from edc_form_describer import FormsReference
11
+ style = color_style()
13
12
 
14
- from meta_subject.admin_site import meta_subject_admin
15
- from meta_visit_schedule.visit_schedules import visit_schedule
16
13
 
14
+ def update_forms_reference(sender=None, **kwargs): # noqa: ARG001
17
15
  sys.stdout.write(
18
16
  style.MIGRATE_HEADING("Refreshing CRF reference document for meta_subject\n")
19
17
  )
20
- doc_folder = os.path.join(settings.BASE_DIR, "docs")
21
- if not os.path.exists(doc_folder):
22
- os.mkdir(doc_folder)
23
- forms = FormsReference(visit_schedules=[visit_schedule], admin_site=meta_subject_admin)
24
- path = os.path.join(doc_folder, "forms_reference.md")
25
- forms.to_file(path=path, overwrite=True)
18
+ doc_folder = settings.BASE_DIR / "docs"
19
+ if not doc_folder.exists():
20
+ doc_folder.mkdir()
21
+ forms = FormsReference(
22
+ visit_schedules=[visit_schedule],
23
+ admin_site=meta_subject_admin,
24
+ add_per_form_timestamp=False,
25
+ )
26
+ path = doc_folder / "forms_reference.md"
27
+ forms.to_file(path=path, overwrite=True, pad=0)
26
28
 
27
29
 
28
30
  class Command(BaseCommand):
29
31
  help = "Update forms reference document (.md)"
30
32
 
31
- def handle(self, *args, **options):
33
+ def handle(self, *args, **options): # noqa: ARG002
32
34
  update_forms_reference()
meta_edc/meta_version.py CHANGED
@@ -3,11 +3,11 @@ PHASE_THREE = 3
3
3
  PHASE_THREE_ONLY = "PHASE_THREE_ONLY"
4
4
 
5
5
 
6
- class InvalidMetaVersion(Exception):
6
+ class InvalidMetaVersion(Exception): # noqa: N818
7
7
  pass
8
8
 
9
9
 
10
10
  def get_meta_version():
11
- from django.conf import settings
11
+ from django.conf import settings # noqa: PLC0415
12
12
 
13
13
  return settings.META_PHASE
meta_edc/navbars.py CHANGED
@@ -12,19 +12,21 @@ from meta_dashboard.navbars import navbar as meta_dashboard_navbar
12
12
 
13
13
  navbar = Navbar(name=settings.APP_NAME)
14
14
 
15
- navbar_item = copy([item for item in lab_navbar.navbar_items if item.name == "specimens"][0])
15
+ navbar_item = copy(next(item for item in lab_navbar.navbar_items if item.name == "specimens"))
16
16
  navbar_item.active = False
17
17
  navbar_item.label = "Specimens"
18
18
  navbar.register(navbar_item)
19
19
 
20
20
  navbar.register(
21
- [item for item in meta_dashboard_navbar.navbar_items if item.name == "screened_subject"][0]
21
+ next(
22
+ item for item in meta_dashboard_navbar.navbar_items if item.name == "screened_subject"
23
+ )
22
24
  )
23
25
 
24
26
  navbar.register(
25
- [item for item in meta_dashboard_navbar.navbar_items if item.name == "consented_subject"][
26
- 0
27
- ]
27
+ next(
28
+ item for item in meta_dashboard_navbar.navbar_items if item.name == "consented_subject"
29
+ )
28
30
  )
29
31
 
30
32
  for navbar_item in review_navbar.navbar_items:
@@ -1,18 +1,23 @@
1
- import os # noqa
1
+ import os
2
+ import sys
2
3
 
3
4
  from multisite import SiteID
4
5
 
5
6
  from .defaults import * # noqa
6
7
 
7
- print(f"Settings file {__file__}")
8
+ sys.stdout.write(f"Settings file {__file__}\n")
8
9
 
10
+ # clear cache after changing site, for example:
11
+ # from django.core.cache import cache
12
+ # cache.clear()
9
13
  # TZ Sites:
10
- SITE_ID = SiteID(default=20) # Amana
14
+ # SITE_ID = SiteID(default=20) # Amana
11
15
  # SITE_ID = SiteID(default=10) # Hindu Mandal
12
16
  # SITE_ID = SiteID(default=40) # Mwananyamala
13
17
  # SITE_ID = SiteID(default=50) # Mbagala
14
18
  # SITE_ID = SiteID(default=60) # Mnazi-Moja
15
- # SITE_ID = SiteID(default=30) # Temeke
19
+ SITE_ID = SiteID(default=30) # Temeke
20
+
16
21
  INDEX_PAGE = "http://localhost:8000"
17
22
  EDC_SITES_UAT_DOMAIN = False
18
23
  DEBUG = True
@@ -36,3 +41,7 @@ if os.path.exists(BASE_DIR) and not os.path.exists(KEY_PATH): # noqa
36
41
  # if debugging, run `export DJANGO_DEBUG=True` before running runserver
37
42
  # CELERY_TASK_ALWAYS_EAGER = os.getenv("DJANGO_DEBUG", "False") == "True"
38
43
  # CELERY_TASK_EAGER_PROPAGATES = CELERY_TASK_ALWAYS_EAGER
44
+
45
+ EDC_PDF_REPORTS_WATERMARK_WORD = "SAMPLE"
46
+ EDC_PDF_REPORTS_WATERMARK_FONT = ("Helvetica", 100)
47
+ EDC_PHARMACY_LABEL_WATERMARK_WORD = "DO NOT USE"
@@ -2,11 +2,11 @@ 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
+ from urllib.parse import quote, urljoin
6
6
 
7
7
  import django
8
8
  import environ
9
- from edc_constants.constants import COMPLETE
9
+ from clinicedc_constants import COMPLETE
10
10
  from edc_constants.internationalization import EXTRA_LANG_INFO
11
11
  from edc_protocol_incident.constants import PROTOCOL_INCIDENT
12
12
  from edc_utils import get_datetime_from_env
@@ -19,7 +19,6 @@ env = environ.Env(
19
19
  DJANGO_AUTO_CREATE_KEYS=(bool, False),
20
20
  DJANGO_CSRF_COOKIE_SECURE=(bool, True),
21
21
  DJANGO_DEBUG=(bool, False),
22
- DJANGO_EDC_BOOTSTRAP=(int, 3),
23
22
  DJANGO_EMAIL_ENABLED=(bool, False),
24
23
  DJANGO_EMAIL_USE_TLS=(bool, True),
25
24
  DJANGO_LIVE_SYSTEM=(bool, False),
@@ -33,19 +32,37 @@ env = environ.Env(
33
32
  TWILIO_ENABLED=(bool, False),
34
33
  EDC_SITES_DOMAIN_SUFFIX="meta4.clinicedc.org",
35
34
  )
35
+ if os.getenv("DJANGO_BASE_DIR"):
36
+ # for deployed systems where meta-edc is pip installed.
37
+ # same dir as manage.py
38
+ BASE_DIR = Path(os.getenv("DJANGO_BASE_DIR"))
39
+ else:
40
+ # when running from a repo
41
+ BASE_DIR = Path(__file__).resolve().parent.parent.parent.parent
36
42
 
37
- BASE_DIR = Path(__file__).resolve().parent.parent.parent
38
- ENV_DIR = Path(__file__).resolve().parent.parent.parent
43
+ if os.getenv("DJANGO_ENV_DIR"):
44
+ ENV_DIR = Path(os.getenv("DJANGO_ENV_DIR"))
45
+ else:
46
+ ENV_DIR = Path(__file__).resolve().parent.parent.parent.parent
39
47
 
40
48
  # copy your .env file from .envs/ to BASE_DIR
41
49
  if "test" in sys.argv:
42
50
  env.read_env(ENV_DIR / ".env-tests")
43
- print(f"Reading env from {(BASE_DIR /'.env-tests')}") # noqa
51
+ print(f"Reading env from {(BASE_DIR / '.env-tests')}") # noqa
44
52
  else:
45
53
  if not (ENV_DIR / ".env").exists():
46
54
  raise FileExistsError(f"Environment file does not exist. Got `{(ENV_DIR / '.env')}`")
47
55
  env.read_env(ENV_DIR / ".env")
48
56
 
57
+ # django_revision
58
+ GIT_DIR = Path(env.str("EDC_REVISION_GIT_DIR", default=BASE_DIR))
59
+
60
+ # django_crypto_fields
61
+ KEY_PATH = env.str("DJANGO_KEY_FOLDER")
62
+ AUTO_CREATE_KEYS = env("DJANGO_AUTO_CREATE_KEYS")
63
+
64
+ EXPORT_FOLDER = env.str("DJANGO_EXPORT_FOLDER") or Path("~/").expanduser()
65
+
49
66
 
50
67
  LOGGING_ENABLED = env("DJANGO_LOGGING_ENABLED")
51
68
  if LOGGING_ENABLED:
@@ -61,6 +78,12 @@ SECRET_KEY = env.str("DJANGO_SECRET_KEY")
61
78
 
62
79
  APP_NAME = env.str("DJANGO_APP_NAME")
63
80
 
81
+ DJANGO_REVISION_IGNORE_WORKING_DIR = env.str("DJANGO_REVISION_IGNORE_WORKING_DIR")
82
+ if DJANGO_REVISION_IGNORE_WORKING_DIR:
83
+ # get the version from the package and not a git tag
84
+ # this overrides django_revision
85
+ REVISION = version(APP_NAME)
86
+
64
87
  LIVE_SYSTEM = env.str("DJANGO_LIVE_SYSTEM")
65
88
 
66
89
  ETC_DIR = env.str("DJANGO_ETC_FOLDER")
@@ -95,6 +118,7 @@ INSTALLED_APPS = [
95
118
  # "django_celery_results",
96
119
  "django_db_views",
97
120
  "fontawesomefree",
121
+ "rangefilter",
98
122
  "django_crypto_fields.apps.AppConfig",
99
123
  "django_revision.apps.AppConfig",
100
124
  # "django_extensions",
@@ -173,6 +197,7 @@ INSTALLED_APPS = [
173
197
  "meta_pharmacy.apps.AppConfig",
174
198
  "meta_screening.apps.AppConfig",
175
199
  "meta_sites.apps.AppConfig",
200
+ "meta_spfq.apps.AppConfig",
176
201
  "meta_edc.apps.AppConfig",
177
202
  "edc_appconfig.apps.AppConfig",
178
203
  ]
@@ -375,7 +400,6 @@ EDC_DASHBOARD_APP_LABEL = "meta_dashboard"
375
400
  EDC_NAVBAR_DEFAULT = env("EDC_NAVBAR_DEFAULT")
376
401
 
377
402
  # dashboards
378
- EDC_BOOTSTRAP = env("DJANGO_EDC_BOOTSTRAP")
379
403
  DASHBOARD_URL_NAMES = env.dict("DJANGO_DASHBOARD_URL_NAMES")
380
404
  DASHBOARD_BASE_TEMPLATES = env.dict("DJANGO_DASHBOARD_BASE_TEMPLATES")
381
405
  LAB_DASHBOARD_BASE_TEMPLATES = env.dict("DJANGO_LAB_DASHBOARD_BASE_TEMPLATES")
@@ -398,11 +422,25 @@ EDC_LABEL_BROWSER_PRINT_PAGE_AUTO_BACK = env("EDC_LABEL_BROWSER_PRINT_PAGE_AUTO_
398
422
 
399
423
  # edc_model_admin
400
424
  EDC_MODEL_ADMIN_CSS_THEME = "edc_indigo"
425
+ EDC_MODEL_ADMIN_SAVE_DELAY = 3000
426
+
401
427
  # edc-mnsi
402
428
  EDC_MNSI_MODEL = "meta_subject.mnsi"
403
429
 
404
430
  EDC_OFFSTUDY_OFFSTUDY_MODEL = "meta_prn.endofstudy"
405
431
 
432
+ # edc-pharmacy
433
+ EDC_PDF_REPORTS_WATERMARK_WORD = env.str("EDC_PDF_REPORTS_WATERMARK_WORD")
434
+ EDC_PDF_REPORTS_WATERMARK_FONT = env.str("EDC_PDF_REPORTS_WATERMARK_FONT")
435
+ EDC_PDF_REPORTS_WATERMARK_FONTSIZE = env.int("EDC_PDF_REPORTS_WATERMARK_FONTSIZE")
436
+ EDC_PHARMACY_LABEL_WATERMARK_WORD = env.str("EDC_PHARMACY_LABEL_WATERMARK_WORD")
437
+ if EDC_PDF_REPORTS_WATERMARK_FONT:
438
+ EDC_PDF_REPORTS_WATERMARK_FONT = (
439
+ EDC_PDF_REPORTS_WATERMARK_FONT,
440
+ EDC_PDF_REPORTS_WATERMARK_FONTSIZE,
441
+ )
442
+ else:
443
+ EDC_PDF_REPORTS_WATERMARK_FONT = ()
406
444
  # edc-protocol-incident
407
445
  EDC_PROTOCOL_VIOLATION_TYPE = PROTOCOL_INCIDENT
408
446
 
@@ -434,7 +472,7 @@ MULTISITE_REGISTER_POST_MIGRATE_SYNC_ALIAS = False
434
472
  # and that redis server is running
435
473
  DEFENDER_REDIS_NAME = "default"
436
474
  DEFENDER_LOCK_OUT_BY_IP_AND_USERNAME = True
437
- DEFENDER_LOCKOUT_TEMPLATE = "edc_auth/bootstrap3/login.html"
475
+ DEFENDER_LOCKOUT_TEMPLATE = "edc_auth/login.html"
438
476
  DEFENDER_LOGIN_FAILURE_LIMIT = 5
439
477
 
440
478
  # edc_crf
@@ -457,15 +495,6 @@ if TWILIO_ENABLED:
457
495
  TWILIO_AUTH_TOKEN = env.str("TWILIO_AUTH_TOKEN")
458
496
  TWILIO_SENDER = env.str("TWILIO_SENDER")
459
497
 
460
- # django_revision
461
- GIT_DIR = BASE_DIR
462
-
463
- # django_crypto_fields
464
- KEY_PATH = env.str("DJANGO_KEY_FOLDER")
465
- AUTO_CREATE_KEYS = env("DJANGO_AUTO_CREATE_KEYS")
466
-
467
- EXPORT_FOLDER = env.str("DJANGO_EXPORT_FOLDER") or Path("~/").expanduser()
468
-
469
498
  # django_simple_history
470
499
  SIMPLE_HISTORY_ENFORCE_HISTORY_MODEL_PERMISSIONS = True
471
500
 
@@ -492,6 +521,9 @@ DATA_DICTIONARY_APP_LABELS = [
492
521
  # edc_form_runners
493
522
  EDC_FORM_RUNNERS_ENABLED = False
494
523
 
524
+ # edc_pdf_reports
525
+ EDC_PDF_REPORTS_DRAW_LOGO = False
526
+
495
527
  # edc_protocol
496
528
  EDC_PROTOCOL = env.str("EDC_PROTOCOL")
497
529
  EDC_PROTOCOL_INSTITUTION_NAME = env.str("EDC_PROTOCOL_INSTITUTION_NAME")
@@ -522,7 +554,7 @@ if env("AWS_ENABLED"):
522
554
  AWS_LOCATION = env.str("AWS_LOCATION")
523
555
  AWS_IS_GZIPPED = True
524
556
  STORAGES = {"staticfiles": {"BACKEND": "storages.backends.s3boto3.S3Boto3Storage"}}
525
- STATIC_URL = f"{os.path.join(AWS_S3_CUSTOM_DOMAIN, AWS_LOCATION)}/"
557
+ STATIC_URL = urljoin(AWS_S3_CUSTOM_DOMAIN, AWS_LOCATION) + "/"
526
558
  STATIC_ROOT = ""
527
559
  elif DEBUG:
528
560
  STATIC_URL = env.str("DJANGO_STATIC_URL")
@@ -564,3 +596,8 @@ if "test" in sys.argv:
564
596
  MIGRATION_MODULES = DisableMigrations()
565
597
  PASSWORD_HASHERS = ("django.contrib.auth.hashers.MD5PasswordHasher",)
566
598
  DEFAULT_FILE_STORAGE = "inmemorystorage.InMemoryStorage"
599
+
600
+
601
+ META_SPFQ_LIST_FILENAME = env.str("META_SPFQ_LIST_FILENAME")
602
+ # edc_pdf_reports
603
+ EDC_PDF_REPORTS_DRAW_LOGO = False
meta_edc/settings/live.py CHANGED
@@ -1,11 +1,14 @@
1
+ import sys
2
+
1
3
  from multisite import SiteID
2
4
 
3
5
  from .defaults import * # noqa
4
6
 
5
- print(f"Settings file {__file__}")
7
+ sys.stdout.write(f"Settings file {__file__}\n")
6
8
 
7
9
  SITE_ID = SiteID(default=1)
8
10
  EDC_SITES_UAT_DOMAIN = False
9
11
  EDC_MODEL_ADMIN_CSS_THEME = "edc_indigo"
10
12
  LIVE_SYSTEM = True
11
13
  EDC_SITES_DOMAIN_SUFFIX = "meta4.clinicedc.org"
14
+ AUTO_CREATE_KEYS = False
@@ -1,23 +1,28 @@
1
1
  # see http://www.simonkrueger.com/2015/05/27/logging-django-apps-to-syslog.html
2
- import os
2
+ from pathlib import Path
3
3
 
4
4
  import environ
5
5
 
6
- __all__ = ["LOG_FOLDER", "LOGGING_FILE_LEVEL", "LOGGING_SYSLOG_LEVEL", "LOGGING"]
6
+ __all__ = ["LOGGING", "LOGGING_FILE_LEVEL", "LOGGING_SYSLOG_LEVEL", "LOG_FOLDER"]
7
7
 
8
8
  env = environ.Env()
9
9
  env.read_env(".env")
10
10
 
11
- LOG_FOLDER = env.str("DJANGO_LOG_FOLDER")
11
+ LOG_FOLDER = Path(env.str("DJANGO_LOG_FOLDER"))
12
12
  LOGGING_FILE_LEVEL = env.str("DJANGO_LOGGING_FILE_LEVEL")
13
13
  LOGGING_SYSLOG_LEVEL = env.str("DJANGO_LOGGING_SYSLOG_LEVEL")
14
14
 
15
+
15
16
  LOGGING = {
16
17
  "version": 1,
17
18
  "disable_existing_loggers": False,
18
19
  "filters": {
19
20
  "require_debug_false": {"()": "django.utils.log.RequireDebugFalse"},
20
21
  "require_debug_true": {"()": "django.utils.log.RequireDebugTrue"},
22
+ "ignore_specific_ip": {
23
+ "()": "edc_utils.logging_filters.IgnoreSpecificIPDisallowedHost",
24
+ "ip_to_ignore": "178.128.175.239",
25
+ },
21
26
  },
22
27
  "formatters": {
23
28
  "verbose": {
@@ -36,7 +41,7 @@ LOGGING = {
36
41
  "file": {
37
42
  "level": LOGGING_FILE_LEVEL,
38
43
  "class": "logging.FileHandler",
39
- "filename": os.path.join(LOG_FOLDER, "edc.log"),
44
+ "filename": LOG_FOLDER / "edc.log",
40
45
  "formatter": "verbose",
41
46
  },
42
47
  "syslog": {
@@ -2,21 +2,20 @@
2
2
  A settings file with the bare minimum attributes.
3
3
  """
4
4
 
5
- import os
6
5
  from pathlib import Path
7
6
 
8
7
  import environ
9
8
  from multisite import SiteID
10
9
 
11
10
  APP_NAME = "meta_edc"
12
- BASE_DIR = str(Path(os.path.dirname(os.path.abspath(__file__))).parent.parent)
13
- ENV_DIR = str(Path(os.path.dirname(os.path.abspath(__file__))).parent.parent)
11
+ BASE_DIR = Path(__file__).resolve().parent.parent
12
+ ENV_DIR = Path(__file__).resolve().parent.parent
14
13
 
15
14
  env = environ.Env()
16
- env.read_env(os.path.join(ENV_DIR, ".env"))
15
+ env.read_env(ENV_DIR / ".env")
17
16
 
18
17
  EDC_SITES_MODULE_NAME = env.str("EDC_SITES_MODULE_NAME")
19
18
  ETC_DIR = env.str("DJANGO_ETC_FOLDER")
20
- SECRET_KEY = "blahblahblah" # nosec B105
19
+ SECRET_KEY = "blahblahblah" # noqa: S105
21
20
  ALLOWED_HOSTS = ["*"]
22
21
  SITE_ID = SiteID(default=1) # 1 is not a site
meta_edc/settings/uat.py CHANGED
@@ -1,8 +1,10 @@
1
+ import sys
2
+
1
3
  from multisite import SiteID
2
4
 
3
5
  from .defaults import * # noqa
4
6
 
5
- print(f"Settings file {__file__}")
7
+ sys.stdout.write(f"Settings file {__file__}\n")
6
8
 
7
9
  SITE_ID = SiteID(default=1)
8
10
  EDC_SITES_UAT_DOMAIN = True
@@ -1,2 +1,2 @@
1
- {% extends 'edc_dashboard/bootstrap3/base.html' %}
1
+ {% extends 'edc_dashboard/base.html' %}
2
2
  {% block footer %}{{ block.super }} {% comment %}META 2/3 base.html template{% endcomment %}{% endblock footer %}
@@ -1,4 +1,4 @@
1
- {% extends 'meta_edc/bootstrap3/base.html' %}
1
+ {% extends 'meta_edc/base.html' %}
2
2
  {% load static edc_dashboard_extras %}
3
3
 
4
4
  {% block main %}
@@ -59,7 +59,7 @@ a { cursor: pointer; }
59
59
  {% if perms.meta_reports %}
60
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
61
  {% endif %}
62
- {% if perms.edc_navbar.nav_pharmacy_section %}
62
+ {% if perms.edc_pharmacy.nav_pharmacy_section %}
63
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>
64
64
  {% endif %}
65
65
  {% if perms.edc_export %}
meta_edc/urls.py CHANGED
@@ -10,7 +10,7 @@ from edc_utils.paths_for_urlpatterns import paths_for_urlpatterns
10
10
  from .views import HomeView
11
11
 
12
12
 
13
- def trigger_error(request):
13
+ def trigger_error(request): # noqa: ARG001
14
14
  division_by_zero = 1 / 0 # noqa
15
15
 
16
16
 
@@ -51,6 +51,7 @@ urlpatterns = [
51
51
  *paths_for_urlpatterns("edc_protocol_incident"),
52
52
  *paths_for_urlpatterns("edc_qol"),
53
53
  *paths_for_urlpatterns("edc_randomization"),
54
+ *paths_for_urlpatterns("edc_reportable"),
54
55
  *paths_for_urlpatterns("edc_refusal"),
55
56
  *paths_for_urlpatterns("edc_registration"),
56
57
  *paths_for_urlpatterns("edc_review_dashboard"),
@@ -68,6 +69,7 @@ urlpatterns = [
68
69
  *paths_for_urlpatterns("meta_screening"),
69
70
  *paths_for_urlpatterns("meta_subject"),
70
71
  *paths_for_urlpatterns("meta_reports"),
72
+ *paths_for_urlpatterns("meta_spfq"),
71
73
  ]
72
74
 
73
75
  if settings.DEFENDER_ENABLED:
meta_edc/utils.py CHANGED
@@ -1,9 +1,11 @@
1
+ import sys
2
+
1
3
  from django.core.exceptions import ImproperlyConfigured
2
4
 
3
5
 
4
6
  def confirm_meta_version(phase):
5
7
  response = input(f"This is meta phase {phase}. Type 2 or 3 to continue: ")
6
8
  if response not in ["2", "3"]:
7
- print("settings load has been halted.")
9
+ sys.stdout.write("settings load has been halted.\n")
8
10
  raise ImproperlyConfigured("Check settings.META_PHASE")
9
11
  return int(response)
@@ -1 +1,3 @@
1
1
  from .home_view import HomeView
2
+
3
+ __all__ = ["HomeView"]
@@ -2,7 +2,6 @@ from typing import Any
2
2
 
3
3
  from django.conf import settings
4
4
  from django.views.generic import TemplateView
5
- from edc_dashboard.utils import get_bootstrap_version
6
5
  from edc_dashboard.view_mixins import EdcViewMixin
7
6
  from edc_navbar import NavbarViewMixin
8
7
  from edc_randomization.site_randomizers import site_randomizers
@@ -11,7 +10,7 @@ from meta_edc.meta_version import get_meta_version
11
10
 
12
11
 
13
12
  class HomeView(EdcViewMixin, NavbarViewMixin, TemplateView):
14
- template_name = f"meta_edc/bootstrap{get_bootstrap_version()}/home.html"
13
+ template_name = "meta_edc/home.html"
15
14
  navbar_name = settings.APP_NAME
16
15
  navbar_selected_item = "home"
17
16