meta-edc 1.1.8__py3-none-any.whl → 1.1.12__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


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

Files changed (475) hide show
  1. meta_ae/action_items.py +2 -1
  2. meta_ae/admin/__init__.py +11 -0
  3. meta_ae/admin/ae_susar_admin.py +1 -1
  4. meta_ae/admin/death_report_admin.py +1 -1
  5. meta_ae/admin/modeladmin_mixins.py +10 -12
  6. meta_ae/baker_recipes.py +3 -3
  7. meta_ae/forms/__init__.py +13 -0
  8. meta_ae/forms/modelform_mixins.py +2 -2
  9. meta_ae/migrations/0001_initial.py +27 -27
  10. meta_ae/migrations/0006_aelocalreview_aesponsorreview.py +5 -5
  11. meta_ae/migrations/0022_historicalhospitalization_hospitalization.py +5 -13
  12. meta_ae/migrations/0023_alter_aefollowup_action_identifier_and_more.py +2017 -0
  13. meta_ae/model_mixins/__init__.py +2 -0
  14. meta_ae/model_mixins/ae_review_model_mixin.py +6 -6
  15. meta_ae/model_mixins/death_report_model_mixin.py +3 -3
  16. meta_ae/models/__init__.py +13 -0
  17. meta_ae/models/hospitalization.py +3 -3
  18. meta_ae/pdf_reports/__init__.py +2 -0
  19. meta_analytics/.DS_Store +0 -0
  20. meta_analytics/dataframes/__init__.py +24 -0
  21. meta_analytics/dataframes/get_eos_df.py +1 -2
  22. meta_analytics/dataframes/get_glucose_df.py +6 -7
  23. meta_analytics/dataframes/get_glucose_fbg_df.py +2 -3
  24. meta_analytics/dataframes/get_glucose_fbg_ogtt_df.py +1 -2
  25. meta_analytics/dataframes/get_last_imp_visits_df.py +5 -6
  26. meta_analytics/dataframes/glucose_endpoints/__init__.py +2 -0
  27. meta_analytics/dataframes/glucose_endpoints/endpoint_by_date.py +13 -20
  28. meta_analytics/dataframes/glucose_endpoints/glucose_endpoints_by_date.py +9 -10
  29. meta_analytics/dataframes/screening/__init__.py +2 -0
  30. meta_analytics/dataframes/screening/get_glucose_tested_only_df.py +1 -2
  31. meta_analytics/dataframes/screening/get_screening_df.py +6 -10
  32. meta_analytics/dataframes/utils.py +3 -8
  33. meta_analytics/get_tables.py +1 -2
  34. meta_analytics/tables/__init__.py +2 -0
  35. meta_consent/action_items.py +2 -1
  36. meta_consent/admin/__init__.py +6 -0
  37. meta_consent/admin/actions/__init__.py +2 -0
  38. meta_consent/admin/actions/create_missing_prescriptions.py +1 -1
  39. meta_consent/admin/list_filters.py +2 -2
  40. meta_consent/admin/modeladmin_mixins.py +3 -4
  41. meta_consent/admin/subject_consent_v1_ext_admin.py +2 -2
  42. meta_consent/baker_recipes.py +7 -8
  43. meta_consent/form_validators/__init__.py +2 -0
  44. meta_consent/forms/__init__.py +7 -0
  45. meta_consent/forms/subject_consent_v1_ext_form.py +2 -3
  46. meta_consent/forms/subject_reconsent_form.py +4 -4
  47. meta_consent/management/commands/create_missing_prescriptions.py +4 -2
  48. meta_consent/migrations/0001_initial.py +9 -9
  49. meta_consent/migrations/0024_historicalsubjectconsentv1.py +3 -8
  50. meta_consent/migrations/0026_historicalsubjectconsentv1ext_subjectconsentv1ext.py +5 -14
  51. meta_consent/migrations/0032_alter_historicalsubjectconsent_device_created_and_more.py +678 -0
  52. meta_consent/models/__init__.py +9 -0
  53. meta_consent/models/model_mixins.py +1 -2
  54. meta_consent/models/signals.py +9 -10
  55. meta_consent/models/subject_consent.py +1 -1
  56. meta_consent/models/subject_reconsent.py +3 -3
  57. meta_dashboard/patterns.py +1 -1
  58. meta_dashboard/templatetags/meta_dashboard_extras.py +1 -1
  59. meta_dashboard/view_utils/__init__.py +7 -0
  60. meta_dashboard/view_utils/subject_screening_button.py +9 -16
  61. meta_dashboard/views/__init__.py +8 -0
  62. meta_dashboard/views/ae/__init__.py +2 -0
  63. meta_dashboard/views/ae/ae_listboard_view.py +1 -1
  64. meta_dashboard/views/ae/death_report_listboard_view.py +1 -1
  65. meta_dashboard/views/screening/__init__.py +2 -0
  66. meta_dashboard/views/subject/__init__.py +2 -0
  67. meta_dashboard/views/subject/dashboard/__init__.py +2 -0
  68. meta_dashboard/views/subject/dashboard/dashboard_view.py +1 -1
  69. meta_dashboard/views/subject/listboard/__init__.py +2 -0
  70. meta_edc/__init__.py +5 -9
  71. meta_edc/celery.py +1 -1
  72. meta_edc/celery_live.py +1 -1
  73. meta_edc/celery_uat.py +1 -1
  74. meta_edc/management/commands/update_forms_reference.py +10 -12
  75. meta_edc/settings/debug.py +5 -4
  76. meta_edc/settings/defaults.py +18 -3
  77. meta_edc/settings/live.py +3 -1
  78. meta_edc/settings/logging.py +9 -4
  79. meta_edc/settings/minimal.py +4 -5
  80. meta_edc/settings/uat.py +3 -1
  81. meta_edc/views/__init__.py +2 -0
  82. meta_edc-1.1.12.dist-info/METADATA +174 -0
  83. {meta_edc-1.1.8.dist-info → meta_edc-1.1.12.dist-info}/RECORD +413 -526
  84. meta_edc-1.1.12.dist-info/WHEEL +4 -0
  85. meta_lists/migrations/0020_alter_abnormalfootappearanceobservations_extra_value_and_more.py +404 -0
  86. meta_pharmacy/admin/__init__.py +5 -0
  87. meta_pharmacy/admin/substitutions_admin.py +2 -2
  88. meta_pharmacy/forms/__init__.py +2 -0
  89. meta_pharmacy/forms/substitutions_form.py +6 -4
  90. meta_pharmacy/labels/__init__.py +4 -2
  91. meta_pharmacy/labels/draw_label_for_subject_with_barcode.py +1 -2
  92. meta_pharmacy/labels/draw_label_with_test_data.py +2 -2
  93. meta_pharmacy/labels/label_data.py +1 -2
  94. meta_pharmacy/labels/print_sheets.py +4 -6
  95. meta_pharmacy/migrations/0002_initial.py +7 -20
  96. meta_pharmacy/migrations/0003_auto_20240909_2335.py +3 -2
  97. meta_pharmacy/migrations/0006_lotnumber_label.py +5 -14
  98. meta_pharmacy/migrations/0008_remove_lotnumber_medication_and_more.py +5 -6
  99. meta_pharmacy/migrations/0010_alter_historicallabeldata_device_created_and_more.py +382 -0
  100. meta_pharmacy/models/__init__.py +7 -0
  101. meta_pharmacy/models/label_data.py +4 -5
  102. meta_pharmacy/models/substitutions.py +3 -3
  103. meta_pharmacy/prepare_meta_pharmacy.py +1 -1
  104. meta_pharmacy/utils/__init__.py +2 -0
  105. meta_pharmacy/utils/update_initial_pharmacy_data.py +1 -1
  106. meta_prn/admin/__init__.py +16 -0
  107. meta_prn/admin/dm_referral_admin.py +2 -1
  108. meta_prn/admin/end_of_study_admin.py +6 -7
  109. meta_prn/admin/loss_to_followup_admin.py +3 -2
  110. meta_prn/admin/off_study_medication_admin.py +5 -6
  111. meta_prn/admin/offschedule_admin.py +5 -6
  112. meta_prn/admin/offschedule_dm_referral_admin.py +6 -6
  113. meta_prn/admin/offschedule_postnatal_admin.py +7 -7
  114. meta_prn/admin/offschedule_pregnancy_admin.py +8 -7
  115. meta_prn/admin/onschedule_admin.py +7 -8
  116. meta_prn/admin/onschedule_dm_referral_admin.py +6 -7
  117. meta_prn/admin/pregnancy_notification_admin.py +5 -6
  118. meta_prn/admin/protocol_incident_admin.py +1 -1
  119. meta_prn/admin/subject_transfer_admin.py +1 -1
  120. meta_prn/baker_recipes.py +4 -4
  121. meta_prn/form_validators/__init__.py +5 -0
  122. meta_prn/form_validators/end_of_study.py +2 -2
  123. meta_prn/forms/__init__.py +13 -0
  124. meta_prn/migrations/0001_initial.py +25 -25
  125. meta_prn/migrations/0017_auto_20220307_1929.py +5 -5
  126. meta_prn/migrations/0018_auto_20220309_2106.py +9 -9
  127. meta_prn/migrations/0021_auto_20220316_2147.py +13 -13
  128. meta_prn/migrations/0022_auto_20220318_0133.py +9 -9
  129. meta_prn/migrations/0032_historicalegfrnotification_egfrnotification.py +5 -13
  130. meta_prn/migrations/0038_alter_endofstudy_delivery_date_and_more.py +5 -13
  131. meta_prn/migrations/0041_endofstudy_transfer_date_and_more.py +5 -13
  132. meta_prn/migrations/0057_historicalonscheduledmreferral_and_more.py +13 -38
  133. meta_prn/migrations/0067_alter_offschedule_managers_and_more.py +2557 -0
  134. meta_prn/models/__init__.py +20 -0
  135. meta_prn/models/offschedule.py +4 -4
  136. meta_prn/models/protocol_incident.py +1 -1
  137. meta_prn/models/subject_transfer.py +8 -0
  138. meta_rando/migrations/0001_initial.py +5 -5
  139. meta_rando/migrations/0006_alter_historicalrandomizationlist_allocated_user_and_more.py +130 -0
  140. meta_reports/__init__.py +2 -0
  141. meta_reports/admin/__init__.py +16 -0
  142. meta_reports/admin/dbviews/__init__.py +13 -0
  143. meta_reports/admin/dbviews/glucose_summary_admin.py +6 -6
  144. meta_reports/admin/dbviews/imp_substitutions_admin.py +12 -11
  145. meta_reports/admin/dbviews/missing_screening_ogtt_admin/__init__.py +5 -0
  146. meta_reports/admin/dbviews/missing_screening_ogtt_admin/note_model_admin.py +27 -3
  147. meta_reports/admin/dbviews/missing_screening_ogtt_admin/unmanaged_model_admin.py +6 -6
  148. meta_reports/admin/dbviews/on_study_missing_lab_values_admin/__init__.py +2 -0
  149. meta_reports/admin/dbviews/on_study_missing_lab_values_admin/unmanaged_model_admin.py +0 -3
  150. meta_reports/admin/dbviews/on_study_missing_values_admin/__init__.py +2 -0
  151. meta_reports/admin/dbviews/patient_history_missing_baseline_cd4_admin.py +8 -8
  152. meta_reports/admin/dbviews/unattended_three_in_row2_admin.py +6 -6
  153. meta_reports/admin/dbviews/unattended_three_in_row_admin.py +5 -5
  154. meta_reports/admin/dbviews/unattended_two_in_row_admin.py +5 -5
  155. meta_reports/admin/endpoints_admin.py +1 -1
  156. meta_reports/admin/last_imp_refill_admin.py +9 -9
  157. meta_reports/admin/list_filters.py +2 -2
  158. meta_reports/admin/modeladmin_mixins.py +9 -16
  159. meta_reports/death_report.py +1 -1
  160. meta_reports/forms/__init__.py +2 -0
  161. meta_reports/forms/missing_ogtt_note_form.py +2 -3
  162. meta_reports/management/commands/generate_endpoints.py +5 -4
  163. meta_reports/migrations/0035_historicalmissingogttnote_missingogttnote.py +5 -14
  164. meta_reports/migrations/0059_alter_endpoints_created_and_more.py +161 -0
  165. meta_reports/models/__init__.py +17 -0
  166. meta_reports/models/dbviews/__init__.py +14 -0
  167. meta_reports/models/dbviews/glucose_summary/__init__.py +2 -0
  168. meta_reports/models/dbviews/glucose_summary/unmanaged_model.py +4 -5
  169. meta_reports/models/dbviews/imp_substitutions/__init__.py +2 -0
  170. meta_reports/models/dbviews/imp_substitutions/view_definition.py +1 -1
  171. meta_reports/models/dbviews/missing_screening_ogtt/__init__.py +2 -0
  172. meta_reports/models/dbviews/missing_screening_ogtt/note_model.py +1 -1
  173. meta_reports/models/dbviews/missing_screening_ogtt/unmanaged_model.py +4 -3
  174. meta_reports/models/dbviews/on_study_missing_lab_values/__init__.py +2 -0
  175. meta_reports/models/dbviews/on_study_missing_lab_values/qa_cases.py +13 -11
  176. meta_reports/models/dbviews/on_study_missing_values/__init__.py +2 -0
  177. meta_reports/models/dbviews/on_study_missing_values/qa_cases.py +18 -0
  178. meta_reports/models/dbviews/patient_history_missing_baseline_cd4/__init__.py +2 -0
  179. meta_reports/models/dbviews/unattended_three_in_row/__init__.py +2 -0
  180. meta_reports/models/dbviews/unattended_three_in_row2/__init__.py +2 -0
  181. meta_reports/models/dbviews/unattended_two_in_row/__init__.py +2 -0
  182. meta_reports/models/endpoints.py +4 -4
  183. meta_reports/models/last_imp_refill.py +2 -3
  184. meta_reports/pdf_report.py +2 -2
  185. meta_reports/tasks.py +1 -1
  186. meta_screening/admin/__init__.py +8 -0
  187. meta_screening/admin/fieldsets.py +13 -14
  188. meta_screening/admin/list_filters.py +6 -4
  189. meta_screening/admin/screening_part_one_admin.py +1 -2
  190. meta_screening/admin/screening_part_three_admin.py +2 -3
  191. meta_screening/admin/screening_part_two_admin.py +7 -10
  192. meta_screening/admin/subject_refusal_admin.py +5 -3
  193. meta_screening/admin/subject_screening_admin.py +4 -4
  194. meta_screening/baker_recipes.py +9 -9
  195. meta_screening/eligibility/__init__.py +9 -0
  196. meta_screening/eligibility/eligibility.py +7 -7
  197. meta_screening/eligibility/eligibility_part_three/__init__.py +2 -0
  198. meta_screening/eligibility/eligibility_part_three/base_eligibility_part_three.py +8 -8
  199. meta_screening/eligibility/eligibility_part_three/eligibility_part_three_phase_three.py +13 -14
  200. meta_screening/form_validators/__init__.py +8 -0
  201. meta_screening/forms/__init__.py +20 -0
  202. meta_screening/forms/field_lists.py +16 -17
  203. meta_screening/forms/screening_part_one_form.py +2 -2
  204. meta_screening/forms/screening_part_three_form.py +5 -3
  205. meta_screening/forms/screening_part_two_form.py +1 -5
  206. meta_screening/forms/subject_refusal_form.py +0 -4
  207. meta_screening/forms/subject_screening_form.py +0 -4
  208. meta_screening/migrations/0001_initial.py +15 -15
  209. meta_screening/migrations/0010_auto_20191106_0828.py +5 -5
  210. meta_screening/migrations/0068_alter_historicalscreeningpartone_acute_condition_and_more.py +1579 -0
  211. meta_screening/model_mixins/__init__.py +8 -0
  212. meta_screening/model_mixins/eligibility_model_mixin.py +5 -3
  213. meta_screening/model_mixins/part_one_fields_model_mixin.py +5 -9
  214. meta_screening/model_mixins/part_three_fields_model_mixin.py +5 -6
  215. meta_screening/model_mixins/part_two_fields_model_mixin.py +18 -16
  216. meta_screening/models/__init__.py +9 -0
  217. meta_screening/models/icp_referral.py +5 -5
  218. meta_screening/models/signals.py +10 -11
  219. meta_screening/models/subject_refusal.py +1 -1
  220. meta_screening/models/subject_screening.py +1 -3
  221. meta_subject/action_items.py +13 -15
  222. meta_subject/admin/__init__.py +39 -0
  223. meta_subject/admin/birth_outcome_admin.py +4 -8
  224. meta_subject/admin/blood_results/__init__.py +9 -0
  225. meta_subject/admin/blood_results/blood_results_fbc_admin.py +1 -1
  226. meta_subject/admin/blood_results/blood_results_hba1c_admin.py +1 -1
  227. meta_subject/admin/blood_results/blood_results_ins_admin.py +1 -1
  228. meta_subject/admin/blood_results/blood_results_lft_admin.py +1 -1
  229. meta_subject/admin/blood_results/blood_results_lipids_admin.py +1 -1
  230. meta_subject/admin/blood_results/blood_results_rft_admin.py +3 -5
  231. meta_subject/admin/complications_glycemia_admin.py +1 -1
  232. meta_subject/admin/delivery_admin.py +7 -10
  233. meta_subject/admin/diabetes/__init__.py +2 -0
  234. meta_subject/admin/diabetes/dm_endpoint_admin.py +2 -2
  235. meta_subject/admin/diabetes/dm_followup_admin.py +3 -2
  236. meta_subject/admin/egfr_drop_notification_admin.py +1 -1
  237. meta_subject/admin/followup_examination_admin.py +10 -9
  238. meta_subject/admin/followup_vitals_admin.py +4 -5
  239. meta_subject/admin/glucose_admin.py +2 -4
  240. meta_subject/admin/glucose_fbg_admin.py +1 -3
  241. meta_subject/admin/health_economics/__init__.py +2 -0
  242. meta_subject/admin/health_economics/health_economics_simple_admin.py +1 -1
  243. meta_subject/admin/health_economics/health_economics_update_admin.py +1 -1
  244. meta_subject/admin/hepatitis_test_admin.py +1 -1
  245. meta_subject/admin/list_filters.py +1 -1
  246. meta_subject/admin/mnsi_admin.py +7 -5
  247. meta_subject/admin/other_arv_regimens_admin.py +3 -3
  248. meta_subject/admin/patient_history_admin.py +4 -4
  249. meta_subject/admin/physical_exam_admin.py +1 -1
  250. meta_subject/admin/pregnancy_update_admin.py +1 -1
  251. meta_subject/admin/study_medication_admin.py +8 -15
  252. meta_subject/admin/subject_requisition_admin.py +1 -1
  253. meta_subject/admin/subject_visit_admin.py +1 -1
  254. meta_subject/admin/subject_visit_missed_admin.py +1 -1
  255. meta_subject/admin/urine_dipstick_test_admin.py +1 -1
  256. meta_subject/admin/urine_pregnancy_admin.py +1 -1
  257. meta_subject/baker_recipes.py +15 -15
  258. meta_subject/form_validators/__init__.py +11 -0
  259. meta_subject/form_validators/delivery_form_validator.py +2 -3
  260. meta_subject/form_validators/dm_endpoint_form_validator.py +1 -1
  261. meta_subject/form_validators/dm_followup_form_validator.py +7 -6
  262. meta_subject/form_validators/glucose_form_validator.py +3 -5
  263. meta_subject/forms/__init__.py +41 -0
  264. meta_subject/forms/blood_results/__init__.py +9 -0
  265. meta_subject/forms/blood_results/blood_results_rft_form.py +1 -2
  266. meta_subject/forms/diabetes/__init__.py +2 -0
  267. meta_subject/forms/diabetes/dm_followup_form.py +2 -2
  268. meta_subject/forms/followup_vitals_form.py +3 -8
  269. meta_subject/forms/health_economics/__init__.py +2 -0
  270. meta_subject/forms/next_appointment_form.py +2 -3
  271. meta_subject/forms/slider_widget.py +1 -1
  272. meta_subject/forms/study_medication_form.py +11 -8
  273. meta_subject/management/commands/create_missing_refills.py +3 -3
  274. meta_subject/management/commands/create_missing_rx.py +1 -1
  275. meta_subject/management/commands/missed.py +20 -23
  276. meta_subject/metadata_rules/__init__.py +2 -0
  277. meta_subject/metadata_rules/predicates.py +25 -32
  278. meta_subject/migrations/0001_initial.py +61 -61
  279. meta_subject/migrations/0002_auto_20191021_0353.py +5 -5
  280. meta_subject/migrations/0012_auto_20200118_2334.py +5 -5
  281. meta_subject/migrations/0014_auto_20200120_1622.py +5 -5
  282. meta_subject/migrations/0018_coronakap_historicalcoronakap.py +5 -5
  283. meta_subject/migrations/0033_auto_20200516_2356.py +5 -5
  284. meta_subject/migrations/0038_auto_20200520_0020.py +5 -5
  285. meta_subject/migrations/0040_auto_20200527_2155.py +1 -1
  286. meta_subject/migrations/0045_auto_20200530_1801.py +1 -1
  287. meta_subject/migrations/0051_auto_20200617_2117.py +5 -5
  288. meta_subject/migrations/0063_auto_20210715_0337.py +5 -5
  289. meta_subject/migrations/0066_auto_20210721_0335.py +9 -9
  290. meta_subject/migrations/0067_auto_20210726_0340.py +5 -5
  291. meta_subject/migrations/0068_auto_20210728_1809.py +5 -5
  292. meta_subject/migrations/0072_auto_20210805_1545.py +7 -7
  293. meta_subject/migrations/0073_auto_20210809_0055.py +5 -5
  294. meta_subject/migrations/0077_auto_20210809_2323.py +3 -3
  295. meta_subject/migrations/0082_auto_20210823_1612.py +3 -3
  296. meta_subject/migrations/0083_auto_20210823_1620.py +3 -3
  297. meta_subject/migrations/0088_auto_20210924_0027.py +5 -5
  298. meta_subject/migrations/0090_auto_20210924_0424.py +5 -5
  299. meta_subject/migrations/0093_auto_20211117_0352.py +5 -5
  300. meta_subject/migrations/0095_auto_20220128_1719.py +5 -5
  301. meta_subject/migrations/0098_auto_20220309_2106.py +5 -5
  302. meta_subject/migrations/0101_auto_20220316_2147.py +13 -13
  303. meta_subject/migrations/0115_historicalegfrnotification_egfrnotification.py +5 -13
  304. meta_subject/migrations/0164_dmreferralfollowup_historicaldmreferralfollowup.py +5 -5
  305. meta_subject/migrations/0172_remove_historicalbloodresultsglu_action_item_and_more.py +1 -2
  306. meta_subject/migrations/0177_alter_bloodresultslft_alp_value_and_more.py +1 -2
  307. meta_subject/migrations/0178_historicalhealtheconomicsupdate_and_more.py +5 -14
  308. meta_subject/migrations/0186_healtheconomicsupdate_singleton_field_and_more.py +1 -2
  309. meta_subject/migrations/0187_dmdiagnosis_historicaldmdiagnosis_dmdxresult_and_more.py +5 -14
  310. meta_subject/migrations/0188_historicaldmdxresult_dmdxresult.py +5 -14
  311. meta_subject/migrations/0209_remove_historicaldmdxresult_dm_diagnosis_and_more.py +1 -2
  312. meta_subject/migrations/0216_historicalnextappointment_nextappointment.py +5 -6
  313. meta_subject/migrations/0220_historicalbloodresultsgludummy_bloodresultsgludummy.py +5 -14
  314. meta_subject/migrations/0227_alter_followupvitals_waist_circumference_comment_and_more.py +97 -0
  315. meta_subject/migrations/0228_bloodresultshba1c_hba1c_datetime_and_more.py +9297 -0
  316. meta_subject/model_mixins/__init__.py +8 -0
  317. meta_subject/model_mixins/search_slug_model_mixin.py +1 -2
  318. meta_subject/model_mixins/vitals_fields_model_mixin.py +1 -1
  319. meta_subject/models/__init__.py +48 -0
  320. meta_subject/models/birth_outcomes.py +3 -3
  321. meta_subject/models/blood_results/__init__.py +11 -0
  322. meta_subject/models/delivery.py +3 -3
  323. meta_subject/models/diabetes/__init__.py +2 -0
  324. meta_subject/models/diabetes/dm_endpoint.py +4 -4
  325. meta_subject/models/diabetes/dm_followup.py +3 -4
  326. meta_subject/models/diet_and_lifestyle.py +2 -2
  327. meta_subject/models/followup_examination.py +11 -11
  328. meta_subject/models/glucose.py +4 -4
  329. meta_subject/models/glucose_fbg.py +2 -3
  330. meta_subject/models/health_economics/__init__.py +2 -0
  331. meta_subject/models/health_economics/health_economics.py +7 -7
  332. meta_subject/models/health_economics/health_economics_update.py +2 -1
  333. meta_subject/models/hepatitis_test.py +2 -2
  334. meta_subject/models/other_arv_regimens_detail.py +1 -1
  335. meta_subject/models/patient_history.py +5 -6
  336. meta_subject/models/physical_exam.py +2 -2
  337. meta_subject/models/pregnancy_update.py +1 -1
  338. meta_subject/models/signals.py +14 -12
  339. meta_subject/models/subject_visit.py +1 -1
  340. meta_subject/models/urine_dipstick_test.py +1 -1
  341. meta_subject/models/urine_pregnancy.py +1 -1
  342. meta_visit_schedule/visit_schedules/__init__.py +2 -0
  343. meta_visit_schedule/visit_schedules/phase_three/__init__.py +2 -0
  344. meta_visit_schedule/visit_schedules/phase_three/schedule.py +2 -2
  345. meta_visit_schedule/visit_schedules/phase_three/schedule_dm_referral.py +1 -2
  346. meta_visit_schedule/visit_schedules/phase_three/schedule_pregnancy.py +1 -2
  347. meta_ae/tests/holidays.csv +0 -15
  348. meta_ae/tests/tests/test_actions.py +0 -126
  349. meta_ae/tests/urls.py +0 -10
  350. meta_analytics/dataframes/glucose_endpoints/utils.py +0 -0
  351. meta_analytics/notebooks/anu.ipynb +0 -95
  352. meta_analytics/notebooks/appointment_planning.ipynb +0 -329
  353. meta_analytics/notebooks/arvs.ipynb +0 -103
  354. meta_analytics/notebooks/cleaning/__init__.py +0 -0
  355. meta_analytics/notebooks/cleaning/consent_v1_ext.ipynb +0 -227
  356. meta_analytics/notebooks/cleaning/offschedule_eos.ipynb +0 -353
  357. meta_analytics/notebooks/dsmc/renal_dysfunction.ipynb +0 -435
  358. meta_analytics/notebooks/endpoints/meta_endpoints_by_date.ipynb +0 -656
  359. meta_analytics/notebooks/followup_examination.ipynb +0 -141
  360. meta_analytics/notebooks/hba1c.ipynb +0 -136
  361. meta_analytics/notebooks/hiv_regimens.ipynb +0 -429
  362. meta_analytics/notebooks/incidence.ipynb +0 -232
  363. meta_analytics/notebooks/liver.ipynb +0 -389
  364. meta_analytics/notebooks/magreth.ipynb +0 -645
  365. meta_analytics/notebooks/monitoring_report.ipynb +0 -1834
  366. meta_analytics/notebooks/pharmacy.ipynb +0 -1061
  367. meta_analytics/notebooks/pharmacy_stock_202410.ipynb +0 -306
  368. meta_analytics/notebooks/qa.ipynb +0 -273
  369. meta_analytics/notebooks/steering.ipynb +0 -61
  370. meta_analytics/notebooks/undiagnosed/meta3_screening_consort_chart.ipynb +0 -1176
  371. meta_analytics/notebooks/undiagnosed/meta3_screening_undiagnosed.ipynb +0 -519
  372. meta_analytics/notebooks/undiagnosed/meta_screening_table2.ipynb +0 -964
  373. meta_analytics/notebooks/undiagnosed/screen_undiagnosed_or.ipynb +0 -296
  374. meta_analytics/notebooks/undiagnosed/screening.ipynb +0 -273
  375. meta_analytics/notebooks/undiagnosed/screening2.ipynb +0 -958
  376. meta_analytics/notebooks/undiagnosed/screening_undiagnosed_20241002.ipynb +0 -958
  377. meta_analytics/notebooks/ven.ipynb +0 -191
  378. meta_analytics/notebooks/vitals.ipynb +0 -263
  379. meta_analytics/tests/__init__.py +0 -0
  380. meta_analytics/tests/test_endpoints_by_date.py +0 -94
  381. meta_consent/tests/__init__.py +0 -0
  382. meta_consent/tests/holidays.csv +0 -15
  383. meta_consent/tests/tests/__init__.py +0 -0
  384. meta_consent/tests/tests/test_form_validators.py +0 -110
  385. meta_consent/tests/tests/test_subject_consent.py +0 -10
  386. meta_consent/tests/urls.py +0 -17
  387. meta_dashboard/tests/__init__.py +0 -0
  388. meta_dashboard/tests/admin.py +0 -22
  389. meta_dashboard/tests/holidays.csv +0 -15
  390. meta_dashboard/tests/tests/__init__.py +0 -0
  391. meta_dashboard/tests/urls.py +0 -55
  392. meta_edc/tests/__init__.py +0 -0
  393. meta_edc/tests/tests/__init__.py +0 -0
  394. meta_edc/tests/tests/test_endpoints.py +0 -555
  395. meta_edc-1.1.8.dist-info/METADATA +0 -767
  396. meta_edc-1.1.8.dist-info/WHEEL +0 -5
  397. meta_edc-1.1.8.dist-info/licenses/AUTHORS.rst +0 -8
  398. meta_edc-1.1.8.dist-info/top_level.txt +0 -20
  399. meta_labs/tests/__init__.py +0 -0
  400. meta_labs/tests/test_labs.py +0 -27
  401. meta_labs/tests/test_reportables.py +0 -70
  402. meta_labs/tests/urls.py +0 -4
  403. meta_lists/tests/__init__.py +0 -0
  404. meta_lists/tests/test_lists.py +0 -8
  405. meta_pharmacy/notebooks/pharmacy.ipynb +0 -41
  406. meta_prn/tests/__init__.py +0 -0
  407. meta_prn/tests/tests/__init__.py +0 -0
  408. meta_prn/tests/tests/test_actions.py +0 -97
  409. meta_prn/tests/tests/test_dm_referral.py +0 -203
  410. meta_prn/tests/tests/test_eos_events.py +0 -134
  411. meta_prn/tests/tests/test_manager_order.py +0 -14
  412. meta_prn/tests/tests/test_pregnancy_notification.py +0 -93
  413. meta_prn/tests/urls.py +0 -10
  414. meta_rando/tests/__init__.py +0 -0
  415. meta_rando/tests/tests/__init__.py +0 -0
  416. meta_rando/tests/tests/test_randomizers.py +0 -57
  417. meta_reports/tests/__init__.py +0 -0
  418. meta_reports/tests/test_reports.py +0 -35
  419. meta_reports/tests/test_sql_gen.py +0 -5
  420. meta_reports/tests/urls.py +0 -4
  421. meta_screening/offline_models.py +0 -3
  422. meta_screening/tests/__init__.py +0 -0
  423. meta_screening/tests/holidays.csv +0 -15
  424. meta_screening/tests/meta_test_case_mixin.py +0 -234
  425. meta_screening/tests/options.py +0 -127
  426. meta_screening/tests/tests/__init__.py +0 -0
  427. meta_screening/tests/tests/test_forms.py +0 -404
  428. meta_screening/tests/tests/test_screening_part_one.py +0 -108
  429. meta_screening/tests/tests/test_screening_part_three.py +0 -433
  430. meta_screening/tests/tests/test_screening_part_two.py +0 -84
  431. meta_sites/tests/__init__.py +0 -0
  432. meta_sites/tests/test_sites.py +0 -12
  433. meta_sites/tests/urls.py +0 -4
  434. meta_stats/__init__.py +0 -0
  435. meta_stats/incidence.py +0 -16
  436. meta_stats/models.py +0 -0
  437. meta_stats/tests/__init__.py +0 -0
  438. meta_stats/tests/tests/__init__.py +0 -0
  439. meta_stats/tests/tests/test_incidence.py +0 -10
  440. meta_subject/tests/__init__.py +0 -0
  441. meta_subject/tests/holidays.csv +0 -15
  442. meta_subject/tests/tests/__init__.py +0 -0
  443. meta_subject/tests/tests/test_egfr.py +0 -234
  444. meta_subject/tests/tests/test_fixes.py +0 -64
  445. meta_subject/tests/tests/test_followup.py +0 -52
  446. meta_subject/tests/tests/test_manager_order.py +0 -11
  447. meta_subject/tests/tests/test_medication_adherence.py +0 -79
  448. meta_subject/tests/tests/test_metadata_rules.py +0 -135
  449. meta_subject/tests/tests/test_mnsi.py +0 -341
  450. meta_subject/tests/tests/test_next_appointment.py +0 -231
  451. meta_subject/tests/tests/test_patient_history_form.py +0 -74
  452. meta_subject/tests/tests/test_physical_exam.py +0 -84
  453. meta_subject/tests/tests/test_sf12.py +0 -161
  454. meta_subject/tests/tests/test_study_medication.py +0 -229
  455. meta_subject/tests/urls.py +0 -24
  456. meta_visit_schedule/tests/__init__.py +0 -0
  457. meta_visit_schedule/tests/tests/__init__.py +0 -0
  458. meta_visit_schedule/tests/tests/test_schedule.py +0 -181
  459. meta_visit_schedule/tests/urls.py +0 -4
  460. tests/__init__.py +0 -0
  461. tests/etc/randomization_list.csv +0 -241
  462. tests/etc/randomization_list_phase_three.csv +0 -241
  463. tests/etc/user-aes-local.key +0 -0
  464. tests/etc/user-aes-restricted.key +0 -1
  465. tests/etc/user-rsa-local-private.pem +0 -27
  466. tests/etc/user-rsa-local-public.pem +0 -9
  467. tests/etc/user-rsa-restricted-private.pem +0 -27
  468. tests/etc/user-rsa-restricted-public.pem +0 -9
  469. tests/etc/user-salt-local.key +0 -0
  470. tests/etc/user-salt-restricted.key +0 -0
  471. tests/holidays.csv +0 -15
  472. tests/test_settings.py +0 -185
  473. {meta_edc-1.1.8.dist-info → meta_edc-1.1.12.dist-info}/licenses/LICENSE +0 -0
  474. /meta_ae/tests/__init__.py → /meta_subject/management/__init__py.py +0 -0
  475. /meta_ae/tests/tests/__init__.py → /meta_subject/management/commands/__init__py.py +0 -0
