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
@@ -9,7 +9,7 @@ class Endpoints(QaReportModelMixin, models.Model):
9
9
 
10
10
  visit_code = models.IntegerField(null=True)
11
11
 
12
- fasting = models.CharField(max_length=10, null=True)
12
+ fasting = models.CharField(max_length=10, default="")
13
13
 
14
14
  fbg_date = models.DateField(null=True)
15
15
 
@@ -17,18 +17,18 @@ class Endpoints(QaReportModelMixin, models.Model):
17
17
 
18
18
  ogtt_value = models.FloatField(null=True)
19
19
 
20
- endpoint_label = models.CharField(max_length=250, null=True)
20
+ endpoint_label = models.CharField(max_length=250, default="")
21
21
 
22
22
  baseline_date = models.DateField(null=True)
23
23
 
24
24
  offstudy_date = models.DateField(null=True)
25
25
 
26
- offstudy_reason = models.CharField(max_length=250, null=True)
26
+ offstudy_reason = models.CharField(max_length=250, default="")
27
27
 
28
28
  def __str__(self):
29
29
  return f"{self.subject_identifier} {self.visit_code} {self.endpoint_label}"
30
30
 
31
- class Meta(QaReportModelMixin.Meta):
31
+ class Meta(QaReportModelMixin.Meta): # noqa: DJ012
32
32
  verbose_name = "Endpoints (DM)"
33
33
  verbose_name_plural = "Endpoints (DM)"
34
34
  default_permissions = qa_reports_permissions
@@ -4,7 +4,6 @@ from edc_qareports.model_mixins import QaReportModelMixin, qa_reports_permission
4
4
 
5
5
 
6
6
  class LastImpRefill(QaReportModelMixin, models.Model):
7
-
8
7
  reference_date = models.DateField(null=True)
9
8
 
10
9
  imp_visit_code = models.FloatField(null=True)
@@ -15,7 +14,7 @@ class LastImpRefill(QaReportModelMixin, models.Model):
15
14
 
16
15
  next_appt_date = models.DateField(null=True)
17
16
 
18
- visit_code = models.CharField(max_length=15, null=True)
17
+ visit_code = models.CharField(max_length=15, default="")
19
18
 
20
19
  visit_code_sequence = models.IntegerField(null=True)
21
20
 
@@ -28,7 +27,7 @@ class LastImpRefill(QaReportModelMixin, models.Model):
28
27
  def recreate_db_view(self, **kwargs):
29
28
  raise NotImplementedError()
30
29
 
31
- class Meta(QaReportModelMixin.Meta):
30
+ class Meta(QaReportModelMixin.Meta): # noqa: DJ012
32
31
  verbose_name = "Last IMP Refill"
33
32
  verbose_name_plural = "Last IMP Refills"
34
33
  default_permissions = qa_reports_permissions
@@ -20,7 +20,7 @@ def get_weight_for_timepoint(subject_identifier=None, reference_dt=None):
20
20
 
21
21
 
22
22
  class MetaCrfPdfReport(CrfPdfReport):
