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
@@ -2,11 +2,8 @@ from django.contrib import admin
2
2
  from django.template.loader import render_to_string
3
3
  from django.urls import reverse
4
4
  from django_audit_fields.admin import audit_fieldset_tuple
5
- from edc_action_item import (
6
- ActionItemModelAdminMixin,
7
- action_fields,
8
- action_fieldset_tuple,
9
- )
5
+ from edc_action_item.fieldsets import action_fields, action_fieldset_tuple
6
+ from edc_action_item.modeladmin_mixins import ActionItemModelAdminMixin
10
7
  from edc_crf.fieldset import crf_status_fieldset
11
8
  from edc_form_label import FormLabelModelAdminMixin
12
9
  from edc_model_admin.history import SimpleHistoryAdmin
@@ -22,11 +19,11 @@ class BirthOutcomesInlineAdmin(TabularInlineMixin, admin.TabularInline):
22
19
  model = BirthOutcomes
23
20
  form = BirthOutcomesForm
24
21
  extra = 1
25
- fields = [
22
+ fields = (
26
23
  "birth_order",
27
24
  "birth_outcome",
28
25
  "birth_weight",
29
- ]
26
+ )
30
27
 
31
28
 
32
29
  @admin.register(Delivery, site=meta_subject_admin)
@@ -38,7 +35,7 @@ class DeliveryAdmin(
38
35
  ):
39
36
  form = DeliveryForm
40
37
 
41
- inlines = [BirthOutcomesInlineAdmin]
38
+ inlines = (BirthOutcomesInlineAdmin,)
42
39
 