@@ -1,7 +1,9 @@
1
+ import contextlib
2
+
1
3
  from django.core.exceptions import ValidationError
2
4
  from django.db.models.signals import post_delete, post_save
3
5
  from django.dispatch import receiver
4
- from edc_action_item import ActionItemDeleteError, delete_action_item
6
+ from edc_action_item.delete_action_item import ActionItemDeleteError, delete_action_item
5
7
  from edc_appointment.utils import refresh_appointments
6
8
  from edc_constants.constants import YES
7
9
  from edc_pharmacy.exceptions import PrescriptionAlreadyExists
@@ -26,10 +28,11 @@ from .subject_consent_v1_ext import SubjectConsentV1Ext
26
28
  sender=SubjectConsentV1,
27
29
  dispatch_uid="subject_consent_on_post_save",
28
30
  )
29
- def subject_consent_on_post_save(sender, instance, raw, created, **kwargs):
31
+ def subject_consent_on_post_save(sender, instance, raw, created, **kwargs): # noqa: ARG001
30
32
  """Creates an onschedule instance for this consented subject, if
31
33
  it does not exist.
32
34
  """
35
+
33
36
  if not raw:
34
37
  if not created:
35
38
  _, schedule = site_visit_schedules.get_by_onschedule_model("meta_prn.onschedule")