23
- logo_data = {
23
+ logo_data = { # noqa: RUF012
24
24
  "app_label": "meta_edc",
25
25
  "filename": "meta_logo.png",
26
26
  "first_page": (4.0 * cm, 0.83 * cm),
@@ -34,7 +34,7 @@ class MetaCrfPdfReport(CrfPdfReport):
34
34
  subject_identifier=self.subject_identifier
35
35
  ).get_drug_assignment_display()
36
36
 
37
- def draw_demographics(self, story, **kwargs):
37
+ def draw_demographics(self, story, **kwargs): # noqa: ARG002
38
38
  model_obj = getattr(self, self.model_attr)
39
39
  weight = get_weight_for_timepoint(
40
40
  subject_identifier=self.subject_identifier,
meta_reports/tasks.py CHANGED
@@ -3,7 +3,7 @@ from celery import shared_task
3
3
 
4
4
  @shared_task
5
5
  def update_endpoints_table(subject_identifiers: list[str] | None = None):
6
- from meta_analytics.dataframes import GlucoseEndpointsByDate
6
+ from meta_analytics.dataframes import GlucoseEndpointsByDate # noqa: PLC0415
7
7
 
8
8
  if len(subject_identifiers) > 5:
9
9
  cls = GlucoseEndpointsByDate()
@@ -3,3 +3,11 @@ from .screening_part_three_admin import ScreeningPartThreeAdmin
3
3
  from .screening_part_two_admin import ScreeningPartTwoAdmin
4
4
  from .subject_refusal_admin import SubjectRefusalAdmin
5
5
  from .subject_screening_admin import SubjectScreeningAdmin
6
+
7
+ __all__ = [
8
+ "ScreeningPartOneAdmin",
9
+ "ScreeningPartThreeAdmin",
10
+ "ScreeningPartTwoAdmin",
11
+ "SubjectRefusalAdmin",
12
+ "SubjectScreeningAdmin",
13
+ ]
@@ -1,4 +1,3 @@
1
- from typing import Tuple
2
1
 
3
2
  from django.utils.safestring import mark_safe
4
3
 
@@ -20,7 +19,7 @@ from ..forms.field_lists import (
20
19
  )
21
20
 
22
21
 
23
- def get_part_one_fieldset(collapse=None) -> Tuple[str, dict]:
22
+ def get_part_one_fieldset(collapse=None) -> tuple[str, dict]:
24
23
  dct = {
25
24
  "description": mark_safe( # nosec B308
26
25
  "To be completed by the <u>study clinician</u> or the "
@@ -33,7 +32,7 @@ def get_part_one_fieldset(collapse=None) -> Tuple[str, dict]:
33
32
  return "Part 1", dct
34
33
 
35
34
 
36
- def get_part_two_fieldset(collapse=None) -> Tuple[str, dict]:
35
+ def get_part_two_fieldset(collapse=None) -> tuple[str, dict]:
37
36
  dct = {
38
37
  "description": mark_safe( # nosec B308
39
38
  "To be completed by the <u>study clinician</u> or the "
@@ -48,7 +47,7 @@ def get_part_two_fieldset(collapse=None) -> Tuple[str, dict]:
48
47
 
49
48
  def get_part_three_fieldset(
50
49
  collapse=None,
51
- ) -> Tuple[str, dict]:
50
+ ) -> tuple[str, dict]:
52
51
  dct = {
53
52
  "description": mark_safe( # nosec B308
54
53
  "To be completed by the <u>study clinician</u>"
@@ -67,7 +66,7 @@ def get_part_three_glucose_fieldset(collapse=None):
67
66
  return "Part 3c: Glucose Measurements (FBG / OGTT)", dct
68
67
 
69
68
 
70
- def get_part_three_repeat_glucose_fieldset(collapse=None) -> Tuple[str, dict]:
69
+ def get_part_three_repeat_glucose_fieldset(collapse=None) -> tuple[str, dict]:
71
70
  fields = [
72
71
  "repeat_glucose_performed",
73
72
  "repeat_fasting",
@@ -87,47 +86,47 @@ def get_part_three_repeat_glucose_fieldset(collapse=None) -> Tuple[str, dict]:
87
86
  return "Part 3d: Repeat Glucose Measurements (FBG / OGTT)", dct
88
87
 
89
88
 
90
- def get_part_three_other_fieldset(collapse=None) -> Tuple[str, dict]:
89
+ def get_part_three_other_fieldset(collapse=None) -> tuple[str, dict]:
91
90
  dct = {"fields": part_three_other_fields}
92
91
  if collapse:
93
92
  dct.update(classes=("collapse",))
94
93
  return "Part 3e: Creatinine / HbA1c", dct
95
94
 
96
95
 
97
- def get_part_three_creatinine_fieldset(collapse=None) -> Tuple[str, dict]:
96
+ def get_part_three_creatinine_fieldset(collapse=None) -> tuple[str, dict]:
98
97
  dct = {"fields": part_three_creatinine_fields}
99
98
  if collapse:
100
99
  dct.update(classes=("collapse",))
101
100
  return "Part 3e: Creatinine", dct
102
101
 
103
102
 
104
- def get_part_three_hba1c_fieldset(collapse=None) -> Tuple[str, dict]:
103
+ def get_part_three_hba1c_fieldset(collapse=None) -> tuple[str, dict]:
105
104
  dct = {"fields": part_three_hba1c_fields}
106
105
  if collapse:
107
106
  dct.update(classes=("collapse",))
108
107
  return "Part 3f: HbA1c", dct
109
108
 
110
109
 
111
- def get_part_three_report_datetime_fieldset() -> Tuple[str, dict]:
110
+ def get_part_three_report_datetime_fieldset() -> tuple[str, dict]:
112
111
  dct = {"fields": ["part_three_report_datetime"]}
113
112
  return "Part 3", dct
114
113
 
115
114
 
116
- def get_part_three_vitals_fieldset(collapse=None) -> Tuple[str, dict]:
115
+ def get_part_three_vitals_fieldset(collapse=None) -> tuple[str, dict]:
117
116
  dct = {"fields": part_three_vitals_fields}
118
117
  if collapse:
119
118
  dct.update(classes=("collapse",))
120
119
  return "Part 3a: Vitals", dct
121
120
 
122
121
 
123
- def get_part_three_pregnancy_fieldset(collapse=None) -> Tuple[str, dict]:
122
+ def get_part_three_pregnancy_fieldset(collapse=None) -> tuple[str, dict]:
124
123
  dct = {"fields": part_three_pregnancy_fields}
125
124
  if collapse:
126
125
  dct.update(classes=("collapse",))
127
126
  return "Part 3b: Pregnancy", dct
128
127
 
129
128
 
130
- def get_p3_screening_appt_update_fields(collapse=None) -> Tuple[str, dict]:
129
+ def get_p3_screening_appt_update_fields(collapse=None) -> tuple[str, dict]:
131
130
  dct = {
132
131
  "description": mark_safe( # nosec B308
133
132
  '<span style="color:orange;font-weight:bold">IMPORTANT:</span>'
@@ -144,14 +143,14 @@ def get_p3_screening_appt_update_fields(collapse=None) -> Tuple[str, dict]:
144
143
  return "Part 3 screening appointment update", dct
145
144
 
146
145
 
147
- comments_fieldset: Tuple[str, dict] = (
146
+ comments_fieldset: tuple[str, dict] = (
148
147
  "Additional Comments",
149
148
  {
150
149
  "fields": (*part_three_comment_fields,),
151
150
  },
152
151
  )
153
152
 
154
- calculated_values_fieldset: Tuple[str, dict] = (
153
+ calculated_values_fieldset: tuple[str, dict] = (
155
154
  "Calculated values",
156
155
  {
157
156
  "classes": ("collapse",),
@@ -11,13 +11,13 @@ class EligibilityPending(admin.SimpleListFilter):
11
11
 
12
12
  parameter_name = "eligibility_pending"
13
13
 
14
- def lookups(self, request, model_admin):
14
+ def lookups(self, request, model_admin): # noqa: ARG002
15
15
  return (
16
16
  (PENDING, "Pending"),
17
17
  (PENDING_REPEAT, "Pending repeat GLU"),
18
18
  )
19
19
 
20
- def queryset(self, request, queryset):
20
+ def queryset(self, request, queryset): # noqa: ARG002
21
21
  if self.value() == PENDING_REPEAT:
22
22
  return queryset.filter(
23
23
  eligible_part_one=YES,
@@ -35,6 +35,7 @@ class EligibilityPending(admin.SimpleListFilter):
35
35
  p3_ltfu=NOT_APPLICABLE,
36
36
  part_three_report_datetime__isnull=True,
37
37
  )
38
+ return queryset
38
39
 
39
40
 
40
41
  class P3LtfuListFilter(admin.SimpleListFilter):
@@ -42,13 +43,13 @@ class P3LtfuListFilter(admin.SimpleListFilter):
42
43
 
43
44
  parameter_name = "p3_ltfu_custom"
44
45
 
45
- def lookups(self, request, model_admin):
46
+ def lookups(self, request, model_admin): # noqa: ARG002
46
47
  return (
47
48
  (YES, "Yes"),
48
49
  (NO, "No, lost contact"),
49
50
  )
50
51
 
51
- def queryset(self, request, queryset):
52
+ def queryset(self, request, queryset): # noqa: ARG002
52
53
  if self.value() == YES:
53
54
  return queryset.filter(
54
55
  eligible_part_one=YES,
@@ -69,6 +70,7 @@ class P3LtfuListFilter(admin.SimpleListFilter):
69
70
  | Q(eligible_part_two=TBD)
70
71
  | Q(eligible_part_three=TBD)
71
72
  )
73
+ return queryset
72
74
 
73
75
 
74
76
  class P3ApptListFilter(AppointmentListFilter):
@@ -1,4 +1,3 @@
1
- from typing import Tuple
2
1
 
3
2
  from django.contrib import admin
4
3
  from django_audit_fields.admin import audit_fieldset_tuple
@@ -35,7 +34,7 @@ class ScreeningPartOneAdmin(SiteModelAdminMixin, SubjectScreeningAdmin):
35
34
 
36
35
  fieldsets = get_fieldsets()
37
36
 
38
- readonly_fields: Tuple[str, ...] = (
37
+ readonly_fields: tuple[str, ...] = (
39
38
  *part_two_fields,
40
39
  *part_three_fields,
41
40
  *calculated_fields,
@@ -1,5 +1,4 @@
1
1
  from copy import deepcopy
2
- from typing import Tuple
3
2
 
4
3
  from django.contrib import admin
5
4
  from django_audit_fields.admin import audit_fieldset_tuple
@@ -30,7 +29,7 @@ from .list_filters import EligibilityPending, P3ApptListFilter, P3LtfuListFilter
30
29
  from .subject_screening_admin import SubjectScreeningAdmin
31
30
 
32
31
 
33
- def get_part_two_fieldset_without_contact_number() -> Tuple[str, dict]:
32
+ def get_part_two_fieldset_without_contact_number() -> tuple[str, dict]:
34
33
  """Remove contact number from the part 2 fields"""
35
34
  part_two_name, part_two_dct = get_part_two_fieldset(collapse=True)
36
35
  part_two_dct = deepcopy(part_two_dct)
@@ -76,7 +75,7 @@ class ScreeningPartThreeAdmin(SiteModelAdminMixin, SubjectScreeningAdmin):
76
75
  "refused",
77
76
  )
78
77
 
79
- readonly_fields: Tuple[str, ...] = (
78
+ readonly_fields: tuple[str, ...] = (
80
79
  *part_one_fields,
81
80
  *(f for f in part_two_fields if f != "contact_number"),
82
81
  *calculated_fields,
@@ -1,5 +1,3 @@
1
- from typing import Tuple
2
-
3
1
  from django.contrib import admin
4
2
  from django_audit_fields.admin import audit_fieldset_tuple
5
3
  from edc_sites.admin import SiteModelAdminMixin
@@ -21,12 +19,12 @@ from .fieldsets import (
21
19
  from .subject_screening_admin import SubjectScreeningAdmin
22
20
 
23
21
 
24
- def get_fieldsets() -> Tuple[
25
- Tuple[str, dict],
26
- Tuple[str, dict],
27
- Tuple[str, dict],
28
- Tuple[str, dict],
29
- Tuple[str, dict],
22
+ def get_fieldsets() -> tuple[
23
+ tuple[str, dict],
24
+ tuple[str, dict],
25
+ tuple[str, dict],
26
+ tuple[str, dict],
27
+ tuple[str, dict],
30
28
  ]:
31
29
  return (
32
30
  get_part_one_fieldset(collapse=True),
@@ -39,12 +37,11 @@ def get_fieldsets() -> Tuple[
39
37
 
40
38
  @admin.register(ScreeningPartTwo, site=meta_screening_admin)
41
39
  class ScreeningPartTwoAdmin(SiteModelAdminMixin, SubjectScreeningAdmin):
42
-
43
40
  form = ScreeningPartTwoForm
44
41
 
45
42
  fieldsets = get_fieldsets()
46
43
 
47
- readonly_fields: Tuple[str, ...] = (
44
+ readonly_fields: tuple[str, ...] = (
48
45
  *part_one_fields,
49
46
  *part_three_fields,
50
47
  *calculated_fields,
@@ -17,7 +17,7 @@ class SubjectRefusalAdmin(
17
17
  ):
18
18
  form = SubjectRefusalForm
19
19
 
20
- autocomplete_fields = ["subject_screening"]
20
+ autocomplete_fields = ("subject_screening",)
21
21
 
22
22
  post_url_on_delete_name = "screening_listboard_url"
23
23
  subject_listboard_url_name = "screening_listboard_url"
@@ -54,7 +54,7 @@ class SubjectRefusalAdmin(
54
54
  "subject_screening__initials",
55
55
  )
56
56
 
57
- radio_fields = {"reason": admin.VERTICAL}
57
+ radio_fields = {"reason": admin.VERTICAL} # noqa: RUF012
58
58
 
59
59
  def get_subject_dashboard_url_kwargs(self, obj):
60
60
  return dict(screening_identifier=obj.screening_identifier)
@@ -69,5 +69,7 @@ class SubjectRefusalAdmin(
69
69
  if callable(super().view_on_site):
70
70
  url = super().view_on_site(obj)
71
71
  else:
72
- raise NoReverseMatch(f"{e}. See subject_dashboard_url_name for {repr(self)}.")
72
+ raise NoReverseMatch(
73
+ f"{e}. See subject_dashboard_url_name for {self!r}."
74
+ ) from e
73
75
  return url
@@ -97,7 +97,7 @@ class SubjectScreeningAdmin(ModelAdminSubjectDashboardMixin, SimpleHistoryAdmin)
97
97
  "inclusion_d",
98
98
  )
99
99
 
100
- radio_fields = {
100
+ radio_fields = { # noqa: RUF012
101
101
  "acute_condition": admin.VERTICAL,
102
102
  "acute_metabolic_acidosis": admin.VERTICAL,
103
103
  "advised_to_fast": admin.VERTICAL,
@@ -145,11 +145,11 @@ class SubjectScreeningAdmin(ModelAdminSubjectDashboardMixin, SimpleHistoryAdmin)
145
145
  "vl_undetectable": admin.VERTICAL,
146
146
  }
147
147
 
148
- def post_url_on_delete_kwargs(self, request, obj):
148
+ def post_url_on_delete_kwargs(self, request, obj): # noqa: ARG002
149
149
  return {}
150
150
 
151
151
  # TODO: this is a hack!
152
- def get_post_url_on_delete_name(self, request) -> str:
152
+ def get_post_url_on_delete_name(self, request) -> str: # noqa: ARG002
153
153
  return url_names.get(self.post_url_on_delete_name)
154
154
 
155
155
  @staticmethod
@@ -163,7 +163,7 @@ class SubjectScreeningAdmin(ModelAdminSubjectDashboardMixin, SimpleHistoryAdmin)
163
163
  data.append(f"Contact #: {obj.contact_number or '--'}")
164
164
  return format_html(
165
165
  "{}",
166
- mark_safe("<BR>".join(data)), # nosec B703, B308
166
+ mark_safe("<BR>".join(data)), # noqa: S308
167
167
  )
168
168
 
169
169
  def reasons(self, obj=None):
@@ -1,8 +1,8 @@
1
1
  from dateutil.relativedelta import relativedelta
2
2
  from django.contrib.sites.models import Site
3
- from edc_constants.constants import BLACK, FEMALE, NO, NOT_APPLICABLE, YES
3
+ from django.utils import timezone
4
+ from edc_constants.constants import BLACK, FEMALE, NO, NOT_APPLICABLE, NULL_STRING, YES
4
5
  from edc_reportable.units import MILLIGRAMS_PER_DECILITER, MILLIMOLES_PER_LITER
5
- from edc_utils import get_utcnow
6
6
  from faker import Faker
7
7
  from model_bakery.recipe import Recipe
8
8
 
@@ -13,11 +13,11 @@ fake = Faker()
13
13
 
14
14
  subjectscreening = Recipe(
15
15
  SubjectScreening,
16
- report_datetime=get_utcnow() - relativedelta(days=1),
16
+ report_datetime=timezone.now() - relativedelta(days=1),
17
17
  screening_consent=YES,
18
18
  hospital_identifier="111",
19
19
  initials="ZZ",
20
- subject_identifier=None,
20
+ subject_identifier=NULL_STRING,
21
21
  gender=FEMALE,
22
22
  age_in_years=40,
23
23
  ethnicity=BLACK,
@@ -29,7 +29,7 @@ subjectscreening = Recipe(
29
29
  staying_nearby_12=YES,
30
30
  pregnant=NO,
31
31
  site=Site.objects.get_current(),
32
- part_two_report_datetime=get_utcnow() - relativedelta(days=1),
32
+ part_two_report_datetime=timezone.now() - relativedelta(days=1),
33
33
  congestive_heart_failure=NO,
34
34
  liver_disease=NO,
35
35
  alcoholism=NO,
@@ -39,8 +39,8 @@ subjectscreening = Recipe(
39
39
  acute_condition=NO,
40
40
  metformin_sensitivity=NO,
41
41
  advised_to_fast=YES,
42
- appt_datetime=get_utcnow() + relativedelta(days=1),
43
- part_three_report_datetime=get_utcnow(),
42
+ appt_datetime=timezone.now() + relativedelta(days=1),
43
+ part_three_report_datetime=timezone.now(),
44
44
  weight=65,
45
45
  height=120,
46
46
  fasting=YES,
@@ -51,8 +51,8 @@ subjectscreening = Recipe(
51
51
  creatinine_units=MILLIGRAMS_PER_DECILITER,
52
52
  fbg_value=6.9,
53
53
  fbg_units=MILLIMOLES_PER_LITER,
54
- fbg_datetime=get_utcnow(),
55
- ogtt_base_datetime=get_utcnow(),
54
+ fbg_datetime=timezone.now(),
55
+ ogtt_base_datetime=timezone.now(),
56
56
  unsuitable_for_study=NO,
57
57
  unsuitable_agreed=NOT_APPLICABLE,
58
58
  vl_undetectable=YES,
@@ -6,3 +6,12 @@ from .eligibility import (
6
6
  from .eligibility_part_one import EligibilityPartOne
7
7
  from .eligibility_part_three import EligibilityPartThreePhaseThree
8
8
  from .eligibility_part_two import EligibilityPartTwo
9
+
10
+ __all__ = [
11
+ "EligibilityPartOne",
12
+ "EligibilityPartThreePhaseThree",
13
+ "EligibilityPartTwo",
14
+ "MetaEligibility",
15
+ "SubjectScreeningEligibilityError",
16
+ "get_display_label",
17
+ ]
@@ -16,7 +16,7 @@ class SubjectScreeningEligibilityError(Exception):
16
16
  pass
17
17
 
18
18
 
19
- def get_eligible_as_word(
19
+ def get_eligible_as_word( # noqa: PLR0913
20
20
  obj=None,
21
21
  eligible_part_one=None,
22
22
  eligible_part_two=None,
@@ -90,8 +90,8 @@ class MetaEligibility:
90
90
 
91
91
  """
92
92
 
93
- eligibility_values = [YES, NO, TBD]
94
- default_options = dict(
93
+ eligibility_values = (YES, NO, TBD)
94
+ default_options = dict( # noqa: RUF012
95
95
  eligible_value_default=TBD,
96
96
  eligible_values_list=[YES, NO, TBD],
97
97
  is_eligible_value=YES,
@@ -99,8 +99,8 @@ class MetaEligibility:
99
99
 
100
100
  def __init__(
101
101
  self,
102
- model_obj: models.Model = None,
103
- defaults: dict = None,
102
+ model_obj: models.Model | None = None,
103
+ defaults: dict | None = None,
104
104
  update_model=None,
105
105
  ):
106
106
  self.part_one = None
@@ -162,7 +162,7 @@ class MetaEligibility:
162
162
  @property
163
163
  def is_eligible(self: Any) -> bool:
164
164
  """Returns True if eligible else False"""
165
- return True if self.eligible == YES else False
165
+ return self.eligible == YES
166
166
 
167
167
  def check_eligibility_values_or_raise(self: Any):
168
168
  for response in [
@@ -207,7 +207,7 @@ class MetaEligibility:
207
207
  )
208
208
  else:
209
209
  status_str = format_html(
210
- "P1: {p1_eligible}<BR>" "P2: {p2_eligible}<BR>" "P3: {p3_eligible}<BR>",
210
+ "P1: {p1_eligible}<BR>P2: {p2_eligible}<BR>P3: {p3_eligible}<BR>",
211
211
  p1_eligible=self.part_one.eligible.upper(),
212
212
  p2_eligible=self.part_two.eligible.upper(),
213
213
  p3_eligible=self.part_three.eligible.upper(),
@@ -1 +1,3 @@
1
1
  from .eligibility_part_three_phase_three import EligibilityPartThreePhaseThree
2
+
3
+ __all__ = ["EligibilityPartThreePhaseThree"]
@@ -1,3 +1,5 @@
1
+ import contextlib
2
+
1
3
  from edc_constants.constants import NEG, NO, NOT_APPLICABLE
2
4
  from edc_egfr import EgfrCkdEpi
3
5
  from edc_egfr.calculators import EgfrCalculatorError
@@ -37,7 +39,7 @@ class BaseEligibilityPartThree(ScreeningEligibility):
37
39
  def assess_eligibility(self) -> None:
38
40
  if self.weight and self.height:
39
41
  self.bmi = calculate_bmi(weight_kg=self.weight, height_cm=self.height)
40
- try:
42
+ with contextlib.suppress(EgfrCalculatorError):
41
43
  self.calculated_egfr_value = EgfrCkdEpi(
42
44
  gender=self.model_obj.gender,
43
45
  age_in_years=self.model_obj.age_in_years,
@@ -45,8 +47,6 @@ class BaseEligibilityPartThree(ScreeningEligibility):
45
47
  creatinine_value=self.model_obj.creatinine_value,
46
48
  creatinine_units=self.model_obj.creatinine_units,
47
49
  ).value
48
- except EgfrCalculatorError:
49
- pass
50
50
 
51
51
  def set_fld_attrs_on_model(self) -> None:
52
52
  self.model_obj.converted_creatinine_value = self.converted_creatinine_value
@@ -89,7 +89,7 @@ class BaseEligibilityPartThree(ScreeningEligibility):
89
89
  units_to=MICROMOLES_PER_LITER,
90
90
  )
91
91
  except ConversionNotHandled as e:
92
- raise ConversionNotHandled(f"Creatinine. {e}")
92
+ raise ConversionNotHandled(f"Creatinine. {e}") from e
93
93
  if value and float(value) > 999999.9999:
94
94
  raise ConversionNotHandled("Creatinine value is absurd.")
95
95
  return value
@@ -106,7 +106,7 @@ class BaseEligibilityPartThree(ScreeningEligibility):
106
106
  units_to=MILLIMOLES_PER_LITER,
107
107
  )
108
108
  except ConversionNotHandled as e:
109
- raise ConversionNotHandled(f"FBG. {e}")
109
+ raise ConversionNotHandled(f"FBG. {e}") from e
110
110
  return value
111
111
 
112
112
  @property
@@ -121,7 +121,7 @@ class BaseEligibilityPartThree(ScreeningEligibility):
121
121
  units_to=MILLIMOLES_PER_LITER,
122
122
  )
123
123
  except ConversionNotHandled as e:
124
- raise ConversionNotHandled(f"FBG2. {e}")
124
+ raise ConversionNotHandled(f"FBG2. {e}") from e
125
125
  return value
126
126
 
127
127
  @property
@@ -136,7 +136,7 @@ class BaseEligibilityPartThree(ScreeningEligibility):
136
136
  units_to=MILLIMOLES_PER_LITER,
137
137
  )
138
138
  except ConversionNotHandled as e:
139
- raise ConversionNotHandled(f"OGTT. {e}")
139
+ raise ConversionNotHandled(f"OGTT. {e}") from e
140
140
  return value
141
141
 
142
142
  @property
@@ -151,7 +151,7 @@ class BaseEligibilityPartThree(ScreeningEligibility):
151
151
  units_to=MILLIMOLES_PER_LITER,
152
152
  )
153
153
  except ConversionNotHandled as e:
154
- raise ConversionNotHandled(f"OGTT2. {e}")
154
+ raise ConversionNotHandled(f"OGTT2. {e}") from e
155
155
  return value
156
156
 
157
157
  def set_eligible_model_field(self):
@@ -52,20 +52,19 @@ class EligibilityPartThreePhaseThree(BaseEligibilityPartThree):
52
52
  ):
53
53
  self.eligible = TBD
54
54
  self.reasons_ineligible.update(fbg_ogtt_incomplete=FBG_OGTT_INCOMPLETE)
55
- else:
56
- if self.ogtt_category == PRE_DM:
57
- self.eligible = YES
58
- elif self.ogtt_category == DM:
59
- self.eligible = NO
60
- self.reasons_ineligible.update(hi_ogtt=HI_OGTT)
61
- elif self.fbg_category == PRE_DM and self.ogtt_category == NORMAL:
62
- self.eligible = YES
63
- elif self.fbg_category == NORMAL and self.ogtt_category == NORMAL:
64
- self.eligible = NO
65
- self.reasons_ineligible.update(normal_fbg_ogtt=NORMAL_FBG_OGTT)
66
- elif self.fbg_category == DM and self.ogtt_category == NORMAL:
67
- self.eligible = NO
68
- self.reasons_ineligible.update(hi_fbg=HI_FBG)
55
+ elif self.ogtt_category == PRE_DM:
56
+ self.eligible = YES
57
+ elif self.ogtt_category == DM:
58
+ self.eligible = NO
59
+ self.reasons_ineligible.update(hi_ogtt=HI_OGTT)
60
+ elif self.fbg_category == PRE_DM and self.ogtt_category == NORMAL:
61
+ self.eligible = YES
62
+ elif self.fbg_category == NORMAL and self.ogtt_category == NORMAL:
63
+ self.eligible = NO
64
+ self.reasons_ineligible.update(normal_fbg_ogtt=NORMAL_FBG_OGTT)
65
+ elif self.fbg_category == DM and self.ogtt_category == NORMAL:
66
+ self.eligible = NO
67
+ self.reasons_ineligible.update(hi_fbg=HI_FBG)
69
68
  if self.calculated_egfr_value and self.calculated_egfr_value < 45.0:
70
69
  self.reasons_ineligible.update(egfr_low=EGFR_LT_45)
71
70
  self.eligible = NO
@@ -3,3 +3,11 @@ from .screening_part_three import ScreeningPartThreeFormValidator
3
3
  from .screening_part_two import ScreeningPartTwoFormValidator
4
4
  from .subject_refusal import SubjectRefusalFormValidator
5
5
  from .subject_screening import SubjectScreeningFormValidator
6
+
7
+ __all__ = [
8
+ "ScreeningPartOneFormValidator",
9
+ "ScreeningPartThreeFormValidator",
10
+ "ScreeningPartTwoFormValidator",
11
+ "SubjectRefusalFormValidator",
12
+ "SubjectScreeningFormValidator",
13
+ ]
@@ -16,3 +16,23 @@ from .screening_part_three_form import ScreeningPartThreeForm
16
16
  from .screening_part_two_form import ScreeningPartTwoForm
17
17
  from .subject_refusal_form import SubjectRefusalForm
18
18
  from .subject_screening_form import SubjectScreeningForm
19
+
20
+ __all__ = [
21
+ "ScreeningPartOneForm",
22
+ "ScreeningPartThreeForm",
23
+ "ScreeningPartTwoForm",
24
+ "SubjectRefusalForm",
25
+ "SubjectScreeningForm",
26
+ "calculated_fields",
27
+ "field_lists",
28
+ "part_one_fields",
29
+ "part_three_comment_fields",
30
+ "part_three_fbg_fields",
31
+ "part_three_fields",
32
+ "part_three_glucose_fields",
33
+ "part_three_ogtt_fields",
34
+ "part_three_other_fields",
35
+ "part_three_pregnancy_fields",
36
+ "part_three_vitals_fields",
37
+ "part_two_fields",
38
+ ]