43
40
  fieldsets = (
44
41
  (None, {"fields": ("subject_visit", "report_datetime")}),
@@ -94,7 +91,7 @@ class DeliveryAdmin(
94
91
  "maternal_outcome",
95
92
  )
96
93
 
97
- radio_fields = {
94
+ radio_fields = { # noqa: RUF012
98
95
  "info_available": admin.VERTICAL,
99
96
  "info_source": admin.VERTICAL,
100
97
  "informant_relation": admin.VERTICAL,
@@ -112,7 +109,7 @@ class DeliveryAdmin(
112
109
  )
113
110
 
114
111
  @admin.display
115
- def birth_outcomes(self, obj=None, label=None):
112
+ def birth_outcomes(self, obj=None, label=None): # noqa: ARG002
116
113
  url = reverse("meta_subject_admin:meta_subject_birthoutcomes_changelist")
117
114
  url = f"{url}?q={obj.subject_identifier}"
118
115
  context = dict(title="Outcomes", url=url, label="Outcomes")
@@ -1,2 +1,4 @@
1
1
  from .dm_endpoint_admin import DmEndpointAdmin
2
2
  from .dm_followup_admin import DmFollowupAdmin
3
+
4
+ __all__ = ["DmEndpointAdmin", "DmFollowupAdmin"]
@@ -30,6 +30,6 @@ class DmEndpointAdmin(
30
30
  audit_fieldset_tuple,
31
31
  )
32
32
 
33
- list_filter = ["endpoint_reached"]
33
+ list_filter = ("endpoint_reached",)
34
34
 
35
- radio_fields = {"endpoint_reached": admin.VERTICAL}
35
+ radio_fields = {"endpoint_reached": admin.VERTICAL} # noqa: RUF012
@@ -1,6 +1,7 @@
1
1
  from django.contrib import admin
2
2
  from django_audit_fields.admin import audit_fieldset_tuple
3
- from edc_action_item import ActionItemModelAdminMixin, action_fieldset_tuple
3
+ from edc_action_item.fieldsets import action_fieldset_tuple
4
+ from edc_action_item.modeladmin_mixins import ActionItemModelAdminMixin
4
5
  from edc_adherence.model_admin_mixin import get_visual_score_fieldset_tuple
5
6
  from edc_crf.fieldset import crf_status_fieldset
6
7
  from edc_form_label.form_label_modeladmin_mixin import FormLabelModelAdminMixin
@@ -86,7 +87,7 @@ class DmFollowupAdmin(
86
87
  "missed_referral_reasons",
87
88
  )
88
89
 
89
- radio_fields = {
90
+ radio_fields = { # noqa: RUF012
90
91
  "attended": admin.VERTICAL,
91
92
  "investigations_performed": admin.VERTICAL,
92
93
  "on_dm_medications": admin.VERTICAL,
@@ -1,5 +1,5 @@
1
1
  from django.contrib import admin
2
- from edc_action_item import ActionItemModelAdminMixin
2
+ from edc_action_item.modeladmin_mixins import ActionItemModelAdminMixin
3
3
  from edc_egfr.admin import EgfrDropNotificationAdminMixin
4
4
  from edc_model_admin.history import SimpleHistoryAdmin
5
5
 
@@ -1,6 +1,7 @@
1
1
  from django.contrib import admin
2
2
  from django_audit_fields.admin import audit_fieldset_tuple
3
- from edc_action_item import ActionItemModelAdminMixin, action_fieldset_tuple
3
+ from edc_action_item.fieldsets import action_fieldset_tuple
4
+ from edc_action_item.modeladmin_mixins import ActionItemModelAdminMixin
4
5
  from edc_constants.constants import NONE, YES
5
6
  from edc_crf.fieldset import crf_status_fieldset
6
7
  from edc_form_label.form_label_modeladmin_mixin import FormLabelModelAdminMixin
@@ -16,17 +17,18 @@ class GradedEventFilter(admin.SimpleListFilter):
16
17
  title = "Graded events"
17
18
  parameter_name = "grade"
18
19
 
19
- def lookups(self, request, model_admin):
20
+ def lookups(self, request, model_admin): # noqa: ARG002
20
21
  return (
21
22
  ("g3", "Grade 3"),
22
23
  ("g4", "Grade 4"),
23
24
  )
24
25
 
25
- def queryset(self, request, queryset):
26
+ def queryset(self, request, queryset): # noqa: ARG002
26
27
  if self.value() == "g3":
27
28
  return queryset.exclude(symptoms_g3__name=NONE)
28
29
  if self.value() == "g4":
29
30
  return queryset.exclude(symptoms_g4__name=NONE)
31
+ return queryset
30
32
 
31
33
 
32
34
  @admin.register(FollowupExamination, site=meta_subject_admin)
@@ -36,14 +38,13 @@ class FollowupExaminationAdmin(
36
38
  ActionItemModelAdminMixin,
37
39
  SimpleHistoryAdmin,
38
40
  ):
39
-
40
41
  form = FollowupExaminationForm
41
42
 
42
- autocomplete_fields = ["art_new_regimen"]
43
+ autocomplete_fields = ("art_new_regimen",)
43
44
 
44
- additional_instructions = [
45
- "If participant is pregnant, complete the action linked CRF `Pregnancy notification`."
46
- ]
45
+ additional_instructions = (
46
+ "If participant is pregnant, complete the action linked CRF `Pregnancy notification`.",
47
+ )
47
48
 
48
49
  fieldsets = (
49
50
  (None, {"fields": ("subject_visit", "report_datetime")}),
@@ -128,7 +129,7 @@ class FollowupExaminationAdmin(
128
129
 
129
130
  # readonly_fields = action_fields
130
131
 
131
- radio_fields = {
132
+ radio_fields = { # noqa: RUF012
132
133
  "abdominal_tenderness": admin.VERTICAL,
133
134
  "admitted_hospital": admin.VERTICAL,
134
135
  "any_other_problems": admin.VERTICAL,
@@ -15,10 +15,9 @@ from .modeladmin import CrfModelAdminMixin
15
15
  class FollowupVitalsAdmin(CrfModelAdminMixin, FormLabelModelAdminMixin, SimpleHistoryAdmin):
16
16
  form = FollowupVitalsForm
17
17
 
18
- additional_instructions = [
19
- "If participant is pregnant, complete the action "
20
- "linked CRF `Pregnancy notification`."
21
- ]
18
+ additional_instructions = (
19
+ "If participant is pregnant, complete the action linked CRF `Pregnancy notification`."
20
+ )
22
21
 
23
22
  fieldsets = (
24
23
  (None, {"fields": ("subject_visit", "report_datetime")}),
@@ -68,7 +67,7 @@ class FollowupVitalsAdmin(CrfModelAdminMixin, FormLabelModelAdminMixin, SimpleHi
68
67
 
69
68
  filter_horizontal = ()
70
69
 
71
- radio_fields = {
70
+ radio_fields = { # noqa: RUF012
72
71
  "waist_circumference_measured": admin.VERTICAL,
73
72
  "severe_htn": admin.VERTICAL,
74
73
  }
@@ -1,7 +1,5 @@
1
1
  from __future__ import annotations
2
2
 
3
- from typing import Type
4
-
5
3
  from django.contrib import admin
6
4
  from django.contrib.admin import SimpleListFilter
7
5
  from django.template.loader import render_to_string
@@ -72,7 +70,7 @@ class GlucoseAdmin(CrfModelAdminMixin, SimpleHistoryAdmin):
72
70
  audit_fieldset_tuple,
73
71
  )
74
72
 
75
- radio_fields = {
73
+ radio_fields = { # noqa: RUF012
76
74
  "fasting": admin.VERTICAL,
77
75
  "fbg_units": admin.VERTICAL,
78
76
  "fbg_performed": admin.VERTICAL,
@@ -89,7 +87,7 @@ class GlucoseAdmin(CrfModelAdminMixin, SimpleHistoryAdmin):
89
87
  list_display = tuple(list_display)
90
88
  return list_display
91
89
 
92
- def get_list_filter(self, request) -> tuple[str | Type[SimpleListFilter], ...]:
90
+ def get_list_filter(self, request) -> tuple[str | type[SimpleListFilter], ...]:
93
91
  list_filter = super().get_list_filter(request)
94
92
  list_filter = list(list_filter)
95
93
  list_filter.insert(2, OgttListFilter)
@@ -1,7 +1,5 @@
1
1
  from __future__ import annotations
2
2
 
3
- from typing import Type
4
-
5
3
  from django.contrib import admin
6
4
  from django.contrib.admin import SimpleListFilter
7
5
  from django_audit_fields import audit_fieldset_tuple
@@ -74,7 +72,7 @@ class GlucoseFbgAdmin(CrfModelAdminMixin, SimpleHistoryAdmin):
74
72
  list_display = tuple(list_display)
75
73
  return list_display
76
74
 
77
- def get_list_filter(self, request) -> tuple[str | Type[SimpleListFilter], ...]:
75
+ def get_list_filter(self, request) -> tuple[str | type[SimpleListFilter], ...]:
78
76
  list_filter = super().get_list_filter(request)
79
77
  list_filter = list(list_filter)
80
78
  list_filter.insert(2, GlucoseListFilter)
@@ -1,2 +1,4 @@
1
1
  from .health_economics_simple_admin import HealthEconomicsSimpleAdmin
2
2
  from .health_economics_update_admin import HealthEconomicsUpdateAdmin
3
+
4
+ __all__ = ["HealthEconomicsSimpleAdmin", "HealthEconomicsUpdateAdmin"]
@@ -31,4 +31,4 @@ class HealthEconomicsSimpleAdmin(CrfModelAdminMixin, SimpleHistoryAdmin):
31
31
  audit_fieldset_tuple,
32
32
  )
33
33
 
34
- radio_fields = {**education_radio_fields}
34
+ radio_fields = {**education_radio_fields} # noqa: RUF012
@@ -92,7 +92,7 @@ class HealthEconomicsUpdateAdmin(CrfModelAdminMixin, SimpleHistoryAdmin):
92
92
  audit_fieldset_tuple,
93
93
  )
94
94
 
95
- radio_fields = {
95
+ radio_fields = { # noqa: RUF012
96
96
  "hoh": admin.VERTICAL,
97
97
  "relationship_to_hoh": admin.VERTICAL,
98
98
  "avg_income": admin.VERTICAL,
@@ -47,7 +47,7 @@ class HepatitisTestAdmin(CrfModelAdminMixin, SimpleHistoryAdmin):
47
47
  audit_fieldset_tuple,
48
48
  )
49
49
 
50
- radio_fields = {
50
+ radio_fields = { # noqa: RUF012
51
51
  "hbsag_performed": admin.VERTICAL,
52
52
  "hbsag": admin.VERTICAL,
53
53
  "hcv_performed": admin.VERTICAL,
@@ -46,7 +46,7 @@ class OgttListFilter(SimpleListFilter):
46
46
  parameter_name = "ogtt_value"
47
47
  model_cls = Glucose
48
48
 
49
- def lookups(self, request, model_admin):
49
+ def lookups(self, request, model_admin): # noqa: ARG002
50
50
  return (
51
51
  (NORMAL, "Normal"),
52
52
  (HIGH, "High"),
@@ -28,11 +28,13 @@ def get_fieldsets():
28
28
  },
29
29
  )
30
30
 
31
- fieldsets = (fieldset,) + get_mnsi_fieldsets()
32
- fieldsets += (crf_status_fieldset_tuple,)
33
- fieldsets += (calculated_values_fieldset,)
34
- fieldsets += (audit_fieldset_tuple,)
35
- return fieldsets
31
+ return (
32
+ fieldset,
33
+ *get_mnsi_fieldsets(),
34
+ crf_status_fieldset_tuple,
35
+ calculated_values_fieldset,
36
+ audit_fieldset_tuple,
37
+ )
36
38
 
37
39
 
38
40
  edc_mnsi_admin.unregister(DefaultMnsi)
@@ -15,7 +15,7 @@ class OtherArvRegimensInlineAdmin(TabularInlineMixin, admin.TabularInline):
15
15
  form = OtherArvRegimensDetailForm
16
16
  extra = 1
17
17
  view_on_site = False
18
- autocomplete_fields = ["arv_regimen"]
18
+ autocomplete_fields = ("arv_regimen",)
19
19
 
20
20
  fieldsets = (
21
21
  (
@@ -40,7 +40,7 @@ class OtherArvRegimensInlineAdmin(TabularInlineMixin, admin.TabularInline):
40
40
  class OtherArvRegimensAdmin(CrfModelAdminMixin, SimpleHistoryAdmin):
41
41
  form = OtherArvRegimensForm
42
42
 
43
- inlines = [OtherArvRegimensInlineAdmin]
43
+ inlines = (OtherArvRegimensInlineAdmin,)
44
44
 
45
45
  fieldsets = (
46
46
  (None, {"fields": ("subject_visit", "report_datetime", "has_other_regimens")}),
@@ -48,6 +48,6 @@ class OtherArvRegimensAdmin(CrfModelAdminMixin, SimpleHistoryAdmin):
48
48
  audit_fieldset_tuple,
49
49
  )
50
50
 
51
- radio_fields = {
51
+ radio_fields = { # noqa: RUF012
52
52
  "has_other_regimens": admin.VERTICAL,
53
53
  }
@@ -14,8 +14,8 @@ from .modeladmin import CrfModelAdminMixin
14
14
  class PatientHistoryAdmin(CrfModelAdminMixin, SimpleHistoryAdmin):
15
15
  form = PatientHistoryForm
16
16
 
17
- autocomplete_fields = ["current_arv_regimen", "previous_arv_regimen"]
18
- fieldsets = [
17
+ autocomplete_fields = ("current_arv_regimen", "previous_arv_regimen")
18
+ fieldsets = (
19
19
  (None, {"fields": ("subject_visit", "report_datetime")}),
20
20
  ("Part 1: Symptoms", {"fields": ("symptoms", "other_symptoms")}),
21
21
  get_hiv_fieldset(part="2"),
@@ -23,9 +23,9 @@ class PatientHistoryAdmin(CrfModelAdminMixin, SimpleHistoryAdmin):
23
23
  get_other_history_fieldset(part="4"),
24
24
  crf_status_fieldset,
25
25
  audit_fieldset_tuple,
26
- ]
26
+ )
27
27
 
28
- radio_fields = {
28
+ radio_fields = { # noqa: RUF012
29
29
  "current_arv_regimen": admin.VERTICAL,
30
30
  "current_smoker": admin.VERTICAL,
31
31
  "dm_in_family": admin.VERTICAL,
@@ -52,7 +52,7 @@ class PhysicalExamAdmin(CrfModelAdminMixin, SimpleHistoryAdmin):
52
52
  audit_fieldset_tuple,
53
53
  )
54
54
 
55
- radio_fields = {
55
+ radio_fields = { # noqa: RUF012
56
56
  "abdominal_tenderness": admin.VERTICAL,
57
57
  "enlarged_liver": admin.VERTICAL,
58
58
  "irregular_heartbeat": admin.VERTICAL,
@@ -28,6 +28,6 @@ class PregnancyUpdateAdmin(CrfModelAdminMixin, SimpleHistoryAdmin):
28
28
  audit_fieldset_tuple,
29
29
  )
30
30
 
31
- radio_fields = {
31
+ radio_fields = { # noqa: RUF012
32
32
  "contact": admin.VERTICAL,
33
33
  }
@@ -1,7 +1,6 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  from decimal import Decimal
4
- from typing import Type
5
4
 
6
5
  from django.contrib import admin, messages
7
6
  from django.contrib.admin import SimpleListFilter
@@ -30,15 +29,14 @@ from .modeladmin import CrfModelAdminMixin
30
29
 
31
30
  @admin.register(StudyMedication, site=meta_subject_admin)
32
31
  class StudyMedicationAdmin(CrfModelAdminMixin, SimpleHistoryAdmin):
33
-
34
- actions = ["create_or_update_rx_refills"]
32
+ actions = ("create_or_update_rx_refills",)
35
33
 
36
34
  form = StudyMedicationForm
37
35
 
38
- autocomplete_fields = [
36
+ autocomplete_fields = (
39
37
  "dosage_guideline",
40
38
  "formulation",
41
- ]
39
+ )
42
40
 
43
41
  fieldsets = (
44
42
  (
@@ -78,20 +76,19 @@ class StudyMedicationAdmin(CrfModelAdminMixin, SimpleHistoryAdmin):
78
76
  audit_fieldset_tuple,
79
77
  )
80
78
 
81
- radio_fields = {
79
+ radio_fields = { # noqa: RUF012
82
80
  "formulation": admin.VERTICAL,
83
81
  "refill": admin.VERTICAL,
84
82
  "refill_to_next_visit": admin.VERTICAL,
85
83
  }
86
84
 
87
- def get_list_filter(self, request) -> tuple[str | Type[SimpleListFilter], ...]:
85
+ def get_list_filter(self, request) -> tuple[str | type[SimpleListFilter], ...]:
88
86
  list_filter = super().get_list_filter(request)
89
87
  list_filter = list(list_filter)
90
88
  list_filter.insert(4, "dosage_guideline")
91
89
  list_filter.insert(4, RefillEndDateListFilter)
92
90
  list_filter.insert(4, RefillStartDateListFilter)
93
- list_filter = tuple(list_filter)
94
- return list_filter
91
+ return tuple(list_filter)
95
92
 
96
93
  def get_list_display(self, request) -> tuple[str, ...]:
97
94
  list_display = super().get_list_display(request)
@@ -100,8 +97,7 @@ class StudyMedicationAdmin(CrfModelAdminMixin, SimpleHistoryAdmin):
100
97
  list_display.insert(4, "refill_end_date")
101
98
  list_display.insert(4, "refill_start_date")
102
99
  list_display.insert(4, "dosage_guideline")
103
- list_display = tuple(list_display)
104
- return list_display
100
+ return tuple(list_display)
105
101
 
106
102
  @admin.display(description="days", ordering="number_of_days")
107
103
  def refill_days(self, obj):
@@ -156,10 +152,7 @@ class StudyMedicationAdmin(CrfModelAdminMixin, SimpleHistoryAdmin):
156
152
  messages.add_message(
157
153
  request,
158
154
  ERROR,
159
- (
160
- f"ObjectDoesNotExist: {obj.subject_identifier}, "
161
- f"{obj.related_visit}, {str(e)}"
162
- ),
155
+ (f"ObjectDoesNotExist: {obj.subject_identifier}, {obj.related_visit}, {e!s}"),
163
156
  )
164
157
  errors += 1
165
158
  except StudyMedicationError as e:
@@ -31,7 +31,7 @@ class SubjectRequisitionAdmin(RequisitionAdminMixin, CrfModelAdminMixin, SimpleH
31
31
  audit_fieldset_tuple,
32
32
  )
33
33
 
34
- radio_fields = {
34
+ radio_fields = { # noqa: RUF012
35
35
  "is_drawn": admin.VERTICAL,
36
36
  "reason_not_drawn": admin.VERTICAL,
37
37
  "item_type": admin.VERTICAL,
@@ -39,7 +39,7 @@ class SubjectVisitAdmin(
39
39
  audit_fieldset_tuple,
40
40
  )
41
41
 
42
- radio_fields = {
42
+ radio_fields = { # noqa: RUF012
43
43
  "reason": admin.VERTICAL,
44
44
  "reason_unscheduled": admin.VERTICAL,
45
45
  "info_source": admin.VERTICAL,
@@ -38,7 +38,7 @@ class SubjectVisitMissedAdmin(
38
38
 
39
39
  filter_horizontal = ("missed_reasons",)
40
40
 
41
- radio_fields = {
41
+ radio_fields = { # noqa: RUF012
42
42
  "survival_status": admin.VERTICAL,
43
43
  "contact_attempted": admin.VERTICAL,
44
44
  "contact_made": admin.VERTICAL,
@@ -32,7 +32,7 @@ class UrineDipstickTestAdmin(CrfModelAdminMixin, SimpleHistoryAdmin):
32
32
  audit_fieldset_tuple,
33
33
  )
34
34
 
35
- radio_fields = {
35
+ radio_fields = { # noqa: RUF012
36
36
  "performed": admin.VERTICAL,
37
37
  "ketones": admin.VERTICAL,
38
38
  "protein": admin.VERTICAL,
@@ -31,7 +31,7 @@ class UrinePregnancyAdmin(CrfModelAdminMixin, SimpleHistoryAdmin):
31
31
  audit_fieldset_tuple,
32
32
  )
33
33
 
34
- radio_fields = {
34
+ radio_fields = { # noqa: RUF012
35
35
  "performed": admin.VERTICAL,
36
36
  "bhcg_value": admin.VERTICAL,
37
37
  }
@@ -1,5 +1,5 @@
1
- from edc_constants.constants import NO, NOT_APPLICABLE, PATIENT, POS, YES
2
- from edc_utils import get_utcnow
1
+ from django.utils import timezone
2
+ from edc_constants.constants import NO, NOT_APPLICABLE, NULL_STRING, PATIENT, POS, YES
3
3
  from edc_visit_tracking.constants import SCHEDULED
4
4
  from faker import Faker
5
5
  from model_bakery.recipe import Recipe
@@ -26,22 +26,22 @@ subjectrequisition = Recipe(SubjectRequisition)
26
26
 
27
27
  medicationadherence = Recipe(
28
28
  MedicationAdherence,
29
- report_datetime=get_utcnow(),
29
+ report_datetime=timezone.now(),
30
30
  visual_score_slider=90,
31
31
  visual_score_confirmed=90,
32
32
  last_missed_pill=NO,
33
33
  pill_count_performed=YES,
34
34
  pill_count=3,
35
35
  missed_pill_reason=[],
36
- other_missed_pill_reason=None,
36
+ other_missed_pill_reason=NULL_STRING,
37
37
  )
38
38
 
39
39
  urinepregnancy = Recipe(
40
40
  UrinePregnancy,
41
- action_identifier=None,
42
- report_datetime=get_utcnow(),
41
+ action_identifier=NULL_STRING,
42
+ report_datetime=timezone.now(),
43
43
  performed=YES,
44
- not_performed_reason=None,
44
+ not_performed_reason=NULL_STRING,
45
45
  bhcg_value=POS,
46
46
  notified=False,
47
47
  notified_datetime=None,
@@ -79,16 +79,16 @@ followupexamination = Recipe(
79
79
  delivery = Recipe(
80
80
  Delivery,
81
81
  # site=None,
82
- action_identifier=None,
83
- report_datetime=get_utcnow(),
82
+ action_identifier=NULL_STRING,
83
+ report_datetime=timezone.now(),
84
84
  info_available=YES,
85
85
  info_source=PATIENT,
86
86
  informant_relation=NOT_APPLICABLE,
87
- informant_relation_other=None,
88
- delivery_datetime=get_utcnow(),
87
+ informant_relation_other=NULL_STRING,
88
+ delivery_datetime=timezone.now(),
89
89
  delivery_time_estimated=NO,
90
90
  delivery_location=HOSPITAL_CLINIC,
91
- delivery_location_other=None,
91
+ delivery_location_other=NULL_STRING,
92
92
  delivery_location_name="Big hospital",
93
93
  delivery_ga=40,
94
94
  gm_treated=NO,
@@ -98,8 +98,8 @@ delivery = Recipe(
98
98
  birthoutcomes = Recipe(
99
99
  BirthOutcomes,
100
100
  delivery=None,
101
- action_identifier=None,
102
- report_datetime=get_utcnow(),
101
+ action_identifier=NULL_STRING,
102
+ report_datetime=timezone.now(),
103
103
  birth_order=1,
104
104
  birth_outcome=LIVE_AT_TERM,
105
105
  birth_weight=320,
@@ -107,5 +107,5 @@ birthoutcomes = Recipe(
107
107
 
108
108
  healtheconomicsupdate = Recipe(
109
109
  HealthEconomicsUpdate,
110
- report_datetime=get_utcnow(),
110
+ report_datetime=timezone.now(),
111
111
  )
@@ -6,3 +6,14 @@ from .egfr_drop_notification_form_validator import EgfrDropNotificationFormValid
6
6
  from .followup_examination_form_validator import FollowupExaminationFormValidator
7
7
  from .glucose_form_validator import GlucoseFormValidator
8
8
  from .health_economics_form_validator import HealthEconomicsFormValidator
9
+
10
+ __all__ = [
11
+ "BirthOutcomesFormValidator",
12
+ "DeliveryFormValidator",
13
+ "DmEndpointFormValidator",
14
+ "DmFollowupFormValidator",
15
+ "EgfrDropNotificationFormValidator",
16
+ "FollowupExaminationFormValidator",
17
+ "GlucoseFormValidator",
18
+ "HealthEconomicsFormValidator",
19
+ ]
@@ -10,16 +10,15 @@ from meta_prn.models import PregnancyNotification
10
10
 
11
11
 
12
12
  class DeliveryFormValidator(CrfFormValidator):
13
-
14
13
  def clean(self):
15
14
  try:
16
15
  pregnancy_notification = PregnancyNotification.objects.get(
17
16
  subject_identifier=self.cleaned_data.get("subject_visit").subject_identifier
18
17
  )
19
- except ObjectDoesNotExist:
18
+ except ObjectDoesNotExist as e:
20
19
  raise forms.ValidationError(
21
20
  f"{PregnancyNotification._meta.verbose_name} not found."
22
- )
21
+ ) from e
23
22
 
24
23
  self.required_if(
25
24
  NO, field="info_available", field_required="info_not_available_reason"
@@ -30,7 +30,7 @@ class DmEndpointFormValidator(CrfFormValidator):
30
30
  {
31
31
  "__all__": format_html(
32
32
  "Subject has not reached the protocol endpoint. See {link}",
33
- link=mark_safe(link), # nosec B703, B308
33
+ link=mark_safe(link), # noqa: S308
34
34
  )
35
35
  },
36
36
  INVALID_ERROR,
@@ -11,7 +11,6 @@ from meta_prn.models import DmReferral
11
11
 
12
12
  class DmFollowupFormValidator(CrfFormValidator):
13
13
  def clean(self):
14
-
15
14
  # referral_date must be before report datetime
16
15
  if (
17
16
  self.report_datetime
@@ -228,8 +227,10 @@ class DmFollowupFormValidator(CrfFormValidator):
228
227
  and self.cleaned_data.get("on_dm_medications") == YES
229
228
  ):
230
229
  confirmed = self.cleaned_data.get("visual_score_confirmed")
231
- if confirmed is not None:
232
- if int(self.cleaned_data.get("visual_score_slider", "0")) != confirmed:
233
- raise forms.ValidationError(
234
- {"visual_score_confirmed": "Does not match visual score above."}
235
- )
230
+ if (
231
+ confirmed is not None
232
+ and int(self.cleaned_data.get("visual_score_slider", "0")) != confirmed
233
+ ):
234
+ raise forms.ValidationError(
235
+ {"visual_score_confirmed": "Does not match visual score above."}
236
+ )
@@ -70,13 +70,11 @@ class GlucoseFormValidator(FbgOgttFormValidatorMixin, CrfFormValidator):
70
70
 
71
71
  def is_endpoint(self):
72
72
  value = NO
73
- if self.cleaned_data.get("fbg_value") >= Decimal("7.0") and self.cleaned_data.get(
73
+ if (self.cleaned_data.get("fbg_value") >= Decimal("7.0") and self.cleaned_data.get(
74
74
  "ogtt_value"
75
- ) >= Decimal("11.1"):
76
- value = YES
77
- elif self.cleaned_data.get("fbg_value") < Decimal("7.0") and self.cleaned_data.get(
75
+ ) >= Decimal("11.1")) or (self.cleaned_data.get("fbg_value") < Decimal("7.0") and self.cleaned_data.get(
78
76
  "ogtt_value"
79
- ) >= Decimal("11.1"):
77
+ ) >= Decimal("11.1")):
80
78
  value = YES
81
79
  elif self.cleaned_data.get("fbg_value") >= Decimal("7.0") and self.cleaned_data.get(
82
80
  "ogtt_value"