@@ -62,7 +65,7 @@ def subject_consent_on_post_save(sender, instance, raw, created, **kwargs):
62
65
  onschedule_datetime=instance.consent_datetime,
63
66
  )
64
67
  # All refills are created against this prescription
65
- try:
68
+ with contextlib.suppress(PrescriptionAlreadyExists):
66
69
  create_prescription(
67
70
  subject_identifier=instance.subject_identifier,
68
71
  report_datetime=instance.consent_datetime,
@@ -70,20 +73,16 @@ def subject_consent_on_post_save(sender, instance, raw, created, **kwargs):
70
73
  randomizer_name=get_meta_version(),
71
74
  site=instance.site,
72
75
  )
73
- except PrescriptionAlreadyExists:
74
- pass
75
76
 
76
77
  # create / delete action for reconsent
77
78
  if instance.completed_by_next_of_kin == YES:
78
79
  ReconsentAction(subject_identifier=instance.subject_identifier)
79
80
  else:
80
- try:
81
+ with contextlib.suppress(ActionItemDeleteError):
81
82
  delete_action_item(
82
83
  action_cls=ReconsentAction,
83
84
  subject_identifier=instance.subject_identifier,
84
85
  )
85
- except ActionItemDeleteError:
86
- pass
87
86
 
88
87
 
89
88
  @receiver(
@@ -92,7 +91,7 @@ def subject_consent_on_post_save(sender, instance, raw, created, **kwargs):
92
91
  sender=SubjectConsentV1Ext,
93
92
  dispatch_uid="subject_consent_v1_ext_on_post_save",
94
93
  )
95
- def subject_consent_v1_ext_on_post_save(sender, instance, raw, created, **kwargs):
94
+ def subject_consent_v1_ext_on_post_save(sender, instance, raw, created, **kwargs): # noqa: ARG001
96
95
  if not raw:
97
96
  refresh_appointments(
98
97
  subject_identifier=instance.subject_identifier,
@@ -106,7 +105,7 @@ def subject_consent_v1_ext_on_post_save(sender, instance, raw, created, **kwargs
106
105
  weak=False,
107
106
  dispatch_uid="subject_consent_on_post_delete",
108
107
  )
109
- def subject_consent_on_post_delete(sender, instance, using, **kwargs):
108
+ def subject_consent_on_post_delete(sender, instance, using, **kwargs): # noqa: ARG001
110
109
  """Updates/Resets subject screening."""
111
110
  # don't allow if subject visits exist. This should be caught
112
111
  # in the ModelAdmin delete view
@@ -62,7 +62,7 @@ class SubjectConsent(
62
62
  max_length=15,
63
63
  help_text=_("from screening"),
64
64
  editable=False,
65
- null=True,
65
+ default="",
66
66
  )
67
67
 
68
68
  completed_by_next_of_kin = models.CharField(
@@ -67,12 +67,12 @@ class SubjectReconsent(
67
67
  self.get_subject_consent(
68
68
  screening_identifier=subject_screening.screening_identifier
69
69
  )
70
- except ObjectDoesNotExist:
71
- raise ValidationError("Previous consent does not exist.")
70
+ except ObjectDoesNotExist as e:
71
+ raise ValidationError("Previous consent does not exist.") from e
72
72
  super().save(*args, **kwargs)
73
73
 
74
74
  def natural_key(self):
75
- return (self.subject_identifier, self.version)
75
+ return self.subject_identifier, self.version
76
76
 
77
77
  def get_subject_consent(self, screening_identifier=None):
78
78
  """Returns the first subject consent model instance."""
@@ -1 +1 @@
1
- screening_identifier = "[A-Z0-9]{6,8}" # noqa
1
+ screening_identifier = "[A-Z0-9]{6,8}"
@@ -64,7 +64,7 @@ def render_consent_button(context, subject_screening: SubjectScreening):
64
64
  )
65
65
 
66
66
 
67
- def refusal_button(context, subject_refusal):
67
+ def refusal_button(context, subject_refusal): # noqa: ARG001
68
68
  title = ["Capture subject's primary reason for not joining."]
69
69
 
70
70
  return dict(
@@ -4,3 +4,10 @@ from .subject_screening_button import (
4
4
  SubjectScreeningPartThreeButton,
5
5
  SubjectScreeningPartTwoButton,
6
6
  )
7
+
8
+ __all__ = [
9
+ "SubjectScreeningButton",
10
+ "SubjectScreeningPartOneButton",
11
+ "SubjectScreeningPartThreeButton",
12
+ "SubjectScreeningPartTwoButton",
13
+ ]
@@ -1,7 +1,6 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  from dataclasses import dataclass, field
4
- from typing import Type
5
4
 
6
5
  from django.utils.translation import gettext as _
7
6
  from edc_constants.constants import TBD, YES
@@ -14,8 +13,8 @@ from meta_screening.models import ScreeningPartOne, ScreeningPartThree, Screenin
14
13
 
15
14
  __all__ = [
16
15
  "SubjectScreeningPartOneButton",
17
- "SubjectScreeningPartTwoButton",
18
16
  "SubjectScreeningPartThreeButton",
17
+ "SubjectScreeningPartTwoButton",
19
18
  ]
20
19
 
21
20
 
@@ -38,17 +37,13 @@ class SubjectScreeningButton(BaseSubjectScreeningButton):
38
37
 
39
38
  @property
40
39
  def title(self) -> str:
41
- if self.perms.view_only or self.model_obj.consented:
42
- title = _("View")
43
- else:
44
- title = _("Edit")
45
- return title
40
+ return _("View") if self.perms.view_only or self.model_obj.consented else _("Edit")
46
41
 
47
42
 
48
43
  @dataclass
49
44
  class SubjectScreeningPartOneButton(SubjectScreeningButton):
50
45
  model_obj: ScreeningPartOne = None
51
- model_cls: Type[ScreeningPartOne] = field(default=ScreeningPartOne)
46
+ model_cls: type[ScreeningPartOne] = field(default=ScreeningPartOne)
52
47
 
53
48
  @property
54
49
  def label(self) -> str:
@@ -58,7 +53,7 @@ class SubjectScreeningPartOneButton(SubjectScreeningButton):
58
53
  @dataclass
59
54
  class SubjectScreeningPartTwoButton(SubjectScreeningButton):
60
55
  model_obj: ScreeningPartTwo = None
61
- model_cls: Type[ScreeningPartTwo] = field(default=ScreeningPartTwo)
56
+ model_cls: type[ScreeningPartTwo] = field(default=ScreeningPartTwo)
62
57
 
63
58
  @property
64
59
  def label(self) -> str:
@@ -76,9 +71,8 @@ class SubjectScreeningPartTwoButton(SubjectScreeningButton):
76
71
  self._action = VIEW
77
72
  if self.model_obj.eligible_part_two == TBD:
78
73
  self._action = ADD
79
- elif self.model_obj:
80
- if self.perms.change:
81
- self._action = CHANGE
74
+ elif self.model_obj and self.perms.change:
75
+ self._action = CHANGE
82
76
  return self._action
83
77
 
84
78
  @property
@@ -91,7 +85,7 @@ class SubjectScreeningPartTwoButton(SubjectScreeningButton):
91
85
  @dataclass
92
86
  class SubjectScreeningPartThreeButton(SubjectScreeningButton):
93
87
  model_obj: ScreeningPartThree = None
94
- model_cls: Type[ScreeningPartThree] = field(default=ScreeningPartThree)
88
+ model_cls: type[ScreeningPartThree] = field(default=ScreeningPartThree)
95
89
 
96
90
  @property
97
91
  def label(self) -> str:
@@ -109,9 +103,8 @@ class SubjectScreeningPartThreeButton(SubjectScreeningButton):
109
103
  self._action = VIEW
110
104
  if self.model_obj.eligible_part_three == TBD:
111
105
  self._action = ADD
112
- elif self.model_obj:
113
- if self.perms.change:
114
- self._action = CHANGE
106
+ elif self.model_obj and self.perms.change:
107
+ self._action = CHANGE
115
108
  return self._action
116
109
 
117
110
  @property
@@ -2,3 +2,11 @@ from .ae import AeListboardView, DeathReportListboardView
2
2
  from .screening import ListboardView as ScreeningListboardView
3
3
  from .subject import DashboardView as SubjectDashboardView
4
4
  from .subject import SubjectListboardView
5
+
6
+ __all__ = [
7
+ "AeListboardView",
8
+ "DeathReportListboardView",
9
+ "ScreeningListboardView",
10
+ "SubjectDashboardView",
11
+ "SubjectListboardView",
12
+ ]
@@ -1,2 +1,4 @@
1
1
  from .ae_listboard_view import AeListboardView
2
2
  from .death_report_listboard_view import DeathReportListboardView
3
+
4
+ __all__ = ["AeListboardView", "DeathReportListboardView"]
@@ -5,7 +5,7 @@ from meta_reports.ae_report import AePdfReport
5
5
 
6
6
 
7
7
  class CustomAeReport(AePdfReport):
8
- logo_data = {
8
+ logo_data = { # noqa: RUF012
9
9
  "app_label": "meta_edc",
10
10
  "filename": "meta_logo.png",
11
11
  "first_page": (4.0 * cm, 0.83 * cm),
@@ -5,7 +5,7 @@ from meta_reports.death_report import DeathPdfReport
5
5
 
6
6
 
7
7
  class CustomDeathReport(DeathPdfReport):
8
- logo_data = {
8
+ logo_data = { # noqa: RUF012
9
9
  "app_label": "meta_edc",
10
10
  "filename": "meta_logo.png",
11
11
  "first_page": (4.0 * cm, 0.83 * cm),
@@ -1 +1,3 @@
1
1
  from .listboard_view import ListboardView
2
+
3
+ __all__ = ["ListboardView"]
@@ -1,2 +1,4 @@
1
1
  from .dashboard import DashboardView
2
2
  from .listboard import SubjectListboardView
3
+
4
+ __all__ = ["DashboardView", "SubjectListboardView"]
@@ -1 +1,3 @@
1
1
  from .dashboard_view import DashboardView
2
+
3
+ __all__ = ["DashboardView"]
@@ -32,7 +32,7 @@ class DashboardView(SubjectDashboardView):
32
32
  message = format_html(
33
33
  '{text} <A href="{url}">{verbose_name}</A>',
34
34
  text=_("Subject has reached the protocol endpoint. See "),
35
- url=mark_safe(url), # nosec B703, B308
35
+ url=mark_safe(url), # noqa: S308
36
36
  verbose_name=GlucoseSummary._meta.verbose_name,
37
37
  )
38
38
  self.message_user(message, level=messages.WARNING)
@@ -1 +1,3 @@
1
1
  from .listboard_view import SubjectListboardView
2
+
3
+ __all__ = ["SubjectListboardView"]
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/celery.py CHANGED
@@ -13,4 +13,4 @@ app.autodiscover_tasks()
13
13
 
14
14
  @app.task(bind=True)
15
15
  def debug_task(self):
16
- print("Request: {0!r}".format(self.request))
16
+ print(f"Request: {self.request!r}")
meta_edc/celery_live.py CHANGED
@@ -15,4 +15,4 @@ app.autodiscover_tasks()
15
15
 
16
16
  @app.task(bind=True)
17
17
  def debug_task(self):
18
- print("Request: {0!r}".format(self.request))
18
+ print(f"Request: {self.request!r}")
meta_edc/celery_uat.py CHANGED
@@ -21,4 +21,4 @@ app.autodiscover_tasks()
21
21
 
22
22
  @app.task(bind=True)
23
23
  def debug_task(self):
24
- print("Request: {0!r}".format(self.request))
24
+ print(f"Request: {self.request!r}")
@@ -1,36 +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)
18
+ doc_folder = settings.BASE_DIR / "docs"
19
+ if not doc_folder.exists():
20
+ doc_folder.mkdir()
23
21
  forms = FormsReference(
24
22
  visit_schedules=[visit_schedule],
25
23
  admin_site=meta_subject_admin,
26
24
  add_per_form_timestamp=False,
27
25
  )
28
- path = os.path.join(doc_folder, "forms_reference.md")
26
+ path = doc_folder / "forms_reference.md"
29
27
  forms.to_file(path=path, overwrite=True, pad=0)
30
28
 
31
29
 
32
30
  class Command(BaseCommand):
33
31
  help = "Update forms reference document (.md)"
34
32
 
35
- def handle(self, *args, **options):
33
+ def handle(self, *args, **options): # noqa: ARG002
36
34
  update_forms_reference()
@@ -1,15 +1,16 @@
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
 
9
10
  # TZ Sites:
10
11
  # SITE_ID = SiteID(default=20) # Amana
11
- SITE_ID = SiteID(default=10) # Hindu Mandal
12
- # SITE_ID = SiteID(default=40) # Mwananyamala
12
+ # SITE_ID = SiteID(default=10) # Hindu Mandal
13
+ SITE_ID = SiteID(default=40) # Mwananyamala
13
14
  # SITE_ID = SiteID(default=50) # Mbagala
14
15
  # SITE_ID = SiteID(default=60) # Mnazi-Moja
15
16
  # SITE_ID = SiteID(default=30) # Temeke
@@ -32,9 +32,18 @@ env = environ.Env(
32
32
  TWILIO_ENABLED=(bool, False),
33
33
  EDC_SITES_DOMAIN_SUFFIX="meta4.clinicedc.org",
34
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
35
42
 
36
- BASE_DIR = Path(__file__).resolve().parent.parent.parent
37
- 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
38
47
 
39
48
  # copy your .env file from .envs/ to BASE_DIR
40
49
  if "test" in sys.argv:
@@ -60,6 +69,12 @@ SECRET_KEY = env.str("DJANGO_SECRET_KEY")
60
69
 
61
70
  APP_NAME = env.str("DJANGO_APP_NAME")
62
71
 
72
+ DJANGO_REVISION_IGNORE_WORKING_DIR = env.str("DJANGO_REVISION_IGNORE_WORKING_DIR")
73
+ if DJANGO_REVISION_IGNORE_WORKING_DIR:
74
+ # get the version from the package and not a git tag
75
+ # this overrides django_revision
76
+ REVISION = version(APP_NAME)
77
+
63
78
  LIVE_SYSTEM = env.str("DJANGO_LIVE_SYSTEM")
64
79
 
65
80
  ETC_DIR = env.str("DJANGO_ETC_FOLDER")
@@ -471,7 +486,7 @@ if TWILIO_ENABLED:
471
486
  TWILIO_SENDER = env.str("TWILIO_SENDER")
472
487
 
473
488
  # django_revision
474
- GIT_DIR = BASE_DIR
489
+ GIT_DIR = BASE_DIR.parent
475
490
 
476
491
  # django_crypto_fields
477
492
  KEY_PATH = env.str("DJANGO_KEY_FOLDER")
meta_edc/settings/live.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 = 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 +1,3 @@
1
1
  from .home_view import HomeView
2
+
3
+ __all__ = ["HomeView"]